2013-10-02 52 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