PHP服务器和iOS上的AES Rijndael生成有时不同的密码
我使用Jim Dovey的NSData + AESCrypt类和Michael Sedlaczek的NSString + AESCrypt(2011-02-22)。
而在PHP上,我有一个简单的脚本:
<?php $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $key = '01234567890123456789012345678901'; $plaintext = "myworda"; $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB); $base64encoded_ciphertext = base64_encode($ciphertext); echo "ciphertext: ".$base64encoded_ciphertext."<br/>"; ?>
在ObjC:
NSString *key = @"01234567890123456789012345678901"; NSString *plaintext = [@"+l56Ia4yyK19D2x2+oCXuw==" AES256DecryptWithKey: key]; NSLog(@"plaintext: %@", plaintext);
我在PHP中更改variables$ plaintext,运行脚本并将输出密码复制并粘贴到Objective-c以解密。
和:
-
“myword”给我“+ l56Ia4yyK19D2x2 + oCXuw ==”,我解密并在iOS上获得“myword”[确定]
-
“早上好”给我“5UdImsV1pQs60ovXmH74HQ ==”,我解密并在iOS上获得“早上好”[确定]
- “Schröder”给我“KqNSCE8nGsYUYVdGZ2tnMw ==”,我解密并在iOS上获得“Schröder”[确定]
- “Schröder”给我“KqNSCE8nGsYUYVdGZ2tnMw ==”,我解密并在iOS上获得“Schröder”[确定]
- “非常长的文本”给我“lsa + QF3IHQnAFiOjl2Heyg ==”,我解密并在iOS上获得“非常长的文字”[确定]
- “非常非常非常非常长的文本”给我“kl / ThEyuyUMmKSqU4 / fJSzzJOyvsXrGRt5 / zsnqjQww =”,我不能在iOS上解密它[失败]
为什么#5失败? 如果我尝试使用Xcode来encryption“非常非常非常长的文本”,我会得到“kl / ThEyuyUMmqsqU4 / fJS90UZoJ73S4gox2uCoWoIL8 =”注意:kl / ThEyuyUMmKSqU4 / fJS == kl / ThEyuyUMmKSqU4 / fJS zzJOyvsXrGRt5 / zsnqjQww!= 90UZoJ73S4gox2uCoWoIL8 =
但进一步说,在Xcode上encryption“早上好”给了我“hVq1AuR8PAXSOztK26pmMw ==”,而PHP给了“5UdImsV1pQs60ovXmH74HQ ==”,但Xcode使用相同的密钥解密为“早上好”。
请帮忙。
您的PHP代码正在使用ECB模式。 我无法看到你在ObjC中设置模式的位置。 想必您正在使用其默认模式。 ObjC默认模式可能不是ECB,更可能是CBC。 还要注意的是,每当你的明文是16个字节或更less(即一个或更less的块)解密工作。 当它大于16个字节(即扩展到第二个块)时,它将失败。
我怀疑,ObjC默认是CBC模式与零IV。 这就好像它只是第一个区块的ECB,而第二个区块和随后的区块是不同的。
ECB模式不安全,泄漏信息。 改用指定IV的CBC模式。 至less改变你的PHP代码使用CBC模式,而不是ECB模式。
您使用MCRYPT_RIJNDAEL_128
encryption邮件,这会给您一个128位或16个字节的块大小。 你会注意到, very very very very long text
大于16个字节。
所以我猜你对ios的解密使用了不同的块大小。 我不熟悉ios,但AES256DecryptWithKey
似乎表明它使用256位的块大小。
尝试在您的PHP代码中使用MCRYPT_RIJNDAEL_256
,或更改ios代码以使用AES128DecryptWithKey
(我不知道是否存在,再次,我不知道ios)
- 我想在目标c中使用无填充的CFBencryption来创buildAES 128
- 用AirPlay 2播放AES加密影片的坑
- 使用SecKeyWrapperencryption16个字节的UTF8(ccStatus == -4304)
- AES / cbc / pkcs5padding encription IOS
- iOSencryptionAES128 / CBC / nopadding为什么不能正常工作?
- 在iOS中解码OpenSSL AES256string
- CryptoJs Encryption在android中不起作用
- AES128在iOS 7上截断解密的文本,在iOS 8上没有问题
- AES快速encryption