Php openssl шифрование файлов

PHP
криптография

/* Base64 Encoded Encryption / $enc_data = base64_encode( openssl_encrypt($data, $method, $password, true, $iv) ); / Decode and Decrypt */ $dec_data = base64_decode( openssl_decrypt($enc_data, $method, $password, true, $iv) );

Этот способ шифрования и кодирования не будет работать так, как вы его расшифровываете, прежде чем дешифровать базу 64.

Вам нужно будет сделать это в обратном порядке.

/ This way instead / $enc_data=base64_encode(openssl_encrypt($data, $method, $pass, true, $iv)); $dec_data=openssl_decrypt(base64_decode($enc_data), $method, $pass, true, $iv);

Симметричный шифр

Этот пример иллюстрирует симметричный шифра AES 256 в режиме CBC. Требуется вектор инициализации, поэтому мы генерируем его с помощью функции openssl. Переменная $strong используется для определения того, был ли генерируемый IV криптографически сильным.

шифрование

$method = "aes-256-cbc"; // cipher method $iv_length = openssl_cipher_iv_length($method); // obtain required IV length $strong = false; // set to false for next line $iv = openssl_random_pseudo_bytes($iv_length, $strong); // generate initialization vector /* NOTE: The IV needs to be retrieved later, so store it in a database. However, do not reuse the same IV to encrypt the data again. */ if(!$strong) < // throw exception if the IV is not cryptographically strong throw new Exception("IV not cryptographically strong!"); >$data = "This is a message to be secured."; // Our secret message $pass = "Stack0verfl0w"; // Our password /* NOTE: Password should be submitted through POST over an HTTPS session. Here, it's being stored in a variable for demonstration purposes. */ $enc_data = openssl_encrypt($data, $method, $password, true, $iv); // Encrypt 

Дешифрирование

/* Retrieve the IV from the database and the password from a POST request */ $dec_data = openssl_decrypt($enc_data, $method, $pass, true, $iv); // Decrypt 

Base64 Encode & Decode

Если зашифрованные данные необходимо отправить или сохранить в печатном тексте, следует использовать функции base64_encode() и base64_decode() .

/* Base64 Encoded Encryption */ $enc_data = base64_encode(openssl_encrypt($data, $method, $password, true, $iv)); /* Decode and Decrypt */ $dec_data = openssl_decrypt(base64_decode($enc_data), $method, $password, true, $iv); 

Симметричное шифрование и дешифрование больших файлов с помощью OpenSSL

PHP не имеет встроенной функции для шифрования и расшифровки больших файлов. openssl_encrypt может использоваться для шифрования строк, но загрузка огромного файла в память — плохая идея.

Поэтому мы должны написать эту функцию userland. В этом примере используется симметричный алгоритм AES-128-CBC для шифрования небольших фрагментов большого файла и их записи в другой файл.

Шифрование файлов

/** * Define the number of blocks that should be read from the source file for each chunk. * For 'AES-128-CBC' each block consist of 16 bytes. * So if we read 10,000 blocks we load 160kb into memory. You may adjust this value * to read/write shorter or longer chunks. */ define('FILE_ENCRYPTION_BLOCKS', 10000); /** * Encrypt the passed file and saves the result in a new file with ".enc" as suffix. * * @param string $source Path to file that should be encrypted * @param string $key The key used for the encryption * @param string $dest File name where the encryped file should be written to. * @return string|false Returns the file name that has been created or FALSE if an error occured */ function encryptFile($source, $key, $dest) < $key = substr(sha1($key, true), 0, 16); $iv = openssl_random_pseudo_bytes(16); $error = false; if ($fpOut = fopen($dest, 'w')) < // Put the initialzation vector to the beginning of the file fwrite($fpOut, $iv); if ($fpIn = fopen($source, 'rb')) < while (!feof($fpIn)) < $plaintext = fread($fpIn, 16 * FILE_ENCRYPTION_BLOCKS); $ciphertext = openssl_encrypt($plaintext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); // Use the first 16 bytes of the ciphertext as the next initialization vector $iv = substr($ciphertext, 0, 16); fwrite($fpOut, $ciphertext); >fclose($fpIn); > else < $error = true; >fclose($fpOut); > else < $error = true; >return $error ? false : $dest; > 

Расшифровать файлы

Чтобы расшифровать файлы, которые были зашифрованы с помощью вышеуказанной функции, вы можете использовать эту функцию.

