2013-10-02 51 views
0

在课堂上,我们正在学习加密。我必须编写一个加密/解密程序。虽然我发现加密相当容易,但解密让我很困惑。我无法将我的头围绕在我应该如何分开铁轨上,因为有很多情况下他们会有不同的长度。使用2个导轨可以轻松解决这个问题,因为消息长度只有2个变量。我试图修改我的代码2导轨解密,但它只是没有工作。任何人都可以将我指向正确的方向吗?如果你好奇,这是我的加密。解密3导轨加密

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) 
+0

[三条铁路解密]的可能重复(http://stackoverflow.com/questions/19148729/three-rail-decrypt) – ixe013

回答

0

你就只能通过再次分裂他们与模3 最简单的方式来获得明文扭转你的加密做什么,所以在加密你争我夺的文字是简单地运行加密字符串上的加密方法两次,它将回到纯文本。

def threeRailDecrypt(crypt): 
    for i in range(len(crypt)-2): 
     crypt = threeRailEncrypt(crypt) 
    return(crypt) 
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='')) 

首先,你需要知道什么是你铁路 S的尺寸。由于只有3个导轨(可推广到n),如果长度为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 
+0

我不认为我明白你正在尝试说 – user2807779