0

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からのものです

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

4

1 に答える 1

3

メッセージをブロックに分割せずに、RSA でモジュラスより小さいメッセージのみを暗号化できます。プログラミングの演習としてこれを行っている場合は、モジュラスよりも大きなものを暗号化しようとしないでください。これを実際の暗号化として行っている場合は、しないでください。暗号ライブラリを取得します。独自の暗号化を行うことは、災害のレシピです。

于 2013-07-23T21:01:33.553 に答える