2016-05-10 291 views
0

这是我的代码:PHP - Openssl_decrypt错误:错误最终块长度(AES 256 CBC模式加密/解密)

function decrypt($code) 
{ 

    $key = '3552ef55ecdf04324..'; // 64 bytes length 
    $iv = 'd20818af907b59c3b15d258dd3969770'; // 32 bytes length 
    $key = hash("sha256", $key,true); // 32 bytes length 
    $iv = md5($iv,true); // 16 bytes length 

    echo strlen(base64_decode($code)); // 80 bytes 
    //return openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv); // return false 
    $output = openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv); 
    return openssl_error_string(); 

} 

我使用加密SWIFT/Android和我解密使用PHP。

openssl_error_string()方法返回“错误:0606506D:数字包络例程:EVP_DecryptFinal_ex:错误的最终块长度”。

请注意,加密swift/android中的密钥和iv是相同的。 我无法在这里找到问题。任何人?谢谢。

+0

你指定PKCS#7(姓PKCS#5)填充?加密数据是块长度的多倍(AES为16字节)?我总是建议不要合并步骤,这会使调试更加困难。十六进制转储加密数据('base64_decode($ code)'),它可能不是你想象的那样。 – zaph

+0

指定PKCS#7填充。加密数据是块长度(80字节)的倍数。这里是进制打印:

0000 ab bc ea d5 22 1a 56 dd eb ad 30 17 96 c8 84 6d ".V 0.m 0010 16 c8 c3 1f e6 6f f1 71 1b 63 f3 71 85 18 b0 b8 ..oq .cq. 0020 d1 9b fa 3e df a0 a3 c3 45 d2 62 76 dc cc 94 53 > EbvS 0030 85 ac 88 77 11 60 d6 12 b4 52 db d2 2d e9 bd 3b w.'. R-; 0040 f6 a1 46 5a ec 54 55 54 04 8f 00 60 09 cf af c2 FZTUT ..'.
@zaph –

+0

加密数据($码):** q7zq1SIaVt3rrTAXlsiEbRbIwx/MB/FxG2PzcYUYsLjRm/O + 36Cjw0XSYnbczJRThayIdxFg1hK0UtvSLem9O/ahRlrsVFVUBI8AYAnPr8I = ** 明文必须是:** ** a18ac4e6fbd3fc024a07a21dafbac37d828ca8a04a0e34f368f1ec54e0d4fffb @zaph –

回答

0

我解决了这个问题。事实是,我是Android端的URLEncoding params,然后使用我的PHP脚本对URL进行解码。

不幸的是,'+'的URL解码是Android中的空白,但在ios中它是正确的('+')。

所以在PHP方面,我在解码前用'+'替换了空格字符。 而我删除了base64_decode函数。

更新代码:

function decrypt($code) 
{ 

$key = '3552ef55ecdf04324d0fe72343...'; 
$iv = 'd20818af907b59c3b15d258dd3969770'; 

$key = hash("sha256", $key, true); 
$iv = md5($iv, true); 
if (preg_match('/\s/', trim($code))) { 
    $code = str_replace(' ', '+', trim($code)); 
} 

$output = openssl_decrypt($code, 'aes-256-cbc', $key, 0, $iv); 
return $output; 

} 
相关问题