18283
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;
    }
    
```

よろしくお願いします。
CC BY-SA 3.0
2015-10-31T09:50:28.570
18271
2015-10-31T17:57:39.253
13058
question
java security
Java8で「AES/CBC/PKCS5Padding」は使用可能でしょうか
使用可能です。  
なぜならばhttp://docs.oracle.com/javase/jp/8/api/javax/crypto/Cipher.htmlに  
「Javaプラットフォームの実装は、すべて次の標準のCipher変換とカッコ内の鍵サイズをサポートする必要があります。」とあり、"AES/CBC/PKCS5Padding"は含まれています。

Security.getAlgorithms(serviceName)で返されるのは「アルゴリズムや型の名前(Signature、MessageDigest、Cipher、Mac、KeyStoreなど)」ということですので、「フィードバック・モードおよびパディング方式」は含まれないのかと思います。
CC BY-SA 3.0
2015-10-31T17:57:39.253
18283
2015-10-31T17:57:39.253
13060
18271
answer