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以解密。

和:

  1. “myword”给我“+ l56Ia4yyK19D2x2 + oCXuw ==”,我解密并在iOS上获得“myword”[确定]

  2. “早上好”给我“5UdImsV1pQs60ovXmH74HQ ==”,我解密并在iOS上获得“早上好”[确定]

  3. “Schröder”给我“KqNSCE8nGsYUYVdGZ2tnMw ==”,我解密并在iOS上获得“Schröder”[确定]
  4. “Schröder”给我“KqNSCE8nGsYUYVdGZ2tnMw ==”,我解密并在iOS上获得“Schröder”[确定]
  5. “非常长的文本”给我“lsa + QF3IHQnAFiOjl2Heyg ==”,我解密并在iOS上获得“非常长的文字”[确定]
  6. “非常非常非常非常长的文本”给我“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_128encryption邮件,这会给您一个128位或16个字节的块大小。 你会注意到, very very very very long text大于16个字节。

所以我猜你对ios的解密使用了不同的块大小。 我不熟悉ios,但AES256DecryptWithKey似乎表明它使用256位的块大小。

尝试在您的PHP代码中使用MCRYPT_RIJNDAEL_256 ,或更改ios代码以使用AES128DecryptWithKey (我不知道是否存在,再次,我不知道ios)