mcrypt_encrypt 不同的结果在 php 和 ios

Posted

技术标签:

【中文标题】mcrypt_encrypt 不同的结果在 php 和 ios【英文标题】:mcrypt_encrypt different result in php and ios 【发布时间】:2013-08-10 15:17:29 【问题描述】:

我一直在尝试像这样在 php 5.2 中加密一些东西:

$key = "12345678901234567890123456789012345678901234567890123456";//56 chars
$iv = "12345678";//8 chars
$text = "Nick is pooping.";//16 chars

$enc = mcrypt_encrypt("blowfish", $key, $text, "cbc", $iv);

var_dump($enc); echo "<br>";
var_dump(base64_encode($enc)); echo "<br>";

这是输出:

string(16) "–±–%ê„zÆtȾ R" 
string(24) "lrGWJeofhHrGdMi+BiBSHQ==" 

我在 ios 端使用this,代码如下:

Blowfish* _blowfish = [BlowfishAlgorithm new];
[_blowfish setMode:[BlowfishAlorithm buildModeEnum:@"CBC"]];
[_blowfish setKey:@"12345678901234567890123456789012345678901234567890123456"];
[_blowfish setInitVector:@"12345678"];
[_blowfish setupKey];
NSLog(@"%@",[_blowfish encrypt:@"Nick is pooping."]);

这个输出:

3132333435363738f61e0c4683e55fe061f1951e7a8182be

base64_encode 在 php 中不起作用,我不知道如何匹配它们以使它们输出相同。 :(

【问题讨论】:

我看不到您在 Objective-C 代码中设置了相同的键和初始化向量。 哎呀!我的错——我是手动从 VirtualBox 复制代码,所以我搞砸了——它现在就在那里。 奇怪的事情:如果您将输出解释为十六进制字节,您会得到以下信息:cl.ly/image/2O1Z0H3C0w3L。前 8 个字符是 IV……其余的我不知道。我无法下载您链接到的代码(它要求我注册),我建议您寻找替代实现,以检查该实现是否错误实现。 检查您的字符编码。我敢打赌他们和其他人不一样。 PHP 输出到底是什么——它是什么编码?它看起来像一堆乱码和外语字符。我应该如何将其转换为纯文本?我应该对它进行base64编码还是使用bin2hex或pack?处理这个问题的最标准方法是什么? 【参考方案1】:

要删除这些空字符,您可以使用 rtrim 函数。运行解密后的输出后,它应该是相等的。

更多信息请参考此链接:

https://***.com/a/15352155/516512

【讨论】:

以上是关于mcrypt_encrypt 不同的结果在 php 和 ios的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中将 mcrypt_encrypt 转换为 openssl_encrypt

PHP 7.2 中 mcrypt_encrypt 的完全替代品

.NET WebService 加密 -> PHP 解密错误:mcrypt_encrypt(): IV 参数必须与块大小一样长

php使用内置的mcrypt_encrypt和mcrypt_decrypt进行字符串加密解密

CryptoJS 中 CFB 模式中的 mcrypt_encrypt 函数

为啥 mcrypt_encrypt() 将二进制字符放在我的字符串末尾?