PHP Mcrypt - Decrypt函数不适用于一小部分字符串

 mobiledu2502860643 发布于 2023-02-03 10:28

我知道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 个回答
  • 我刚从trim()你的代码中接过两个电话,它就可以工作了.基本上,mcrypt_encrypt可能会返回一个尾随空字节(\ 0)的答案,需要保留那些.另外,mcrypt_decrypt出于同样的原因,不要修剪$ decoding参数.当修剪响应时mcrypt_decrypt,仅使用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;
    }
    

    2023-02-03 10:29 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有