このコードの何が問題になっているのか誰か知っていますか?
Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
- アルゴリズム:AES
- 動作モード:ECB(ブロックサイズを指定するために128が追加されています)
- PaddingSchemce:PKCS5Padding
これは私には正しいように思えますが、インスタンス化中に「そのようなアルゴリズムはありません」という例外をスローし続けます。
このコードの何が問題になっているのか誰か知っていますか?
Cipher cipher = Cipher.getInstance("AES/ECB128/PKCS5Padding", "SunJCE");
これは私には正しいように思えますが、インスタンス化中に「そのようなアルゴリズムはありません」という例外をスローし続けます。
クラスパスにストックJDKしか含まれていないので、このコードスニペットを実行し、出力でAESをgrepしました。
for (Provider provider: Security.getProviders()) {
System.out.println(provider.getName());
for (String key: provider.stringPropertyNames())
System.out.println("\t" + key + "\t" + provider.getProperty(key));
}
私はこの行を見ました:
Cipher.AES SupportedPaddings NOPADDING|PKCS5PADDING|ISO10126PADDING
それはあなたのパディングがサポートされていることを私に示唆しています。
私もこの行を見ました:
Cipher.AES SupportedModes ECB|CBC|PCBC|CTR|CTS|CFB|OFB|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128
ここにECBが表示されているのに気づきましたが、ECB128は表示されていないので、それが問題なのかと思います。この情報が正しい方向に進んでいるかどうかを知るのに十分な知識がないことを告白します。
追加のために編集:ECB128の代わりにECBでCipher.getAlgorithm( "AES / ECB / PKCS5Padding")を呼び出すことができます。ECBでは、少なくともここで利用できるものでは、ブロックサイズを指定できないように見えます。これで十分かどうかわからない。
AESの静的ブロックサイズは128ビット(または16バイト)です。AESの作成に使用された暗号であるRijndaelには、複数のブロックサイズがあります。キーのサイズは、メソッドの呼び出し中にキーが構成されたときに自動的に取得されますinit
。
モードの背後にあるビットは、暗号のブロックサイズを構成するために使用されません。これらは、暗号フィードバック(CFB)モードの動作のフィードバックサイズを構成するために使用されます。これは、特にブロック暗号化のすべてのビットが使用されていない場合は特に、今ではかなりあいまいなモードになっています。公式にはOFBモードにも使用できますが、小さいフィードバックサイズを指定するとセキュリティ上の問題が発生する可能性があります。レガシープロトコルのサポートを提供するために、両方のモードを予約する必要があります。
"CFB"
使用する場合、または文字列の背後にある値"OFB"
は0より大きく、8刻みのブロックサイズ以下である必要があります。この数値はフィードバックビットの数として指定され、ほとんどの暗号化APIと同様に、JavaのJCEはバイトの処理に制限されます。 。
SunJCEプロバイダーは多少制限されています。代わりにBouncyCastleJCEプロバイダーを使用してみてください(http://www.bouncycastle.org/)。