携程供应商接口数据解密PHP方法AES/CBC/PKCS5Padding

2018-02-09 12:41:38来源:oschina作者:swingcoder人点击

分享
function aes128_cbc_encrypt($key, $data, $iv) {
if(16 !== strlen($key)) $key = hash('MD5', $key, true);
if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
}
function aes128_cbc_decrypt($key, $data, $iv) {
if(16 !== strlen($key)) $key = hash('MD5', $key, true);
if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
$padding = ord($data[strlen($data) - 1]);
return substr($data, 0, -$padding);
}
function decode_bytes($text){
$bytes=array();
for($i=0;$i $char=$text[$i];
$bytes[$i/2]=chr((ord($char)-ord('a'))<<4);
$char=$text[$i+1];
$bytes[$i/2]=chr(ord($bytes[$i/2])+(ord($char)-ord('a')));
}
return join('',$bytes);
}function test(){
$key='';
$vt='';
$encrypted='jojihabbaogpamnnggmlkpflpmogmlclkeoglcikapgpbconldjjmlfjapfblhnobglgakiehkcgfnnmbojfpgmbcnfbjlcfjpjgcgjoanihcaiiafggfgnnjflfccgj';
$foo = $this->aes128_cbc_decrypt($key,$this->decode_bytes($encrypted),$vt);
pr($foo);

}

PKCS5Padding与PKCS7Padding当数据块大小是8时是一样的效果,事实上PKCS5Padding不能直接用户在AES上,因为AES要求的数据块至少是16字节以上。所以PKCS5Padding实际上是PKCS7Padding的别名来用。


Credithttps://gist.github.com/RiANOl/1077723

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台