Шифрование в PHP

Допустим, требуется обмен данными между двумя серверами. Чтобы обезопасить данные от прослушивания трафика, данные шифруются. Ну например, передача действий внутри ботнета. Вот некоторые товарищи используют base64, что по сути не является шифрованием, а называется кодированием и для раскодирования подобного кода применяются известные функции.

В качестве еще одного примера псевдошифрования приведу пример «шифрования» паролей в базе данных одной CMS – там пароли шифруются не в md5() или md5()+соль, а просто кодируются через base64. Т.е. при сливе базы хакеру не составит никого труда расшифровать все пароли через встроенную php-функцию base64_decode().

Нам же нужно передавать данные, не беспокоясь о том, что кто-то сможет перехватить текст и расшифровать его. В PHP есть популярный пакет шифрования данных Mcrypt, обеспечивающий возможность двустороннего шифрования (то есть собственно шифрование и расшифровку данных).

Mcrypt версии 2.4.7 поддерживает следующие алгоритмы симметричного шифрования: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192, TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus и т.д. Подробнее про каждый алгоритм написано в Википедии.

Так как используется симметричное шифрование, то ключ должен быть известен обеим сторонам и храниться в секрете.

Пример шифрования и расшифровки строки

<?php
define('CRYPT_KEY','dPfsdfF95bfG4Wmls9J');
function code($source) {
	$key = CRYPT_KEY;
	$s = "";

	// Открывает модуль
	$td = mcrypt_module_open('des', '', 'ecb', '');
	$key = substr($key, 0, mcrypt_enc_get_key_size($td));
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
		echo $key;
	// Инициализирует дескриптор шифрования и шифруем
	if (mcrypt_generic_init($td, $key, $iv) != -1) {
		$s = mcrypt_generic($td, $source);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
	}
	return $s;
}

function decode($source) {
	$key = CRYPT_KEY;
	$s = "";

	// Открывает модуль
	$td = mcrypt_module_open('des', '', 'ecb', '');
	$key = substr($key, 0, mcrypt_enc_get_key_size($td));
	$iv_size = mcrypt_enc_get_iv_size($td);
	$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

	// Инициализирует дескриптор шифрования и дешифруем
	if (mcrypt_generic_init($td, $key, $iv) != -1) {
		$s = mdecrypt_generic($td, $source);
		mcrypt_generic_deinit($td);
		mcrypt_module_close($td);
	}
	return $s;
}

$string = "dddfdf asdasd adasdasda aa23ER ASDSDADA FSADASDSADASD";
$code   = code($string);
$decode = decode($code);
echo trim($decode);
?>

mcrypt_module_open('des', '', 'ecb', '')
Эта функция открывает модуль алгоритма и используемый режим. Для данного примера Алгоритм DES в режиме ECB.

$key = substr($key, 0, mcrypt_enc_get_key_size($td));
Максимальный размер ключа должен быть получен вызовом функции mcrypt_enc_get_key_size(), и каждое значение меньше полученного будет правильным.

$s = mcrypt_generic($td, $source);
При шифровании данные заполняются нулевыми байтами, чтобы гарантировать длину данных в n*blocksize. Размер блока blocksize определяется алгоритмом (для DES размер блока 64 бита). Поэтому при расшифровке в конце строки могут появиться “\0”, которые удаляются функцией trim()

#1

yb хрена не работает, куча ошибок: Module initialization failed

Test, 22.01.2012 - 15:44
#2

#1, Думаю у вас просто не подключен модуль Mcrypt в php.ini

Андрей, 29.01.2012 - 10:22
#3

движок с base64 паролями случаем не phpshop?

ferym, 9.03.2012 - 00:54
#4

Столкнулся с тем что если зашифрованную строку сначала записать в базу, а потом считать оттуда, то получается совсем не то что мы записывали. И из-за этого расшифровать данные не получается.

Можете дать направление в котором требуется копать?

Штудер, 10.08.2012 - 14:43
#5

1) проблема с кодировкой. смотри, чтобы в базу сохранялось в utf-8 и в скриптах, когда шифруешь тоже было utf-8
2) может ограничение в символах в поле базы?

admin, 10.08.2012 - 14:56
#6

u^8dJ�sݩt���Igy�r�-���S�EZ1A3�S�Y�W���a���+�w��b]O�1ؘ)yu�PP�*ۖ��CF��!�4��/�X�@���L+���BG��

Вот такая строка получается после шифрования.

u^8dJ???s?t???Igy?r?-???S?EZ1A3?S?Y?W???a???+?w??b]O?1?)yu?PP?*???CF??!?4??/?X?@???L+????BG

А вот так она выглядит когда ее вставишь в базу.
Поле в базе пробовал TEXT и BLOB. Результат одинаковый. Чую что засада где-то рядом, но где не пойму :(

Штудер, 10.08.2012 - 15:07
#7

сделал ход конем bin2hex зашифрованной строки и pack("H*",$encoded). Теперь с базой все нормально.

Штудер, 10.08.2012 - 16:55
#8

Спасибо Штундер, очень помог!

Андрей, 3.10.2012 - 04:07
Оставить комментарий