PHP AES256 PKCS7 解密来自 iOS Swift

3

我正在尝试在Swift中加密字符串,并在PHP中解密。我从SO得到了一些很好的帮助,希望有人能再次提供帮助。这是我尝试在PHP中使用的解密代码。

$key = "test";
$pass = "bLOKONASw8tE2cki5QhkcA==";
$iv = "1234567890123456";   

$base64encoded_ciphertext = $pass;
echo "pass: ".$pass;

$res_non = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($base64encoded_ciphertext), MCRYPT_MODE_CBC, $iv);

$decrypted = $res_non;
echo " 1: ".$decrypted;
$dec_s2 = strlen($decrypted);
echo " 2: ".$dec_s2;
$padding = ord($decrypted[$dec_s2-1]);
echo " padding: ".$padding;
$decrypted = substr($decrypted, 0, -$padding);
echo " Decrypted: ".$decrypted;

这个字符串是用Swift加密的,在发送到服务器之前我对它进行了base64编码。

虽然没有出现错误,但似乎解密后的值为空。
我在Swift中有一个测试解密函数,它能正确返回输出结果。

Key:<74657374 73747269 6e67>
Iv:<31323334 35363738 39303132 33343536>
Message: <74657374 6d657373 616765>
ivLength    = 16, ivData    = <31323334 35363738 39303132 33343536>
encryptedData: <6cb38a38 d012c3cb 44d9c922 e5086470>
base64cryptString = bLOKONASw8tE2cki5QhkcA==

如果有人能帮助我找出我错在哪里,那将是非常有帮助的。

检查填充。我曾经遇到过这个问题,当时转向C#。结果发现填充字节是不同的。PHP使用真正的空值,而其他语言使用零或制表符等。最终,我不得不编写一些非常冗长的代码来解决这个问题。此外,如果他们在PHP中进行16字节的填充,而C#则运行到64字节,我认为我也必须考虑到这一点。 - Dave
你介意解释一下你是怎么解决这个问题的吗? - Alex
已经有5年了,我不记得手头上有代码了。但我还记得需要将pkcs包大小设置为类似于9这样的荒谬数字,以在C#中获得相当于7的效果。我会看看是否仍然在某个地方存档了客户端代码。 - Dave
1个回答

0
在AES - CBC模式下,初始化向量的长度必须为16个字节。

我已经更正了块大小,将其设置为16字节。然而,现在我在结尾处没有得到结果。我已经更新了代码以反映这些更改。之前我被告知需要删除PKCS7填充,这也是代码的一部分应该完成的任务。我不确定哪里出了问题。谢谢您的帮助。 - Alex
首先,如果没有任何加密代码,那么我唯一能做的就是猜测。 如果您想使用AES256和CCCrypto进行加密,则密钥大小必须恰好为32字节。 如果您想使用可变长度密钥,请尝试使用Blowfish算法,这是我的建议。我写了一篇关于此的博客,请看一下。 http://blog.s21g.com/articles/2382 在这个例子中,我截断密钥大小以匹配AES规范。 - Satachito
我已经看了你的文章,虽然我很感激你的帮助,但我无法弄清如何使用它。你有Blowfish的工作示例吗?再次感谢。 - Alex
func UTF8Data( p: String ) -> NSData? { return p.dataUsingEncoding( NSUTF8StringEncoding )}let wKey = UTF8Data( "teststring" )!let wIV = UTF8Data( "12345678" )!// 加密var ( s, data ) = DataEncryptedByBlowfish( UTF8Data( "testmessage" )!, wKey, CCOptions( kCCOptionPKCS7Padding ), wIV )// 解密( s, data ) = DataDecryptedByBlowfish( data, wKey, CCOptions( kCCOptionPKCS7Padding ), wIV ) - Satachito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接