求救 phpaes 解密 不知道哪里出问题了 急急急 求大佬

2019-04-09 13:14:46 +08:00
 chaodada

我解密接口返回的数据是正常解密的 然后 自己加密的 在网上的在线平台可以解密 但是在本地解不开 解出一半来 。。 求大佬指点一下

代码如下

	   //未加密数据(本地)
       $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)."
";

3304 次点击
所在节点    PHP
8 条回复
KasuganoSoras
2019-04-09 15:27:28 +08:00
是时候抛弃 MCRYPT 换 OpenSSL 了
chaodada
2019-04-09 17:39:37 +08:00
@KasuganoSoras 这个还没玩明白😹
KasuganoSoras
2019-04-09 17:41:34 +08:00
@chaodada #2 OpenSSL 挺简单的,开个扩展就可以了,也不需要写这么多复杂的东西,传几个参数就可以实现加密解密了
chaodada
2019-04-09 17:46:14 +08:00
@KasuganoSoras 谢谢大佬,我研究一下
littleylv
2019-04-09 17:50:21 +08:00
1 楼说的没错,openssl_encrypt openssl_decrypt 分分钟的事。
另外 mcrypt_ 在 PHP 7.2 已经移除了,投入 openssl_ 的怀抱才是正途
catalina
2019-04-09 17:50:56 +08:00
mbedTLS 才是最好的开源加密解密算法库!(被打死)😜
@KasuganoSoras
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;
}
chaodada
2019-04-10 07:05:01 +08:00
@airdge 谢谢大佬的代码,我一会一定好好看一下流程🙏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/553329

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX