我解密接口返回的数据是正常解密的 然后 自己加密的 在网上的在线平台可以解密 但是在本地解不开 解出一半来 。。 求大佬指点一下
代码如下
//未加密数据(本地)
$stra='{"mobile":"186XXXXXXXX","goodsCode":"10001","orderId":"123456789","cityCode":"170","netType":"99"}';
//加密数据(接口返回的)
$strb='f1ec99caf1f08c8cc02ed354e4f6fd8d348e2ed8dee7c98ca63c6bb201da88f3577318c85dfe15eb1a02f2ba06cff7283d8c6bb28d8da8f58d4cc67ff9b44d4b9d79e5661f9634d800b98397541fcf656a12fc210ffd78101c7235607cbd6fcf73789279341f2e2821795714a6720745';
//偏移量
$iv='0102030405060708';
//秘钥
$key='12345678abcdefgh';
/*
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$b,hexToStr($a),MCRYPT_MODE_CBC,$v);
return pkcs5_unpada($decrypted);
function hexToStr($hex)//十六进制转字符串
{
$string="";
for($i=0;$i<strlen($hex)-1;$i+=2){
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
echo $decrypted;
die; */
// 加密
function encrypt_pass($input, $key,$iv ) {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$input = pkcs5_pad($input, $size);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = strToHex($data);
return $data;
}
//填充
function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
// 解密
function decrypt_pass($sStr, $sKey,$iv) {
$decrypted= mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$sKey,hexToStr($sStr),MCRYPT_MODE_CBC,$iv);
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}
//十六进制转字符串
function hexToStr($hex)
{
$string="";
for($i=0;$i<strlen($hex)-1;$i+=2){
$string.=chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
//字符串转十六进制
function strToHex($string)
{
$hex="";
$tmp="";
for($i=0;$i<strlen($string);$i++)
{
$tmp = dechex(ord($string[$i]));
$hex.= (strlen($tmp) == 1) ? "0".$tmp : $tmp;
}
$hex=strtoupper($hex);
return $hex;
}
echo '解密文档中的密文
';
echo decrypt_pass($strb,$key,$iv)."
";
echo '加密文件中的字符串
';
echo encrypt_pass($stra,$key,$iv)."
";
$passstr= encrypt_pass($stra,$key,$iv)."
";
echo '解密文件加密的密文
';
echo decrypt_pass($passstr,$key,$iv)."
";
1
KasuganoSoras 2019-04-09 15:27:28 +08:00
是时候抛弃 MCRYPT 换 OpenSSL 了
|
2
chaodada OP @KasuganoSoras 这个还没玩明白😹
|
3
KasuganoSoras 2019-04-09 17:41:34 +08:00
@chaodada #2 OpenSSL 挺简单的,开个扩展就可以了,也不需要写这么多复杂的东西,传几个参数就可以实现加密解密了
|
4
chaodada OP @KasuganoSoras 谢谢大佬,我研究一下
|
5
littleylv 2019-04-09 17:50:21 +08:00
1 楼说的没错,openssl_encrypt openssl_decrypt 分分钟的事。
另外 mcrypt_ 在 PHP 7.2 已经移除了,投入 openssl_ 的怀抱才是正途 |
6
catalina 2019-04-09 17:50:56 +08:00 via Android
mbedTLS 才是最好的开源加密解密算法库!(被打死)😜
@KasuganoSoras |
7
airdge 2019-04-09 20:56:04 +08:00
换 openssl mcrypt 都不兼容了
// 加密 function encrypt_pass($input, $key, $iv) { $data = openssl_encrypt($input, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); $data = strToHex($data); return $data; } // 解密 function decrypt_pass($sStr, $sKey, $iv) { $decrypted = openssl_decrypt(hexToStr($sStr), 'AES-128-CBC', $sKey, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s - 1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } //十六进制转字符串 function hexToStr($hex) { $string = ""; for ($i = 0; $i < strlen($hex) - 1; $i += 2) { $string .= chr(hexdec($hex[$i] . $hex[$i + 1])); } return $string; } //字符串转十六进制 function strToHex($string) { $hex = ""; $tmp = ""; for ($i = 0; $i < strlen($string); $i++) { $tmp = dechex(ord($string[$i])); $hex .= (strlen($tmp) == 1) ? "0" . $tmp : $tmp; } $hex = strtoupper($hex); return $hex; } |