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