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からのものです
これらの大きな整数を使用した計算が希望どおりに実行されるようにするにはどうすればよいですか (また、結果が切り捨てられたり間違ったりしないようにします)。