在课堂上,我们学习了加密。我必须写一个加密/解密程序。虽然我发现加密相当容易,但解密真的让我感到困惑。我不能绕过我的头,我应该如何拆分轨道,因为有许多情况,他们将是不同的长度。使用2 rails很容易解释这一点,因为消息长度只有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)发布于 2013-10-02 12:16:46
你只需要逆转你在加密中所做的事情,所以在加密中,你通过以3为模对文本进行拆分来扰乱文本。重新获得明文的最简单的方法是只需在加密的字符串上运行加密方法两次,它将返回到明文。
def threeRailDecrypt(crypt):
for i in range(len(crypt)-2):
crypt = threeRailEncrypt(crypt)
return(crypt)发布于 2013-10-02 12:28:36
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=''))首先,你需要知道你的轨道的大小,因为只有3个轨道(可以推广到n),如果plaintext长度是3的倍数,那么所有的轨道都是相同的大小。如果不是,则第一个转到rail1,第二个转到rail2 (由两个if检查avobe完成)。现在,您有了轨道的长度。所以只需要得到不同长度的子串。例如,如果rails的长度为4、3、3,则不同的rails为:
rail1 = encrypted[0:4]
rail2 = encrypted[4:7]
rail3 = encrypted[7:10]这是通过最后一行之前的行完成的,这可能看起来很神秘。现在它很简单;只需从每个rail中收集一个字符并连接。最后一行可以解决这个问题。看看izip_longest是怎么做的。
示例:
>>> encrypted = threeRailEncrypt("Just a naive example")
>>> decrypted = threeRailDecrypt(encrypted)
'Just a naive example' # output of decryptedhttps://stackoverflow.com/questions/19129751
复制相似问题