当前位置: 首页 > 知识库问答 >
问题:

PHP Mcrypt - 解密功能不适用于一小部分字符串

东方辉
2023-03-14

我知道PHP的mcrypt_decrypt上已经有一百万个帖子,但我找不到一个与我的结果相同的帖子。我有一对简单的加密/解密函数,我想用它来对数据执行双向加密。奇怪的是,对于我输入到函数中的任何随机字符串的大约4%,它不会成功解密。例如,如果我创建一个从0到9999的“for循环”,并加密和解密这些数字的字符串版本,则每次相同的值都会失败,这些值取决于我传递给函数的密钥。我可以传递任何键,尽管失败的特定值会更改,但失败的值的百分比将大致保持不变。

我试过不带IV参数的ECB模式,也试过带IV参数的CBC模式,结果都一样。

以下是我在ECB模式下的加密函数:

function mc_encrypt($string, $mc_key) {
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB));
    $encode = base64_encode($passcrypt);

    return $encode;
}

这是我在ECB模式下的解密功能:

function mc_decrypt($string, $mc_key) {
    $decoded = base64_decode($string);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB));

    return $decrypted;
}

CBC模式版本是相同的,只是它使用mcrypt_create_iv()函数在加密中创建IV,并将其作为解密中的参数传入。

在我的服务器上使用这些函数并带有“abc”作为测试加密密钥,如果我从0运行到300,则以下值将无法正确解密:

4, 6, 70, 145, 151, 176, 237, 254, 275

如果我将加密密钥更改为其他内容,它将正确地改变返回的值,但不会改变返回值的频率。

有什么建议吗???

提前感谢!

共有1个答案

吕承福
2023-03-14

我只是从您的代码中取出了两个< code>trim()调用,它就工作了。基本上,< code>mcrypt_encrypt可能会返回一个带有尾随空字节(\0)的答案,需要保留这些。同样,出于同样的原因,不要将$decoded参数调整为< code>mcrypt_decrypt。当调整来自< code>mcrypt_decrypt的响应时,只使用< code>rtrim。

function mc_encrypt($string, $mc_key) {
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB);
    $encode = base64_encode($passcrypt);

    return $encode;
}

function mc_decrypt($string, $mc_key) {
    $decoded = base64_decode($string);
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, $decoded, MCRYPT_MODE_ECB));

    return $decrypted;
}
 类似资料:
  • 我正在尝试用python中的pycrypto加密/解密。在大多数情况下,事情进展顺利,但在解密数据时,我遇到了一个奇怪的问题。我尝试对一些JPG进行加密/解密以进行测试,尽管它们加密/解密没有问题,但解密的文件无法打开/已损坏。为了找到问题,我保存了一个文本文件,其中有一个类似于“测试这个文件的完整性”之类的随机句子,它只有在“…完整性”之类的内容之后才能正确解密,完整性之前的所有内容仍然是乱码。

  • 我对JPareSposition进行了本机查询,如: 生成的查询如下所示: 几何图形是表中包含空间数据的列。 但跟踪还表明查询存在解析错误: 但当我在数据库中执行查询时,我得到的结果是正确的。 为什么这个不匹配? 我最终可以通过以下方式解决这个问题:

  • 我在一个网站上工作,遇到了一个问题,点击我的“删除”链接会出现一个错误页面。在localhost上运行良好-无法理解为什么在Heroku站点上会有所不同。 有人知道这是怎么回事吗? 我的“图片”控制器: 我的图片/新视图: 以下是我尝试删除图片时的heroku日志(从导航到新图片页面开始(同一视图中的新建和编辑功能): 2015-11-15T16:13:49.189857 00:00 heroku

  • 我正在编辑从tesseract ocr收到的一些电子邮件。 以下是我的代码: 但输出不正确。 输入: 输出: 但是当我在每次替换后将结果赋给一个新的字符串时,它工作得很好。为什么在同一个字符串中连续赋值不起作用?

  • 问题内容: 我有一个这样的字符串:现在我想用实际的换行符替换\ n,这样它将变成 理发师 这是我的代码 但是它不起作用并且给我相同的字符串 问题答案: 您需要做: 该方法在其第一个参数中期望使用正则表达式。当在Java字符串中传递2时,您实际上传递了1。问题是,是一种逃避字符也正则表达式,因此正则表达式是actualy ,所以你需要把额外的两次。

  • 本文向大家介绍使用 node.js 模仿 Apache 小部分功能,包括了使用 node.js 模仿 Apache 小部分功能的使用技巧和注意事项,需要的朋友参考一下 首先,这个例子用到了服务端渲染的技术。服务端渲染,说白了就是在服务端使用模板引擎,这里我先简单的介绍一下服务端渲染与客户端渲染之间的区别。 服务端渲染与客户端渲染之间的区别: 客户端渲染不利于搜索引擎优化 服务端渲染可以被爬虫抓取到