128 ビット AES 暗号化をセットアップしようとしていますが、Cipher.init で例外がスローされます。
No installed provider supports this key: javax.crypto.spec.SecretKeySpec
次のコードを使用して、クライアント側でキーを生成しています。
private KeyGenerator kgen;
try {
kgen = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
kgen.init(128);
}
SecretKey skey = kgen.generateKey();
このキーは、ヘッダーとしてサーバーに渡されます。この関数を使用してエンコードされた Base64 です。
public String secretKeyToString(SecretKey s) {
Base64 b64 = new Base64();
byte[] bytes = b64.encodeBase64(s.getEncoded());
return new String(bytes);
}
サーバーはヘッダーをプルし、
protected static byte[] encrypt(byte[] data, String base64encodedKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher;
try {
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException ex) {
//log error
} catch (NoSuchPaddingException ex) {
//log error
}
SecretKey key = b64EncodedStringToSecretKey(base64encodedKey);
cipher.init(Cipher.ENCRYPT_MODE, key); //THIS IS WHERE IT FAILS
data = cipher.doFinal(data);
return data;
}
private static SecretKey b64EncodedStringToSecretKey(String base64encodedKey) {
SecretKey key = null;
try {
byte[] temp = Base64.decodeBase64(base64encodedKey.getBytes());
key = new SecretKeySpec(temp, SYMMETRIC_ALGORITHM);
} catch (Exception e) {
// Do nothing
}
return key;
}
これをデバッグするために、クライアント側で鍵を生成した後と、サーバー側で cipher.init の直前にブレークポイントを設定しました。Netbeans によると、SecretKey を構成するバイトは同一で、長さは 16 バイトです (実際、私が知る限り、オブジェクトは同一です)。
無制限の強度の JCE については認識していますが、128 ビット AES にそれが必要だったという印象はありません。
クライアント側: Java バージョン "1.6.0_26"
サーバー側: Java バージョン「1.6.0_20」
何か案は?