RSA暗号化を使用してopenSSLでデータを暗号化していますが、これは正常に機能します。 RSAについての私の理解は、同じ公開鍵で同じデータを暗号化すると常に同じ結果が得られるということです( ここで述べたように または ここで )。
ただし、opensslを使用すると、暗号化を繰り返すたびに異なる結果が得られます。例えば:
➜ ~ echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin | shasum
11b6e058273df1ebe0be5e0596e07a6c51724ca0 -
➜ ~ echo '30' | openssl rsautl -encrypt -inkey pub.pem -pubin | shasum
05cb82595f7429ef196189f4e781088597d90eee -
では、なぜ出力が一意ではないのですか?これは、RSA暗号化が間違っているためか、opensslがさらに魔法をかけているためですか?
実際には、RSA暗号化データのみを格納するデータベースを設計しようとしています。暗号化された情報のハッシュサムを検索したいのですが、暗号化手順自体が一意でないと不可能です。
安全なRSA暗号化は、ランダム性を含む適切なパディング方式で実装されます。詳細は PKCS#1 または [〜#〜] oaep [〜#〜] を参照してください。
RSA暗号化は、「0」とランダムビットの文字列が埋め込まれたメッセージを暗号化します。このプロセスでは、ランダムな文字列は、暗号ハッシュおよびXORによって暗号文に「隠されます」。復号化時に、RSA復号化は暗号文からランダムな文字列を復元し、それを使用してメッセージを復元します。これが、同じテキストメッセージに対してopenssl rsautlで異なる結果を得る理由です。
はい、分かりました。 RSA自体は確定的です。ただし、セキュリティを強化し、攻撃者が暗号化された情報を推測できないようにするために、暗号化は純粋な「データ」ではなく、「データ」+「何らかのランダムパターン」で行われます( Wikipediaより慎重に )