О, это просто. Этот идиотский c (но, как ни странно, в большинстве случаев кажется правильным) метод шифрования файлов с использованием CB C хранит IV в отдельном файле, перезаписывая любой старый. Таким образом, если вы перезаписаете или возьмете неверный файл IV, вы получите 16 случайных байтов в начале после расшифровки. Поэтому, если вы не найдете файл IV, который, как мы надеемся, имеет смысл, ваши первые 16 байтов (/ символов) теперь будут потеряны навсегда.
Конечно, любая нормальная программа шифрования хранит соль (пароль и PBKDF2 используются для ключ) и IV в том же файле, что и зашифрованный текст.
Тем не менее, если вам удастся потерять солт-файл или пароль, все данные будут потеряны, так что есть ...
С добавленным кодом проблема становится еще яснее. В режиме шифрования вы забыли создать и использовать IvParameterSpec
полностью во время инициализации:
cipher.init(Cipher.ENCRYPT_MODE, secret);
однако из-за способа чтения данных IV вы не получите никакого предупреждения о том, что переменная не используется:
ivFis.read(iv);
Если бы вы создали хороший метод, такой как IvParameterSpec iv = readIvFromFile()
, вы бы поймали эту ошибку.
Обратите внимание, что Java ( по умолчанию во включенном провайдере для Cipher
) используется полный ноль, поэтому вам повезло, и ваши данные частично не исчезли.