刚开始我不知道如何解决这个问题。
我先是在网上搜索php与des的相关事情,很多人反复提到mcrypt这个库。如果你也在找这个苦请先看看phpinfo()有没有输出“--with-mcrypt=static”,如果有的话,就别找了,你的php版本已经集成了mcrypt,可以直接使用。我一开始就浪费了很多时间才发现5.3已经包含它了。如果是5.2版还得自己想办法找找。
我这次是要给java程序提供一些加密数据,mcrypt直接生成的加密数据确实有些问题。还好有位大哥提供了一个程序解决这个问题。我又给这个程序加了一个转十六进制的代码。数据就跟对方对上了。
/**
* des加密函数
* @param string $str
* @param string $key
*/
function encrypt($str,$key = ''){
$block = mcrypt_get_block_size('des', 'ecb');
$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
$str = @mcrypt_encrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB);
return strtoupper(bin2hex($str));
}
/**
* des解密函数
* @param string $str
* @param string $key
*/
function decrypt($str,$key = ''){
$str = hex2bin(strtolower($str));
$str = @mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB);
$block = mcrypt_get_block_size('des', 'ecb');
$pad = ord($str[($len = strlen($str)) - 1]);
$str = substr($str, 0, strlen($str) - $pad);
return $str;
}
/**
* 十六进制转字符串
* @param string $hexData
*/
function hex2bin($hexData){
$binData = "";
for($i = 0;$i < strlen($hexData);$i += 2) {
$binData .= chr(hexdec(substr($hexData, $i, 2)));
}
return $binData;
}
测试:
$key = 'abcdefg'; $str = 'abcdefg'; $mstr = encrypt($str,$key); $strX = decrypt($mstr,$key); echo '<br />' . $strX . ' <=> ' . $mstr;