在项目中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 条评论
跟博主学到了很多东西啊