V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaodada
V2EX  ›  PHP

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

  •  
  •   chaodada · 2019-04-09 13:14:46 +08:00 · 3300 次点击
    这是一个创建于 2054 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    代码如下

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

    8 条回复    2019-04-10 07:05:01 +08:00
    KasuganoSoras
        1
    KasuganoSoras  
       2019-04-09 15:27:28 +08:00
    是时候抛弃 MCRYPT 换 OpenSSL 了
    chaodada
        2
    chaodada  
    OP
       2019-04-09 17:39:37 +08:00 via iPhone
    @KasuganoSoras 这个还没玩明白😹
    KasuganoSoras
        3
    KasuganoSoras  
       2019-04-09 17:41:34 +08:00
    @chaodada #2 OpenSSL 挺简单的,开个扩展就可以了,也不需要写这么多复杂的东西,传几个参数就可以实现加密解密了
    chaodada
        4
    chaodada  
    OP
       2019-04-09 17:46:14 +08:00 via iPhone
    @KasuganoSoras 谢谢大佬,我研究一下
    littleylv
        5
    littleylv  
       2019-04-09 17:50:21 +08:00
    1 楼说的没错,openssl_encrypt openssl_decrypt 分分钟的事。
    另外 mcrypt_ 在 PHP 7.2 已经移除了,投入 openssl_ 的怀抱才是正途
    catalina
        6
    catalina  
       2019-04-09 17:50:56 +08:00 via Android
    mbedTLS 才是最好的开源加密解密算法库!(被打死)😜
    @KasuganoSoras
    airdge
        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;
    }
    chaodada
        8
    chaodada  
    OP
       2019-04-10 07:05:01 +08:00 via iPhone
    @airdge 谢谢大佬的代码,我一会一定好好看一下流程🙏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2451 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:40 · PVG 23:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.