Действительно ли AES/CBC требует параметра IV?


Я пишу простое приложение для шифрования моего сообщения с помощью AES / CBC (mode). Как я понимаю, режим CBC требует параметра IV, но я не знаю, почему мой код работает без параметра IV. Кто-нибудь может объяснить почему? Спасибо.

Зашифрованное сообщение печатается: T9KdWxVZ5xStaisXn6llfg= = без исключения.

public class TestAES {

public static void main(String[] args) {

    try {
        byte[] salt = new byte[8];
        new SecureRandom().nextBytes(salt);

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec keySpec = new PBEKeySpec("myPassword".toCharArray(), salt, 100, 128);

        SecretKey tmp = keyFactory.generateSecret(keySpec);
        SecretKeySpec key = new SecretKeySpec(tmp.getEncoded(), "AES");

        Cipher enCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        enCipher.init(Cipher.ENCRYPT_MODE, key);

        // enCipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));

        byte[] cipherBytes = enCipher.doFinal("myMessage".getBytes());
        String cipherMsg = BaseEncoding.base64().encode(cipherBytes);

        System.out.println("Encrypted message: " + cipherMsg);

    } catch (Exception ex) {
        ex.printStackTrace();
    }

}
}
1 3

1 ответ:

, когда он используется без IV, для некоторых типов шифров, включая AES, он неявно использует 0 ИЖ. Увидеть класс шифр документы.

Недостаток нулевого IV (или детерминированного IV) состоит в том, что он уязвим для атак по словарю. Требование к IV состоит в том, чтобы не допустить, чтобы один и тот же блок обычного текста производил один и тот же зашифрованный текст каждый раз.