我使用的NSData+AESCrypt类别由吉姆多维和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中更改变量$plaintext,运行脚本并将输出密码复制并粘贴到目标-c以解密它。
和:
H 111“超长文本”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,“Schr der”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”。“on iOS OK
,我无法在iOS FAIL上解密它
为什么5号失败了?如果我试图使用Xcode加密“超长文本”,"kl/ThEyuyUMmKSqU4/fJS90UZoJ73S4gox2uCoWoIL8=“会注意到:kl/ThEyuyUMmKSqU4 4/fJS == kl/ThEyuyUMmKSqU4 4/fJS zzJOyvsXrGRt5 5/zsnqjQww != 90UZoJ73S4gox2uCoWoIL8=
但是更进一步,在Xcode上加密“早上好”会给我"hVq1AuR8PAXSOztK26pmMw==",而PHP则给出"5UdImsV1pQs60ovXmH74HQ==",但是Xcode使用相同的密钥将两者解密为“早安”。
请帮帮忙。
发布于 2011-11-26 11:23:50
您的PHP代码正在使用欧洲央行模式。我看不到您在ObjC中设置模式的位置。想必您正在使用它的默认模式。ObjC的默认模式可能不是欧洲央行,更有可能是CBC。还请注意,每当明文是16个字节或更少(即一个块或更少),解密工作。当它大于16个字节(即扩展到第二个块)时,它将失败。
我怀疑ObjC的默认模式是CBC模式,为零IV,这就好像它只适用于第一个区块,而对于第二个和以后的区块则不同。
欧洲央行的模式是不安全的,并且泄露信息。在指定的IV中使用CBC模式。至少,将PHP代码更改为使用CBC模式而不是ECB模式。
发布于 2011-11-26 11:21:00
您可以使用MCRYPT_RIJNDAEL_128对消息进行加密,这为您提供了128位或16字节的块大小。您会注意到very very very very long text大于16个字节。
所以我猜你在ios上解密使用的是不同的块大小。我不熟悉ios,但AES256DecryptWithKey似乎表明它使用256位的块大小。
尝试在PHP代码中使用MCRYPT_RIJNDAEL_256,或者将ios代码更改为使用AES128DecryptWithKey (我不知道是否存在这种情况,同样,我不知道ios)
https://stackoverflow.com/questions/8276833
复制相似问题