Я пытаюсь использовать JDK 1.7 JCE (Windows 7 x64) для выполнения Single DES-шифрования с CBC на небольшом блоке. Каждый раз, когда я запускаю программу ниже, я получаю разные результаты. Ключ тот же, данные одни и те же, что может быть неправильно?
public class CBCTest {
public static void main(String[] args) throws Exception {
Cipher cc = Cipher.getInstance("DES/CBC/NoPadding");
Key k = new SecretKeySpec(new byte[] {1,1,1,1,1,1,1,1}, "DES");
cc.init(Cipher.ENCRYPT_MODE, k);
byte[] data = new byte[]{1,2,3,4,5,6,7,8};
cc.doFinal(data);
System.out.println("Encrypted: " + Arrays.toString(cc.doFinal(data)));
}
}
Изменение: изменение режима шифрования в ECB "DES/CBC/NoPadding"
работает без проблем.
Для режима CBC есть еще один вход, а именно IV (вектор инициализации). Обязательно используйте один и тот же IV для каждого прогона, после чего вы получите идентичный результат.
Подробную информацию см. В документации.
Btw. неплохо использовать случайный IV, это гарантирует, что каждый раз зашифрованный текст возникает, если одно и то же сообщение отправляется несколько раз. Это особенно важно, если количество возможных сообщений невелико. Это делает намного сложнее для подслушивающего устройства угадать значение определенного битового шаблона.