我决定用Python编写一个简单的RSA加密实现,但是每次我运行它时,它都会在解密和find_key
中打印错误IndexError: list out of range
。在
错误如下:
p 937 q 353 n 330761 phi 329472 e 5 d 264609 Traceback (most recent call last): File "rsa.py", line 94, in print dec_rsa(b, d, n) File "rsa.py", line 88, in dec_rsa char_array.append(decrypt_byte(i, d, n)) File "rsa.py", line 77, in decrypt_byte return find_key(alpha, (c**d)%n) File "rsa.py", line 67, in find_key return [k for k, v in dic.iteritems() if v == val][0] IndexError: list index out of range
代码:
^{pr2}$
我希望你喜欢学习Python!在
有几件事:
(1)你的isPrime坏了:它认为1是质数,2和3不是质数,但25、35、121、143、289、323、529、841、899都是。得到一个复合物会导致问题。在
(2)你也没查到那个p!=q
(3)你的alpha[str(byte)]应该是alpha[byte](否则你会得到“96llo,worl5”)。在
(4)你用错了乘法模逆。您需要modInverse(e,phi(n)),而不是modInverse(e,n);请参见this worked example。在
在我看来,修好这些东西之后。在
以下不是bug,而是一些建议:您可能应该使用pow(c,d,n)而不是(c**d)%n;对于较大的数字,前者会快得多。同样,如果你想把一个字母变成一个数字,而你并不在乎什么数字,你可以使用“ord”/“chr”函数,甚至不需要字典。在任何情况下,您可能需要交换字典中的键和值:现在您的find_键也可以使用列表,因为您只需搜索所有k,v对,直到找到匹配项为止。在
希望有帮助!在
相关问题 更多 >
编程相关推荐