CipherOutputStream и FileOutputStream (someFile, true) приводят к мусору при добавлении данных - PullRequest
1 голос
/ 02 февраля 2011

Я шифрую данные в Android с помощью CipherOutputStream через BufferedOutputStream в FileOutputStream (someFile, true) Я использую «AES / CBC / NoPadding» для настройки шифра. На данный момент постоянный IV и ключ. Я расшифровываю данные на Mac. Кодирование и декодирование хорошо работает в этой настройке.

Но когда я снова открываю зашифрованный файл и добавляю зашифрованные данные, я получаю искаженные данные в начале раздела добавленных данных. Может ли это быть проблемой какого-то минимального размера блока для шифрования данных?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

«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) и удалить его из файла. Добавьте новые данные к этому расшифрованному блоку, а затем добавьте, как указано выше.

1 голос
/ 02 февраля 2011

Когда вы добавляете, вы создаете новый экземпляр Cipher и инициализируете его IV, с которым вы начали, когда создавали файл? Это не сработает.

Если вы создаете новый экземпляр Cipher для добавления, вам нужно установить его IV как последний блок зашифрованного текста в файле.

В CBC предыдущий текстовый блок шифра - это XOR с обычным текстом перед шифрованием. В начале файла отсутствует «предыдущий текстовый блок шифра», поэтому вы создаете его: IV. Но все последующие блоки имеют предыдущий блок, и вам нужно использовать его как «IV», если вы добавляете данные в середине потока.

...