Шифрование и дешифрование данных

Задача
Необходимо зашифровать и расшифровать информацию с помощью одного из множества популярных алгоритмов.

Решение
Используйте расширение PHP mcrypt:

$key = 'That golden key that opens the palace of eternity.';
$data = 'The chicken escapes at dawn. Send help with Mr. Blue.';
$alg = MCRYPT_BLOWFISH;
$mode = MCRYPT_MODE_CBC;
$iv = mcrypt_create_iv(mcrypt_get_iv_size($alg,$mode),MCRYPT_DEV_URANDOM);
$encrypted_data = mcrypt_encrypt($alg, $key, $data, $mode, $iv);
$plain_text = base64_encode($encrypted_data);
print $plain_text."\n";
$decoded = mcrypt_decrypt($alg,$key,base64_decode($plain_text),$mode,$iv);
print $decoded."\n";
NNB9WnuCYjyd3Y7vUh7XDfWFCWnQY0BsMehHNmBHbGOdJ3cM+yghABb/ XyrJ+w3xz9tms74/a70=
The chicken escapes at dawn. Send help with Mr. Blue.

Обсуждение
Расширение mcrypt представляет собой интерфейс библиотеки mcrypt, включающей множество различных алгоритмов шифрования. Данные шифруются и расшифровываются с помощью функций mcrypt_encrypt() и mcrypt_decrypt() соответственно. Каждая их них принимает пять аргументов.


Первый аргумент представляет применяемый алгоритм.
Чтобы определить, какие алгоритмы поддерживает библиотека mcrypt в вашей системе, вызовите функцию mcrypt_list_algorithms(). Полный список алгоритмов библиотеки mcrypt представлен в табл. 14.1. Второй аргумент – это ключ шифрования, а третий – данные для шифрования или расшифровки. Четвертый аргумент устанавливает режим шифрования или расшифровки (список режимов возвращает функция mcrypt_list_modes()). Пятый аргумент – это вектор инициализации (IV), используемый некоторыми режимами в качестве составляющей процесса шифрования или дешифрования.За исключением шифруемой и дешифруемой информации, все остальные аргументы должны быть одинаковыми как при шифровании, так и при расшифровке. При использовании режима, требующего вектор
инициализации, можно передать этот вектор в открытом виде вместе с зашифрованным текстом.

Различные режимы соответствуют разным обстоятельствам. Режим цепочки кодовых блоков (Cipher Block Chaining – CBC) кодирует данные по блокам и использует зашифрованное значение каждого блока (как и ключа) для вычисления зашифрованного значения следующего блока. Вектор инициализации оказывает влияние на первый блок.


Режимы обратной кодовой связи (Cipher Feedback – CFB) и выходной обратной связи (Output Feedback – OFB) также используют вектор инициализации, но они шифруют данные частями меньшей длины, чем размер блока. Обратите внимание, что режим OFB небезопасен, если
шифровать данные порциями, меньшими, чем блок. Режим электронной кодовой книги (Electronic Code Book – ECB) шифрует данные блоками, не зависящими друг от друга. Кроме того, режим ECB не использует векторы инициализации. Он также менее безопасен, чем дру-гие методы, если его применять регулярно, поскольку для одного и того же исходного текста с данным ключом он всегда генерирует тот же самый зашифрованный текст.Первый аргумент функции mcrypt_create_iv() – длина вектора, а второй – это источник случайности. Имеется три варианта источника случайности: MCRYPT_DEV_RANDOM читает из псевдоустройства /dev/random, MCRYPT_DEV_URANDOM читает из псевдоустройства /dev/urandom, а MCRYPT_RAND использует встроенный генератор случайных чисел. Не все операционные системы поддерживают псевдоустройства случайных генераторов. Не забудьте вызвать функцию srand() перед использованием MCRYPT_RAND, для того чтобы получить неповторяющуюся последовательность случайных чисел.

Код и примеры этого рецепта совместимы с mcrypt 2.4.


Интерфейс mcrypt в PHP поддерживает библиотеки mcrypt 2.2 и mcrypt 2.4, но между ними есть некоторые различия. В случае библиотеки mcrypt 2.2 PHP поддерживает только следующие mcrypt-функции: mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ofb(), mcrypt_get_key_size(), mcrypt_get_block_size(), mcrypt_get_cipher_name() и mcrypt_create_iv(). Чтобы зашифровать и расшифровать данные с помощью библиотеки mcrypt 2.2,вызовите соответствующую функцию mcrypt_MODE() на базе выбранного вами режима, и передайте ей аргумент, определяющий шифрование или дешифрование. Следующий фрагмент представляет собой версию программы из раздела «Решение», совместимую с mcrypt 2.2:

$key = 'That golden key that opes the palace of eternity.';
$data = 'The chicken escapes at dawn. Send help with Mr. Blue.';
$alg = MCRYPT_BLOWFISH;
$iv = mcrypt_create_iv(mcrypt_get_block_size($alg),MCRYPT_DEV_URANDOM);
$encrypted_data = mcrypt_cbc($alg,$key,$data,MCRYPT_ENCRYPT);
$plain_text = base64_encode($encrypted_data);
print $plain_text."\n";
$decoded = mcrypt_cbc($alg,$key,base64_decode($plain_text),MCRYPT_DECRYPT);
print $decoded."\n";

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Не храните пароли на своем сайте
Обнаружение SSL-соединения
Проверка данных с помощью хеширования
Проверка надежности пароля
Работа с потерянными паролями

Вернуться в раздел: PHP / 14. Шифрование и безопасность