«CBC» означает «цепной блочный шифр». Это означает, что содержимое разбивается на блоки фиксированного размера, и каждый блок зашифрован, но зашифрованная форма блока зависит от всех блоков, предшествовавших ему .
Для данного номера блока i текст шифра c_i выводится из блока открытого текста p_i следующим образом: c_i = encrypt(p_i xor c_i-1)
. (Для первого блока, вы xor с IV).
Допустим, вы шифруете три блока, вы получаете c_1, c_2 и c_3. Если вы хотите добавить к этому четвертый блок, c_4 должен быть равен encrypt(p_4 xor c_3)
, но на самом деле вы добавляете encrypt(p_4 xor IV)
.
Вам нужно добавить encrypt(p_4 xor c_3)
, вы должны восстановить последний зашифрованный блок в файле и использовать его в качестве IV для первого добавленного блока. Это должно работать нормально.
Однако, мы не обсуждали проблему заполнения. Если ваши данные не совсем делятся на блоки, последний блок будет иметь отступ в конце. Для правильного хранения данных вы должны расшифровать последний блок (который будет простым декодированием блока с использованием вашего ключа и зашифрованного текста предпоследнего блока вместо IV) и удалить его из файла. Добавьте новые данные к этому расшифрованному блоку, а затем добавьте, как указано выше.