このコードは、無効なAESキーの長さエラーを示します。どうすれば修正できますか? (128ビットキーのAES暗号化が必要です)
package org.temp2.cod1;
import Java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import Java.io.*;
public class Code1 {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
String s = "9882623867";
byte[] plaintext = s.getBytes("UTF-16");
String s2 = "supernova";
byte[] key = s2.getBytes("UTF-16");
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k = new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(plaintext);
System.out.println(encryptedData);
}
}
助けていただければ幸いです
SecretKeyFactory
を使用してパスワードからキーバイトを取得します。詳細な例を参照できます here。 256ビットではなく128ビットキーのキー長を指定する必要があることに注意してください。その例に示すように。
次に遭遇する問題は、パディング方式を指定していないことです。メッセージが16バイトの倍数(AESブロックサイズ)でない限り、エラーが発生します。例に示すように、PKCS5Paddingを使用します。
暗号でCBCモードを使用するには、各メッセージに対して新しい初期化ベクトルを選択する必要があります。この一意のIVは、暗号化されたメッセージとともに受信者に送信する必要があります。
ここで取り上げた概念(およびそれ以上)を完全に理解せずに暗号化を実行しようとすると、システムが安全でなくなる可能性があります。
通常、AESのようなブロック暗号では、任意のキーの長さ(ここでは「スーパーノバ」で実行しているような)は使用できません。選択したアルゴリズムに適した、サポートされているキー長(128、192、256など)を使用する必要があります。
これを行う一般的な方法の1つは、パスフレーズをハッシュ化し(たとえば、SHAを介して)、最初のNバイトを抽出することです。これは、パスフレーズが同じであっても2人のユーザーの「キー」が同一にならないように初期化値でパスワードを「ソルト」できるため、とにかく優れています。このようなものに本当に興味があるなら、独創的な仕事は ブルース・シュナイアーによる応用暗号 です。
実際の実装の詳細については、 see
使用しようとしているキーが適切な長さでない場合、このエラーが発生する可能性があります。
擬似コードでは、次のようなことを試みています:
String key = "123";
SecretKeySpec k = new SecretKeySpec(key, "AES");
しかし、キーは短すぎます-31文字の長さのようなものである必要があります。
キー値を確認してください->おそらくどこかに間違って保存されています。