解密3轨加密

时间:2013-10-02 03:56:40

标签: python

在课堂上,我们正在学习加密。我必须写一个加密/解密程序。虽然我发现加密相当容易,但解密真的让我感到困惑。我无法绕过我应该如何分开导轨,因为在很多情况下它们会有不同的长度。这很容易用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)

2 个答案:

答案 0 :(得分:0)

您只需要反转您在加密中执行的操作,因此在加密中,您可以通过使用模3分割文本来加密文本。 重新获得明文的最简单方法是在加密字符串上运行加密方法两次,然后返回纯文本。

def threeRailDecrypt(crypt):
    for i in range(len(crypt)-2):
        crypt = threeRailEncrypt(crypt)
    return(crypt)

答案 1 :(得分: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检查avobe完成)。现在你有了长度的轨道。所以只需获得不同长度的子串。例如,如果您将导轨的长度设置为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