web-dev-qa-db-ja.com

RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDINGの分類

JavaにはRSA/ECB/OAEPWITHSHA-256ANDMGF1PADDINGというモードがあります。それは一体何の意味ですか?

RFC3447公開鍵暗号化標準(PKCS)#1:RSA暗号化仕様バージョン2.1、セクション7.1.2復号化操作は、RSAES-OAEP-DECRYPTの両方のオプションがハッシュとMGFであると述べています。 MGFは独自の関数であり、セクションB.2.1 MGF1で定義されており、独自のハッシュ「オプション」も持っています。

RSAES-OAEP-DECRYPTとMGF1のハッシュの「オプション」は同じであると思われるか、そうでないかもしれませんが、私にはわかりません。もしそうなら、あなたがRSA/ECB/OAEPWITHSHA-256ANDMGF1PADDINGを持っているときは、両方にsha256を使用する必要があることを意味します。しかし、それらが同じであると想定されていない場合は、RSAES-OAEP-DECRYPTにsha256を使用し、たとえばMGF1にsha1を使用することができます。その場合、sha256はどの機能に使用されることになっていますか?そして、他の関数にはどのハッシュアルゴリズムが使用されることになっていますか?

そして、この文脈でECBはどういう意味ですか? ECBは対称ブロック暗号モードです。電子コードブック。多分それはJavaがモジュロより大きいプレーンテキストをどのように扱うか?一緒ですか?私は推測しています...

17
neubert

OAEPのデフォルトでは、MGF1にSHA-1を使用します。選択したハッシュは、OAEPのセキュリティにそれほど影響を与えないことに注意してください。そのため、ほとんどの場合、このデフォルトのままにしておきます。

"OAEPPadding"およびOAEPParameterSpecに対してテストすることで、これを簡単にテストできます。

// --- we need a key pair to test encryption/decryption
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024); // speedy generation, but not secure anymore
KeyPair kp = kpg.generateKeyPair();
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic();
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate();

// --- encrypt given algorithm string
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey);
byte[] ct = oaepFromAlgo.doFinal("owlstead".getBytes(StandardCharsets.UTF_8));

// --- decrypt given OAEPParameterSpec
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
byte[] pt = oaepFromInit.doFinal(ct);
System.out.println(new String(pt, StandardCharsets.UTF_8));

パラメータとしてMGF1を"SHA-256"に置き換えると、コードはパディング関連の例外で失敗します。

拡張アルゴリズムがまったく必要な理由は、他のCipherアルゴリズムとの互換性です。例えばのために書かれたコード"RSA/ECB/PKCS1Padding"は、OAEPパラメーターはもちろん、パラメーターを使用しません。したがって、より長い文字列がないと、OAEPはドロップイン交換として機能できません。


操作モード"ECB"は、このコンテキストでは何も意味しません。"None"であるか、完全に省略されている必要があります。 SunRSAプロバイダーのRSA実装を使用して単一のブロックのみを暗号化できます。

さらに多くのデータを暗号化する場合は、ランダム(AES)対称鍵を作成し、OAEPを使用して暗号化します。次に、AESキーを使用して特定のデータを暗号化します。これは、データを暗号化するために非対称プリミティブと対称プリミティブの両方を使用するため、ハイブリッド暗号システムと呼ばれます。


OAEPはJDK 7(1.7)以前ではサポートされていないことに注意してください。 JavaランタイムJava 8:

  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding(1024、2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding(1024、2048)

SHA-1はこの種の目的に対して直接脆弱ではない場合でも、SHA-1はほとんどの用途で非推奨になっているため、一部のプロトコルではパディング内でSHA-256またはSHA-512を使用する必要があります。

36
Maarten Bodewes