首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解密3轨加密

解密3轨加密
EN

Stack Overflow用户
提问于 2013-10-02 11:56:40
回答 2查看 881关注 0票数 0

在课堂上,我们学习了加密。我必须写一个加密/解密程序。虽然我发现加密相当容易,但解密真的让我感到困惑。我不能绕过我的头,我应该如何拆分轨道,因为有许多情况,他们将是不同的长度。使用2 rails很容易解释这一点,因为消息长度只有2个变化。我试图修改我的代码为2轨解密,但它就是不工作。有谁能给我指个方向吗?这是我的加密,如果你好奇的话。

代码语言:javascript
复制
def threeRailEncrypt(plaintext):
    ciphertext=""
    rail1=""
    rail2=""
    rail3=""

    for i in range(len(plaintext)):
        if i%3 == 0:
            rail1=rail1+plaintext[i]
        elif i%3 == 1:
            rail2=rail2+plaintext[i]
        else:
            rail3=rail3+plaintext[i]

    ciphertext=rail1+rail2+rail3

    return(ciphertext)

这是我到目前为止所做的-(还不能工作)

代码语言:javascript
复制
def threeRailDecrypt(msg):
    if len(msg)%3==0:
        third=len(msg)//3
        rail1=msg[:third]
        rail2=msg[third:third*2]
        rail3=msg[third:]
        dm=""
        for i in range(third):
            dm=dm+rail1[i]
            dm=dm+rail2[i]
            dm=dm+rail3[i]
    return(dm)]

这也不起作用!

代码语言:javascript
复制
def threeRailDecrypt(msg):
    railLen=len(msg)//3
    dm=""
    for col in range(railLen):
        for rail in range(3):
            nextLetter=(col+rail*railLen)
            dm=dm+msg[nextLetter]
    return(dm)
EN

回答 2

Stack Overflow用户

发布于 2013-10-02 12:16:46

你只需要逆转你在加密中所做的事情,所以在加密中,你通过以3为模对文本进行拆分来扰乱文本。重新获得明文的最简单的方法是只需在加密的字符串上运行加密方法两次,它将返回到明文。

代码语言:javascript
复制
def threeRailDecrypt(crypt):
    for i in range(len(crypt)-2):
        crypt = threeRailEncrypt(crypt)
    return(crypt)
票数 0
EN

Stack Overflow用户

发布于 2013-10-02 12:28:36

Spydon已经解释了该怎么做。我只是给出了一个实现。看看这个:

代码语言:javascript
复制
from itertools import izip_longest
def threeRailDecrypt(encrypted):
    remainder = len(encrypted) % 3
    rail_lengths = [len(encrypted) / 3] * 3

    if remainder > 1: rail_lengths[1] += 1
    if remainder > 0: rail_lengths[0] += 1

    rails = [encrypted[sum(rail_lengths[:i]) : sum(rail_lengths[:i+1])] for i in range(3)]
    return ''.join(''.join(t) for t in izip_longest(*rails, fillvalue=''))

首先,你需要知道你的轨道的大小,因为只有3个轨道(可以推广到n),如果plaintext长度是3的倍数,那么所有的轨道都是相同的大小。如果不是,则第一个转到rail1,第二个转到rail2 (由两个if检查avobe完成)。现在,您有了轨道的长度。所以只需要得到不同长度的子串。例如,如果rails的长度为4、3、3,则不同的rails为:

代码语言:javascript
复制
rail1 = encrypted[0:4]
rail2 = encrypted[4:7]
rail3 = encrypted[7:10]

这是通过最后一行之前的行完成的,这可能看起来很神秘。现在它很简单;只需从每个rail中收集一个字符并连接。最后一行可以解决这个问题。看看izip_longest是怎么做的。

示例:

代码语言:javascript
复制
>>> encrypted = threeRailEncrypt("Just a naive example")
>>> decrypted = threeRailDecrypt(encrypted)
'Just a naive example' # output of decrypted
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19129751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档