2

我正在使用 Jim Dovey 的 NSData+AESCrypt 类别和 Michael Sedlaczek (2011-02-22) 的 NSString+AESCrypt 类别。

在 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 以对其进行解密。

和:

  1. “myword”给了我“+l56Ia4yyK19D2x2+oCXuw==”,我在iOS上解密并得到“myword”[OK]

  2. “早上好”给了我“5UdImsV1pQs60ovXmH74HQ==”,我在 iOS 上解密并得到“早上好”[OK]

  3. “Schröder”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,我在 iOS 上解密并得到“Schröder”[OK]
  4. “Schröder”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,我在 iOS 上解密并得到“Schröder”[OK]
  5. “很长的文本”给了我“lsa+QF3IHQnAFiOjl2Heyg==”,我在 iOS 上解密并得到“很长的文本”[OK]
  6. “非常非常非常长的文本”给了我“kl/ThEyuyUMmKSqU4/fJSzzJOyvsXrGRt5/zsnqjQww=”,我无法在 iOS 上解密它 [失败]

为什么#5 失败了?如果我尝试使用 Xcode 加密“非常非常非常长的文本”,我会得到“kl/ThEyuyUMmKSqU4/fJS90UZoJ73S4gox2uCoWoIL8=" 请注意:kl/ThEyuyUMmKSqU4/fJS == kl/ThEyuyUMmKSqU4/fJS zzJOyvsXrGRt5/zsnqjQww4!= 90UZoZoJ73S

但更进一步,在 Xcode 上加密“早上好”给我“hVq1AuR8PAXSOztK26pmMw==”,而 PHP 给“5UdImsV1pQs60ovXmH74HQ==”,但 Xcode 使用相同的密钥将两者解密为“早上好”。

请帮忙。

4

2 回答 2

4

您的 PHP 代码正在使用 ECB 模式。我看不到您在 ObjC 中设置模式的位置。大概你正在使用它的默认模式。ObjC 默认模式可能不是 ECB,更可能是 CBC。另请注意,只要您的明文为 16 个字节或更少(即一个块或更少),解密就会起作用。当它大于 16 个字节(即它扩展到第二个块)时,它会失败。

我怀疑 ObjC 默认是 CBC 模式,IV 为零。这将就好像它仅适用于第一个区块的 ECB,而对于第二个和后续区块则不同。

ECB模式不安全且会泄露信息。改为使用具有指定 IV 的 CBC 模式。至少将您的 PHP 代码更改为使用 CBC 模式而不是 ECB 模式。

于 2011-11-26T11:23:50.743 回答
-3

MCRYPT_RIJNDAEL_128您使用它为您提供 128 位或 16 字节的块大小来加密消息。您会注意到very very very very long text大于 16 个字节。

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

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

于 2011-11-26T11:21:00.420 回答