Шифрование Java DES с CBC дает разные результаты при каждом запуске

1

Я пытаюсь использовать 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" работает без проблем.

Теги:
encryption
cryptography
des

1 ответ

1
Лучший ответ

Для режима CBC есть еще один вход, а именно IV (вектор инициализации). Обязательно используйте один и тот же IV для каждого прогона, после чего вы получите идентичный результат.

Подробную информацию см. В документации.

Btw. неплохо использовать случайный IV, это гарантирует, что каждый раз зашифрованный текст возникает, если одно и то же сообщение отправляется несколько раз. Это особенно важно, если количество возможных сообщений невелико. Это делает намного сложнее для подслушивающего устройства угадать значение определенного битового шаблона.

  • 0
    В моем случае я хочу тот же IV, так что простое добавление его в вызов init делает свое дело.
  • 0
    На самом деле очень плохая идея использовать статический IV. Это в значительной степени побеждает цель режима CBC по сравнению с режимом ECB.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню