王志广的个人博客

PHP 3DES加密

admin发表于2014-11-20  1,493次浏览 标签: 

该加密条件为:用3DES对称加密、加密的运算模式ECB、加密算法的填充模式PKCS7、字节为24位的加密Key、加密结果输出为ToHexString 16进制。

需要说明下为什么要有填充模式PKCS7,因为java等程序默认是填充的,为了更好的统一建议填充上。

填充
function PaddingPKCS7($data){
$block_size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_ECB);//查看默认字节
$padding_char = $block_size – (strlen($data) % $block_size);//需要填充的字节数
$data .= str_repeat(chr($padding_char),$padding_char);//用填充数在ASCII获得对应的字符,并填充多次
return $data;
}

去填充
function UnPaddingPKCS7($decrypted){
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);//通过ASCII获得填充数大小
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}

10变为16进制
function toHexString($string){
$buf = “”;
for ($i = 0; $i < strlen($string); $i++){
$val = dechex(ord($string{$i}));
if(strlen($val)< 2)
$val = “0”.$val;
$buf .= $val;
}
return $buf;
}

16变为10进制
function UnsetHexString($hex){
$string=””;
for($i=0;$i<strlen($hex)-1;$i+=2)
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
return $string;
}

3des加密
function encode($string,$key){
$string = PaddingPKCS7($string);
$size = mcrypt_get_iv_size(MCRYPT_3DES,MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($size,MCRYPT_RAND);
$result = mcrypt_encrypt(MCRYPT_3DES, $key, $string,MCRYPT_MODE_ECB, $iv);
return toHexString($result);
}

3des解密
function decode($str,$key){
$str = UnsetHexString($str);
$size = mcrypt_get_iv_size(MCRYPT_3DES,MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($size ,MCRYPT_RAND);
$result = mcrypt_decrypt(MCRYPT_3DES, $key, $str,MCRYPT_MODE_ECB, $iv);
return UnPaddingPKCS7($result);
}

密匙
$key = ‘JUNNET_123456_123456_COM’;
转化的字符串
$msg = ‘1234567’;
加密
$msg1 = encode($msg,$key);
解密
var_dump(decode($msg1,$key));

你可以发表评论引用到你的网站或博客,或通过RSS 2.0订阅这个日志的所有评论。
上一篇:
下一篇:
已有1条评论
阿里百秀
2014 年 12 月 10 日

很实用,多谢博主分享

我来说两句

  Ctrl+Enter