刚开始我不知道如何解决这个问题。
我先是在网上搜索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;