LMLPHP后院

代码分享之PHP实现DES和3DES加密解密技术

maybe yes 发表于 2016-10-22 21:53

使用 PHP 实现 DES 加密解密和 3DES(triple des) 加密解密。虽然 DES 已经过时,但是特定的时候还是需要这种算法的。DES 加密解密写法,PHP 比 Java 实现起来应该更简单一些,在官方的文档中表明,PHP 在内部其实已经根据算法的向量的长度自动的将内容进行了补全操作,DES 算法的向量长度就是 8,所以在 Java 的代码实现中,很多人的写法会根据数据长度的取模来补上相应的空字符,达到 8 的倍数。

加密解密算法,不论是 PHP,Java 还是其他语言,算法都是已经实现好了的。PHP 使用内置的扩展 mcrypt,Java 导入相应的 jar 包,只是在写法上稍有差异。而 PHP 这方面的资料官方也不太详细,因为 mcrypt 好像也过时了。

虽然代码质量不怎么样,但是还是要分享的。

function tripledesEncrypt($str)
{
	$key = '3132333435363738';
	$str = '88888888' . $str;
	$len = strlen($str);
	$count = $len % 8;
	if ($count > 0) {
		$str .= str_pad('', 8 - $count, ' ', STR_PAD_RIGHT);
	}
	$td = mcrypt_module_open('tripledes', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$encrypted_data = mcrypt_generic($td, $str);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return $encrypted_data;
}

function tripledesDecrypt($str)
{
	$key = '3132333435363738';
	$td = mcrypt_module_open('tripledes', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$decrypted_data = mdecrypt_generic($td, $str);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(substr($decrypted_data, 8));
}


function desEncrypt($str)
{
	$key = '3132333435363738';
	$str = '88888888' . $str;
	$len = strlen($str);
	$count = $len % 8;
	if ($count > 0) {
		$str .= str_pad('', 8 - $count, ' ', STR_PAD_RIGHT);
	}
	$td = mcrypt_module_open('des', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$encrypted_data = mcrypt_generic($td, $str);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return $encrypted_data;
}

function desDecrypt($str)
{
	$key = '3132333435363738';
	$td = mcrypt_module_open('des', '', 'ecb', '');
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$decrypted_data = mdecrypt_generic($td, $str);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	return trim(substr($decrypted_data, 8));
}
2020-08-07 00:05:46 1596729946 0.018644