【问题标题】:AES Rijndael on PHP server and iOS generates sometimes different ciphersPHP 服务器和 iOS 上的 AES Rijndael 有时会生成不同的密码
【发布时间】:2012-01-06 18:57:36
【问题描述】:

我正在使用 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/zsnqjQww != 90UZoJ73S4gox2uCoWoIL8=

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

请帮忙。

【问题讨论】:

标签: php ios encryption aes rijndael


【解决方案1】:

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

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

尝试在您的 PHP 代码中使用MCRYPT_RIJNDAEL_256,或者将 ios 代码更改为使用 AES128DecryptWithKey(我不知道是否存在,我也不知道 ios)

【讨论】:

  • 256 是指密钥大小(以位为单位)而不是块大小,它固定为 128 位(对于 128、192 或 256 位的密钥大小)。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多