首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP和iOS上的AES Rijndael有时会生成不同的密码

PHP和iOS上的AES Rijndael有时会生成不同的密码
EN

Stack Overflow用户
提问于 2011-11-26 06:53:31
回答 2查看 2.6K关注 0票数 2

我使用的NSData+AESCrypt类别由吉姆多维和NSString+AESCrypt的迈克尔塞德拉克(2011-02-22)。

在PHP上,我有一个简单的脚本:

代码语言:javascript
复制
<?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中:

代码语言:javascript
复制
NSString *key = @"01234567890123456789012345678901";
NSString *plaintext = [@"+l56Ia4yyK19D2x2+oCXuw==" AES256DecryptWithKey: key];
NSLog(@"plaintext: %@", plaintext);

我在PHP中更改变量$plaintext,运行脚本并将输出密码复制并粘贴到目标-c以解密它。

和:

  1. "myword“给我"+l56Ia4yyK19D2x2+oCXuw==”,我解密了iOS OK
  2. 上的"myword“,”早上好“给了我"5UdImsV1pQs60ovXmH74HQ==”,我在iOS上解密了“早上好”,“Schr der”给了我"KqNSCE8nGsYUYVdGZ2tnMw==“,”Schr der“给了我"KqNSCE8nGsYUYVdGZ2tnMw==”,我解密了iOS上的“Schr der”,“Schr der”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,“Schr der”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,“Schr der”在iOS OK

H 111“超长文本”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”,“Schr der”给了我“KqNSCE8nGsYUYVdGZ2tnMw==”。“on iOS OK

  1. ”超长文本给了我

,我无法在iOS FAIL上解密它

为什么5号失败了?如果我试图使用Xcode加密“超长文本”,"kl/ThEyuyUMmKSqU4/fJS90UZoJ73S4gox2uCoWoIL8=“会注意到:kl/ThEyuyUMmKSqU4 4/fJS == kl/ThEyuyUMmKSqU4 4/fJS zzJOyvsXrGRt5 5/zsnqjQww != 90UZoJ73S4gox2uCoWoIL8=

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

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2011-11-26 11:23:50

您的PHP代码正在使用欧洲央行模式。我看不到您在ObjC中设置模式的位置。想必您正在使用它的默认模式。ObjC的默认模式可能不是欧洲央行,更有可能是CBC。还请注意,每当明文是16个字节或更少(即一个块或更少),解密工作。当它大于16个字节(即扩展到第二个块)时,它将失败。

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

欧洲央行的模式是不安全的,并且泄露信息。在指定的IV中使用CBC模式。至少,将PHP代码更改为使用CBC模式而不是ECB模式。

票数 4
EN

Stack Overflow用户

发布于 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)

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8276833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档