Java8で「AES/CBC/PKCS5Padding」は使用可能でしょうか
Java8(Oracle)で使用可能な暗号化アルゴリズムについて
Set<String> algorithms = Security.getAlgorithms("Cipher");
で一覧が取得可能であると思っているのですが、
AES/CBC/PKCS5Padding
が一覧にありません。
ですが、
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
と指定しても暗号化/復号化できているようです。
実は一覧に表示されないだけで、AES/CBC/PKCS5Paddingを使用しても問題はないのでしょうか。
もしかしたらデフォルトのAESが使用されECBで動作しているのでは、と少し不安です。
見づらくて恐縮ですが、以下にテストで使用したコードを添付します。
//鍵長は128ビット。これより長い鍵を使用する場合、ポリシーファイルの書き換えが必要
String key = "Pfz9B2PZqKttkwta";
//暗号化ルーチンに異なる初期値を与えるためだけのもの:16バイト固定
String iv = "hhk0zZToc6MGt76h";
// private String ALGORITHM = "AES/CBC/NOPADDING";
private String ALGORITHM = "AES/CBC/PKCS5Padding";
private String CIPER = "AES";
private enum MODE {
ENCRYPT,
DECRYPT
}
public TestAes() {}
public TestAes(String key, String iv) {
this.key = key;
this.iv = iv;
}
public String encrypt(String rawData){
try {
Cipher cipher = cipherUtil(MODE.ENCRYPT);
byte[] encrypted = cipher.doFinal(rawData.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return null;
}
public String decrypt(String encryptedData){
try {
Cipher cipher = cipherUtil(MODE.DECRYPT);
byte[] decodedData = Base64.getDecoder().decode(encryptedData);
byte[] decryptData = cipher.doFinal(decodedData);
return new String(decryptData);
} catch (InvalidKeyException | InvalidAlgorithmParameterException | NoSuchAlgorithmException
| NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return null;
}
private Cipher cipherUtil(MODE mode) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), CIPER);
Cipher cipher = Cipher.getInstance(ALGORITHM);
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
int encryptMode = (mode == MODE.ENCRYPT) ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE;
cipher.init(encryptMode, secretKeySpec, ivParameterSpec);
return cipher;
}
よろしくお願いします。