У вас есть два варианта (и здесь я описываю только процесс шифрования, но дешифрование похоже):
Используйте потоковый шифр (например, AES-CTR)
Вы инициализируете шифр 16-байтовым ключом и истинно случайным 16-байтовым одноразовым номером, записываете nonce, загружаете первый фрагмент, шифруете его, записываете результат, загружаете второй фрагмент и так далее.
Обратите внимание, что вы должны инициализировать шифр только один раз. Размер куска может быть произвольным;
оно даже не должно быть одинаковым каждый раз.
Используйте блочный шифр с однопроходным режимом цепочки, например, AES128-CBC
Вы инициализируете шифр с помощью 16-байтового ключа, генерируете случайный 16-байтовый IV, записываете IV, записываете общую длину файла, загружаете первый фрагмент, шифруете его вместе с IV, записываете результат, загружаете вторая часть, шифрование с использованием последних 16 байтов предыдущего зашифрованного блока в качестве IV, запись результата и так далее. Размер куска должен быть кратным 16 байтам; опять же, это даже не должно быть одинаковым каждый раз. Возможно, вам придется заполнить последний блок нулями.
В обоих случаях
Вы должны вычислить криптографический хэш исходного незашифрованного файла (например, с использованием SHA-256) и записать его после завершения шифрования. Это довольно просто: вы инициализируете хеш в самом начале и передаете в него каждый блок сразу после загрузки (включая nonce / IV и, возможно, поле длины). На стороне расшифровки вы делаете то же самое. В конце концов, вы должны убедиться, что вычисленный дайджест совпадает с тем, который поставляется с зашифрованным файлом.
Как это можно сделать на iOS? Боюсь, я не знаком с платформой, но CCCypt , кажется, отвечает всем требованиям.
РЕДАКТИРОВАТЬ: nonce / IV и длина тоже хэшируются.