昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它...
甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密算法上 与JAVA不太一样,确切的说,PHP 3DES加密的填充方式使用0,而JAVA默认使用PKCS7填充,对方用的是PKCS5。
废话不多说了,上代码吧。
对方使用3DES,加密模式:ecb,填充方法:PKCS5
<?php
/**
*
* 加密函数
* 算法:des
* 加密模式:ecb
* 补齐方法:PKCS5
*
* @author 1336707969@qq.com
*/
function pkcs5_padding($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpadding($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text))
{
return false;
}
if( strspn($text, chr($pad), strlen($text) - $pad) != $pad)
{
return false;
}
return substr($text, 0, -1 * $pad);
}
$key = "*****"; //这里说一下,对方使用24位密钥,如果要求36位,需要pack处理一下
$str = "abcdefg";
echo "明文为:".$str."<br><br>";
//加密方法
$m = MCRYPT_TRIPLEDES;
$iv = mcrypt_create_iv(mcrypt_get_iv_size($m,MCRYPT_MODE_ECB), MCRYPT_RAND);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $iv);
$str = base64_encode(mcrypt_generic($td,pkcs5_padding($str,8)));
echo "PHP加密后的密文为:".$str ."<br><br>";
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $iv);
$ttt = pkcs5_unpad(mdecrypt_generic($td, base64_decode($str)));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "解密后的明文为:".$ttt . "<br><br>";
echo "<br>";
?>