该加密条件为:用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));
2014 年 12 月 10 日
很实用,多谢博主分享