Python 解密

3 投票
2 回答
4651 浏览
提问于 2025-04-16 16:12

我现在正在做一个作业,我们需要写一个程序,完成三步的加密和解密。其中一个加密方法是换位加密/铁路栅栏加密,它需要一个变量(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

2 个回答

1

问题在于,密码(cipher)不一定能被 n 整除,所以你用加密函数创建的“箱子”(bins)并不是长度都一样的。前面 len(cipher)%n 个箱子会多一个字母。

当你在解密函数中循环 j 的时候,如果 i 小于 len(cipher)%n,范围应该是 n+1。

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  '

我在“加密”的字符串中插入了空格,然后直接对这个“加密”的字符串使用加密方法来解密。我得到了正确的结果,只是最后多了一些预期的空格。

我就不告诉你怎么计算在哪里加空格了,因为这是你的作业。

你的解密方法可以简单地修改消息(插入空格),调用你的加密方法,然后去掉末尾的空白。

撰写回答