/** * Dencrypt the passed file and saves the result in a new file, removing the * last 4 characters from file name. * * @param string $source Path to file that should be decrypted * @param string $key The key used for the decryption (must be the same as for encryption) * @param string $dest File name where the decryped file should be written to. * @return string|false Returns the file name that has been created or FALSE if an error occured */ function decryptFile($source, $key, $dest) < $key = substr(sha1($key, true), 0, 16); $error = false; if ($fpOut = fopen($dest, 'w')) < if ($fpIn = fopen($source, 'rb')) < // Get the initialzation vector from the beginning of the file $iv = fread($fpIn, 16); while (!feof($fpIn)) < $ciphertext = fread($fpIn, 16 * (FILE_ENCRYPTION_BLOCKS + 1)); // we have to read one block more for decrypting than for encrypting $plaintext = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); // Use the first 16 bytes of the ciphertext as the next initialization vector $iv = substr($ciphertext, 0, 16); fwrite($fpOut, $plaintext); >fclose($fpIn); > else < $error = true; >fclose($fpOut); > else < $error = true; >return $error ? false : $dest; > 

Как пользоваться

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

$fileName = __DIR__.'/testfile.txt'; $key = 'my secret key'; file_put_contents($fileName, 'Hello World, here I am.'); encryptFile($fileName, $key, $fileName . '.enc'); decryptFile($fileName . '.enc', $key, $fileName . '.dec'); 
  1. testfile.txt с открытым текстом
  2. testfile.txt.enc с зашифрованным файлом
  3. testfile.txt.dec с расшифрованным файлом. Это должно иметь тот же контент, что и файл testfile.txt
  • Начало работы с PHP
  • APCu
  • BC Math (бинарный калькулятор)
  • Imagick
  • IMAP
  • JSON
  • Loops
  • PDO
  • PHP MySQLi
  • php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
  • PHP Встроенный сервер
  • PHPDoc
  • PSR
  • SimpleXML
  • SQLite3
  • Streams
  • URL-адрес
  • UTF-8,
  • WebSockets
  • XML
  • YAML в PHP
  • Автозагрузка грунтовки
  • Альтернативный синтаксис для структур управления
  • Анализ HTML
  • Асинхронное программирование
  • Аутентификация HTTP
  • Безопасность
  • Буферизация вывода
  • Вклад в PHP Core
  • Внедрение зависимости
  • Внесение изменений в Руководство по PHP
  • Волшебные константы
  • Волшебные методы
  • Вывод значения переменной
  • Выполнение по массиву
  • Генераторы
  • закрытие
  • Защитите Remeber Me
  • Интерфейс командной строки (CLI)
  • Использование cURL в PHP
  • Использование MongoDB
  • Использование Redis с PHP
  • Использование SQLSRV
  • Итерация массива
  • Как определить IP-адрес клиента
  • Как разбить URL-адрес
  • Класс Datetime
  • Классы и объекты
  • Клиент SOAP
  • Комментарии
  • Компилировать расширения PHP
  • Компиляция ошибок и предупреждений
  • Константы
  • Контрольные структуры
  • криптография
  • кэш
  • локализация
  • Манипулирование массивом
  • Манипуляции заголовков
  • Массивы
  • Машинное обучение
  • Менеджер зависимостей композитора
  • Многопоточное расширение
  • многопроцессорная обработка
  • Монго-PHP
  • Область переменных
  • Обработка изображений с помощью GD
  • Обработка исключений и отчетов об ошибках
  • Обработка нескольких массивов вместе
  • Обработка файлов
  • Общие ошибки
  • операторы
  • отладка
  • Отправка электронной почты
  • отражение
  • переменные
  • Переменные Superglobal PHP
  • Печенье
  • Поддержка Unicode в PHP
  • Пространства имен
  • Работа с датами и временем
  • Развертывание докеров
  • Регулярные выражения (regexp / PCRE)
  • Рекомендации
  • Рецепты
  • Розетки
  • Сервер SOAP
  • Сериализация
  • Сериализация объектов
  • сессии
  • Соглашения о кодировании
  • Создание PDF-файлов в PHP
  • Спектакль
  • Строковый анализ
  • Структуры данных SPL
  • Тестирование устройства
  • Тип жонглирования и нерегулярные проблемы сравнения
  • Тип подсказки
  • Типы
  • Установка в средах Linux / Unix
  • Установка среды PHP в Windows
  • Фильтры и функции фильтра
  • Форматирование строк
  • функции
  • Функции хеширования пароля
  • Функциональное программирование
  • Черты
  • Чтение данных запроса
  • Шаблоны проектирования
Читайте также:  Службы сети интернет html

Источник

Шифрование больших файлов с помощью OpenSSL в PHP

Шифрование больших файлов с помощью OpenSSL в PHP

