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がモジュロよりも大きいプレーンテキストを処理する方法を意味しているのではないでしょうか?一緒ですか?私は推測しています...

1
neubert

引用 https://stackoverflow.com/a/32166210/569976

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実装を使用して単一のブロックのみを暗号化できます。

1
neubert