Насколько я знаю, режим CTR использует начальный вектор (IV)

насколько я знаю, режим CTR не использует начальный вектор. Он просто берет счетчик, шифрует его заданным ключом и затем выполняет операцию XOR с открытым текстом, чтобы получить зашифрованный текст.

В других режимах блочного шифрования, таких как CBC, перед шифрованием выполняется XOR открытого текста с начальным вектором.

1238] Итак, вот моя проблема. У меня есть следующий код на Java (с использованием библиотеки bouncycastle):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal("Some plaintext");

Каждый другой вызов приведенного выше кода с одним и тем же ключом дает разные результаты! Но при выполнении:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key, IV);

byte[] result = cipher.doFinal("Some plaintext");

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

Любые идеи будут очень полезны. Спасибо

8
задан skaffman 9 May 2011 в 14:54
поделиться