Шифрование больших файлов имеет свои особенности. Так, например, файл, размер которого превышает несколько сотен мегабайт не удастся зашифровать сразу весь — так как на это просто не хватит памяти. Поэтому в таких случаях файлы приходиться шифровать небольшими блоками — кусками.

В примере ниже показано как зашифровать большой файл с помощью OpenSSL в PHP.

// размер блока («куска»), шифруемого файла
define(‘FILE_BLOCK_SIZE’, 10240);

/**
* @param $source Путь к шифруемому файлу + название самого файл
* @param $dest Путь куда будет сохранен зашифрованный файл + название самого файла
* @param $key Ключ шифрования
*/
function encrypt_file(string $source, string $dest, string $key)
$cipher = ‘aes-256-cbc’; // шифр
$ivLenght = openssl_cipher_iv_length($cipher); // длина вектора инициализации
$iv = openssl_random_pseudo_bytes($ivLenght); // генерирует псвевдо-случайную строку — вектор инициализации

$fd_source = fopen($source, ‘rb’); // открываем исходный файл в режиме бинарного чтения
$fd_dest = fopen($dest, ‘w’); // открываем новый файл в режиме записи

// записываем вектор инициализации в начало файла
// он нам понадобиться при расшифровке
fwrite($fd_dest, $iv);

// читаем исходный файл пока не достигнем конца файла
while ( !feof($fd_source) ) // из исходного файла берем «кусок»
$plaintext = fread($fd_source, $ivLenght * FILE_BLOCK_SIZE);
// шифруем этот «кусок»
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv);
// .
//$iv = substr($ciphertext, 0, $ivLenght);

// закрываем файлы
fclose($fd_source);
fclose($fd_dest);
>

/**
* @param $source Полный путь к зашифрованному файлу
* @param $dest Путь, куда будет сохранен расшифрованный файл + название самого файла
* @param $key ключ шифрования
*/
function decrypt_file(string $source, string $dest, string $key)
$cipher = ‘aes-256-cbc’;
$ivLenght = openssl_cipher_iv_length($cipher);

$fd_source = fopen($source, ‘rb’);
$fd_dest = fopen($dest, ‘w’);

// извлекаем сохраненный вектор инициализации из начала файла
$iv = fread($fd_source, $ivLenght);

Читайте также:  border-bottom-color

// по «кусочкам» расшифровываем файл
while ( !feof($fd_source) ) $ciphertext = fread($fd_source, $ivLenght * (FILE_BLOCK_SIZE + 1));
$plaintext = openssl_decrypt($ciphertext, $cipher, $key, OPENSSL_RAW_DATA, $iv);
//$iv = substr($plaintext, 0, $ivLenght);

Вызываем так:

$src_file = «новый_видеокурс.avi»;
$dest_file = «новый_видеокурс.avi.encrypted»;
$key = «самыйсильныйпароль»;

// зашифровываем
encrypt_file($src_file, $dest_file, $key);

// расшифровываем
decrypt_file($src_file, $dest_file, $key);

Создано 16.11.2021 12:54:32

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Encrypting (large) files in PHP with openSSL

    I’m trying to encrypt (big) files in PHP using AES and have looked into using Mcrypt and OpenSSL, the problem is all solutions I have found so far only encrypt strings, and the files I’m trying to encrypt would trigger the max memory limit for PHP (which unfortunately can’t be set higher), how would I go about achieving this?

    Читайте также:  Python work with csv file

    I built this as an experiment/PoC before I start a pull request for defuse/php-encryption. If you really need it, I can nudge defuse into merging my other PR and get started on this.

    @ScottArciszewski So is it possible to use defuse for large file encryption? Just reading file in chunks and encrypting each chunk with Crypto::encrypt obviously doesn’t work. so, any solution?

    4 Answers 4

    You could use CBC encryption using Mcrypt and then encrypt a segment of data at a time. Make sure that the segment is x times the block size of the used cipher (e.g. 16 bytes for AES). Encrypt the segment and take the last block of the generated ciphertext and use it as IV for the next segment. The final segment should be PKCS#7 padded (plenty of examples out there including in the mcrypt_encrypt comments).

    By chaining the segments together you get a ciphertext indistinguishable from a single encrypt (test your code using this information). Decryption is identical, using the ciphertext as IV. To see how it works, look at the CBC encryption method:

    enter image description here

    EDIT: if possible you should use the OpenSSL equivalent functionality. That’s not (well) documented, but you should be able to do the same using the code found in the link within the comment that Scott mentioned. Note that you should first perform everything without padding, and then for the final segment with padding.

    Источник

    Оцените статью