PHP中兼容JAVA的DES加密

在项目中PHP与JAVA通信时需要使用DES进行数据加密,但PHP对字符串进行DES加密之后,使用JAVA无法解开,反之也是。这是因为PHP的DES加密与JAVA略有不同。JAVA在使用DES方式加密的时候,如果字符串长度不足将补位,但是PHP并未这样做。因此我们只要在PHP进行DES加密时进行补位处理,就解决了兼容性的问题。CBC模式下采用的是pkcs#5补位方式,就是差N位补几个0xN,比如说差3位,就补充3个0x03。在网上也看到文章说补00或FF的,但是测试结果不好用。

// 定义key与iv
define('DES_KEY', '12345678');
define('DES_VI', '12345678');
/**
* des加密:兼容java
*/
function des_encrypt_java($str)
{
	$blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
	// 计算相差位数,并补位
	$slice = $blocksize - (strlen($str) % $blocksize);
	$str .= str_repeat(chr($slice), $slice);
	return mcrypt_cbc(MCRYPT_DES, DES_KEY, $str, MCRYPT_ENCRYPT, DES_VI);
}
/**
* des解密:兼容java
*/
function des_decrypt_java($str)
{
	$str = mcrypt_cbc(MCRYPT_DES, DES_KEY, $str, MCRYPT_DECRYPT, DES_VI);
	// 解密的结果可能还含有补位数据,所以要把补位去掉
	$slice = ord($str{strlen($str) - 1});
	return substr($str, 0, -1*$slice);
}

1 条评论

  • 德菲斯 2012 年 05 月 13 日 回复

    跟博主学到了很多东西啊

发表评论

电子邮件地址不会被公开。