我目前正在做家庭作业,我们必须建立一个功能,我们制作一个三步加密/解密程序。我们必须构建的密码之一是转置/轨道围栏,它将变量(n)作为一些“轨道”,您希望将消息加密。我已经构建了加密,但是我我失去了解密方法。
这是针对python的介绍级别类,因此除了下面包含的加密代码之外,我们不太了解基础知识。
如果您不确定我的意思是转置加密/铁路围栏就是一个例子......
Message = abcdefg
n = 3
它最终被加密成3组(如n所示),这些组将是"adg be cf"
,然后加密将它们重新组合成一个字符串"adgbecf"
。我的麻烦是将它们分解为原始的三个"adg be cf"
字符串,然后将它们转换回原始值。
加密:
def trans_encrypt(message, n):
cipher = ""
for i in range(n):
for j in range(i, len(message), n):
cipher = cipher + message[j]
return cipher
当前解密(不起作用):
def trans_decrypt(cipher, n):
length = len(cipher) // n
message = ''
for i in range(length):
for j in range(n):
letter = (i + j * length)
message = message + cipher[letter]
return message
答案 0 :(得分:3)
如果你的加密方法是正确的,(有人评论说这不是轨道密码),则以下情况属实:
您可以像这样进行加密:
>>> def trans_encrypt(message,n):
... return "".join([message[i::n] for i in range(n)])
...
>>> trans_encrypt(a,3)
'adgbecf'
我会给你一个关于你的解密的提示:
>>> b = 'adgbe cf '
>>> trans_encrypt(b,3)
'abcdefg '
我在“加密”字符串中插入了空格,只是在“加密”字符串上使用了加密方法来解密它。我得到了正确的结果,最后有一些额外的预期空间。
我会让你弄清楚如何计算添加空格的位置,因为这是作业。
您的解密方法只能修改消息(插入空格),调用加密方法,并删除尾随空格。
答案 1 :(得分:1)
问题是密码不一定能被n整除,因此加密函数创建的'bins'的长度不一样。第一个len(密码)%n个分箱有一个额外的字母。
当您在decrypt函数中迭代j时,如果i小于len(密码)%n,则范围应为n + 1.