web-dev-qa-db-ja.com

RSA暗号化テキストが同じテキストに対して異なる結果をもたらすのはなぜですか

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暗号化データのみを格納するデータベースを設計しようとしています。暗号化された情報のハッシュサムを検索したいのですが、暗号化手順自体が一意でないと不可能です。

43
psibar

安全なRSA暗号化は、ランダム性を含む適切なパディング方式で実装されます。詳細は PKCS#1 または [〜#〜] oaep [〜#〜] を参照してください。

RSA暗号化は、「0」とランダムビットの文字列が埋め込まれたメッセージを暗号化します。このプロセスでは、ランダムな文字列は、暗号ハッシュおよびXORによって暗号文に「隠されます」。復号化時に、RSA復号化は暗号文からランダムな文字列を復元し、それを使用してメッセージを復元します。これが、同じテキストメッセージに対してopenssl rsautlで異なる結果を得る理由です。

61
Chiara Hsieh

はい、分かりました。 RSA自体は確定的です。ただし、セキュリティを強化し、攻撃者が暗号化された情報を推測できないようにするために、暗号化は純粋な「データ」ではなく、「データ」+「何らかのランダムパターン」で行われます( Wikipediaより慎重に

11
psibar