我的Vigenere密码程序全部归结为两个列表。一个ASCII数字列表,表示要加密/解密的消息的字符,另一个是用于解密/加密消息的密钥的ASCII编号列表。
加密:
encryption = [((x + y) % 26) + ord('A') if x < 128 else x for x, y in zip(msglist, keylist)]
解密:
encryption = [((x - y) % 26) + ord('A') if x < 128 else x for x, y in zip(msglist, keylist)]
如果我输入&#39; Python&#39;用钥匙&#39;爱&#39;加密我得到:
GYAXLN
不幸的是,当我尝试解密GYAXLN&#39;使用相同的密钥:
PEZNUT
这不应该是什么。我认为我的数学有些不对劲但是我能够做到这一点并且到现在为止已经尝试了不同的数字来看看哪些有用(我不是数学上最好的)。我在这里错过了什么?是不是所有都可以在列表理解中完成?
答案 0 :(得分:2)
问题出现在(x - y) % 26
语句中,因为数字的mod是从0到m-1定义的,在上面的情况下是0到25,但是在减去你的时候得到负数,所以为了得到正确的结果你应该这样做(x - y + 26) % 26
。如果(x-y)
得到的负值低于&#34; -m&#34;在上面的情况下低于-26,那么no仍然是负数,那么你必须使它为正,这是伪代码:
val = (x - y) % 26
while(val < 0) val += 26
val = val % 26