为了实现 RSA 加密(个人娱乐,仅此而已),我编写了代码来生成伪随机素数、公钥/私钥等。当编码文本为 ~10^12 或更小的整数时,我能够成功地对文本进行编码、生成公钥/私钥、加密、解密和解码。例如
original message: hello
plaintext equivalent: 448378203247
public key: (540594823829, 65537)
private key: (540594823829, 261111754433)
ciphertext: 63430225682
解密密文成功返回原始明文。
但是,当我的编码文本是一个较大的整数时,该过程将失败。例如
original message: a man a plan a canal panama
plaintext equivalent: 39955594125525792198857762901926727877852838348601974063966023009
public key: (662173326571, 65537)
private key: (662173326571, 29422219265)
ciphertext: 429717871098
在这种情况下,密文比明文小得多,这让人怀疑加密过程中出现了问题。果然,我解密了密文,得到了 58514793315(显然不是原始明文)。
我在想问题是 Python 如何用大数实现大数/计算,以及我不知道如何处理这一事实。我的代码加密/解密的价值很简单
pow(m, e, n) # plaintext, encryption exponent, modulus
pow(c, d, n) # ciphertext, decryption exponent, modulus
编码文本的代码来自 http://gist.github.com/barrysteyn/4184435#file_convert_text_to_decimal.py
如何确保使用这些大整数进行计算(并且不会导致答案被截断/不正确)?