2

RSA_size(rsa)私のアプリケーションでは256に等しいモジュラスを返します。オプションでデータを暗号化しているRSA_PKCS1_OAEP_PADDINGため、送信される入力バッファの最大長RSA_public_encrypt()は 256 - 41 = 215 です。

場合によっては、入力バッファーの長さが 215 の制限を少し超えることがあるため、複数回呼び出す必要がありますRSA_public_encrypt()

の戻り値について質問ですRSA_public_encrypt()

私のテストから、戻り値は 256 (に等しいRSA_size(rsa)) であり、ドキュメントにも次のように記載されています。

RSA_public_encrypt() は、暗号化されたデータのサイズ (つまり、RSA_size(rsa)) を返します。

の戻り値の可能性が 2 つだけであることを確認したいだけです RSA_public_encrypt()

-1 (エラー)またはモジュラス(成功)であり、他に可能性はありません。RSA_private_decrypt()暗号化されたバッファを分割し、ブロックごとに呼び出す必要があるため、興味があります。それぞれの暗号化されたバッファがRSA_public_encrypt同じ場合、それぞれのサイズを保存する必要はありません。

4

2 に答える 2

11

RSA_public_encrypt()の(正の)戻り値は、PKCS#1暗号化の現在の既知のすべてのモードのRSA_size(rsa)と常に同じになります。

つまり、現在の仮定は正しいのです。

ただし、実際には、RSA_size(rsa)より大きいデータがあり、それをブロックに分割する場合は、ランダム対称キーを使用してデータを暗号化し、RSA_public_key()を使用してそのキーを暗号化することを検討する必要があります。RSA公開鍵暗号化は、より大きなデータブロックで使用されることを意図したものではありません。

RSA_size(rsa)-XXよりも大きいものを暗号化するための最良の方法(XXは使用されるPKCS#1モードに依存します):

  • 16バイトのランダムIVを生成します(一意である必要があります)
  • 32バイト(256ビット)のランダムキーKを生成します
  • AES-CBC(パディングについて考えてください)またはAES-CTRを使用してKおよびIVでデータをE-DATAに暗号化します
  • 暗号化されたデータE-DATAをSHA-256(または状況に適したハッシュアルゴリズム)でハッシュHにハッシュします
  • RSA公開鍵IV、鍵K、およびハッシュHIVも公開できますが、多くの場合、これは簡単です)を使用してE-RSAに暗号化します。
  • 暗号化されたデータE-DATAと暗号化されたキーデータE-RSAを反対側に送信します

反対側:

  • E-RSAIVK、およびHに復号化します(失敗した場合はベイルアウトします)
  • E-DATAをハッシュし、 Hで確認します(失敗した場合はベイルアウトします)
  • IVKでE-DATAを復号化する
  • 終わり..
于 2012-12-17T07:50:03.547 に答える
0

RSA_encrypt() の出力には先頭のゼロ ビットが含まれる可能性があり、openssl がそれらを保持するかどうかはわかりません。それらをカットすると、出力が 1 バイト短くなります。これはまれに発生する可能性があります。

入力が少しだけ大きい場合は、RSA キーのサイズを大きくしないのはなぜですか? 2536 ビットの RSA キー、または 3072 ビットなど、その他のものを使用できます。

于 2012-12-17T09:31:09.447 に答える