我正在使用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中更改变量$ plaintext,运行脚本并将输出密码复制并粘贴到Objective-c进行解密。
并且:
“myword”给了我“+ l56Ia4yyK19D2x2 + oCXuw ==”我解密并在iOS上获得“myword”[确定]
“早上好”给我“5UdImsV1pQs60ovXmH74HQ ==”我解密并在iOS上“早上好”[确定]
为什么#5失败了?如果我尝试使用Xcode加密“非常非常非常长的文本”,我得到“kl / ThEyuyUMmKSqU4 / fJS90UZoJ73S4gox2uCoWoIL8 =”注意: kl / ThEyuyUMmKSqU4 / fJS == kl / ThEyuyUMmKSqU4 / fJS zzJOyvsXrGRt5 / zsnqjQww!= 90UZoJ73S4gox2uCoWoIL8 =
但是进一步说,加密Xcode上的“早上好”给了我“hVq1AuR8PAXSOztK26pmMw ==”,而PHP给了“5UdImsV1pQs60ovXmH74HQ ==”,但是Xcode使用相同的密钥解密到“早上好”。
请帮忙。
答案 0 :(得分:4)
您的PHP代码正在使用ECB模式。我无法看到你在ObjC中设置模式的位置。大概你正在使用它的默认模式。 ObjC默认模式可能不是ECB,更可能是CBC。另请注意,只要您的明文为16字节或更少(即一个块或更少),解密就会起作用。当它大于16个字节(即它延伸到第二个块)时,它会失败。
我怀疑ObjC默认是CBC模式,零IV。这将表现为只有第一个区块的ECB,而第二个和后续区块则不同。
ECB模式不安全并泄露信息。改为使用指定IV的CBC模式。至少将您的PHP代码更改为使用CBC模式而不是ECB模式。
答案 1 :(得分:-3)
使用MCRYPT_RIJNDAEL_128
加密邮件,它会为您提供128位或16字节的块大小。
您会注意到very very very very long text
大于16个字节。
所以我猜你在ios上的解密使用了不同的块大小。我不熟悉ios,但AES256DecryptWithKey
似乎表明它使用的是256位的块大小。
尝试在PHP代码中使用MCRYPT_RIJNDAEL_256
,或更改ios代码以使用AES128DecryptWithKey
(我不知道是否存在,再次,我不知道ios)