Я пытаюсь зашифровать (большие) файлы на PHP с помощью AES и изучил использование Mcrypt и OpenSSL, проблема в том, что все решения, которые я нашел до сих пор, только зашифровывают строки, а файлы, которые я пытаюсь зашифровать, вызовут max предел памяти для PHP (который, к сожалению, не может быть установлен выше), как бы я мог добиться этого?
Вы можете использовать шифрование CBC с помощью Mcrypt и затем шифровать сегмент данных за раз. Убедитесь, что сегмент равен x раз размер блока используемого шифра (например, 16 байтов для AES). Зашифруйте сегмент и возьмите последний блок генерируемого зашифрованного текста и используйте его как IV для следующего сегмента. Конечный сегмент должен содержать PKCS # 7 (множество примеров, в том числе в комментариях mcrypt_encrypt
).
Связывая сегменты вместе, вы получаете зашифрованный текст, неотличимый от одного шифрования (проверьте свой код, используя эту информацию). Расшифровка идентична, используя зашифрованный текст как IV. Чтобы узнать, как это работает, посмотрите на метод шифрования CBC:
EDIT: если возможно, вы должны использовать эквивалентную функциональность OpenSSL. Это не (хорошо) документально, но вы должны быть в состоянии сделать то же самое, используя код, найденный в ссылке в комментарии, упомянутом Скоттом . Обратите внимание: сначала вы должны выполнить все без заполнения, а затем для финального сегмента с дополнением .
http://www.shellhacks.com/en/Encrypt-And-Decrypt-Files-With-A-Password-Using-OpenSSL
$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc
чтобы не использовать слишком много памяти, вам нужен потоковый шифр. Назовите это в PHP с backticks `
или с shell_exec
редактировать
Поскольку оболочка exec недоступна
http://jeremycook.ca/2011/03/20/easy-file-encryption/
Там есть решение. Хотя и я не могу это подчеркнуть. Потоковые шифры сложны. Я не просмотрел полностью код и не думаю, что способен. Использование открытого SSL напрямую – намного лучший вариант
http://php.net/manual/en/filters.encryption.php
Является примером кода
Я опубликовал две функции, которые шифруют и дешифруют даже большие файлы с помощью openssl_encrypt()
используя алгоритм AES-128-CBC .
См. Это openssl_encrypt () .
Использование SSL на вашем сайте позаботится об этом для вас. Любые файлы, которые передаются, шифруются браузером клиента и сервером, использующим протокол HTTPS.
Что касается хранения зашифрованных версий файлов, я бы не рекомендовал.