0

在课堂上,我们正在学习加密。我必须编写一个加密/解密程序。虽然我发现加密相当容易,但解密真的让我感到困惑。我无法理解我应该如何将导轨分开,因为在很多情况下它们的长度会不同。这很容易用 2 个轨道来解释,因为消息长度只有 2 个变化。我正在尝试修改我的代码以进行 2 轨解密,但它不起作用。谁能指出我正确的方向?如果您好奇,这是我的加密。

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)

这是我到目前为止所拥有的 - (还没有工作)

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)]

这也不起作用!

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)
4

2 回答 2

0

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

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=''))

首先,您需要知道rail的尺寸是多少。由于只有 3 条导轨(可以概括为n),如果plaintext长度是 3 的倍数,则所有导轨的尺寸相同。如果不是,第一个到 rail1,第二个到 rail2(通过两次if检查完成)。现在你有了轨道的长度。所以只要得到不同长度的子串。例如,如果您的铁轨长度为 4、3、3,那么您有不同的铁轨:

rail1 = encrypted[0:4]
rail2 = encrypted[4:7]
rail3 = encrypted[7:10]

这是由最后一行之前的行完成的,这可能看起来很神秘。现在很简单;只需从每个铁路收集一个角色并加入。最后一行可以解决问题。看看izip_longest做什么。

例子:

>>> encrypted = threeRailEncrypt("Just a naive example")
>>> decrypted = threeRailDecrypt(encrypted)
'Just a naive example' # output of decrypted
于 2013-10-02T04:28:35.900 回答
0

您只需要反转您在加密中所做的事情,因此在加密中您通过使用模 3 将它们拆分来扰乱文本。再次获取明文的最简单方法是简单地在加密上运行两次加密方法字符串,它将恢复为纯文本。

def threeRailDecrypt(crypt):
    for i in range(len(crypt)-2):
        crypt = threeRailEncrypt(crypt)
    return(crypt)
于 2013-10-02T04:16:45.820 回答