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がモジュロよりも大きいプレーンテキストを処理する方法を意味しているのではないでしょうか?一緒ですか?私は推測しています...
引用 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実装を使用して単一のブロックのみを暗号化できます。