gpt4 book ai didi

PHP:mcrypt 将字符串的开头损坏为垃圾

转载 作者:行者123 更新时间:2023-12-02 04:35:31 25 4
gpt4 key购买 nike

我需要在服务器端进行中度到强度的加密,所以我想我会在 PHP 中使用 mcrypt。如果我使用下面的函数,原始字符串的开头在解密后会变成二进制垃圾。 (这不是获取附加额外垃圾的常见问题,而是我的字符串更改了。)根据文档,mcrypt_encrypt()应该填充足够的字符以匹配所选算法的 block 大小,但我怀疑它不起作用。

但是,如果我手动将其填充到 Rijndael 的 128 位(16 字节) block 大小,它也不起作用。我可以让它工作的唯一方法是在前面添加一些足够长的字符串(可能)覆盖垃圾 block ,并在该字符串和我的数据之间添加一个已知的前缀,如“DATA#”。解密后,该 block 已部分损坏,但我的前缀和之后的所有数据已被正确解密。

$GLOBALS['encryptionmarker'] = 'DATA#';

function encrypt($plain, $key) {
/*
// workaround because beginning of decrypted string is being mangled
// so we simply prefix with some text plus marker
$prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
$plain = $prefix.$plain;
*/

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));

return $encrypted;
}

function decrypt($encrypted, $key) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));

/*
// workaround: remove garbage
$pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
$decrypted = trim(substr($decrypted, $pos + strlen($GLOBALS['encryptionmarker'])));
*/

return $decrypted;
}

我的功能出了什么问题?为什么我必须为我的数据添加这样的前缀(我认为这是一个肮脏的解决方法,所以我想修复它)?

存储加密数据不是问题;加密后立即解密而不将其存储到数据库会导致相同的错误。

最佳答案

你的问题是你正在接收端生成一个新的、不同的、随机的 IV。正如您所见,这不起作用。

接收方需要知道发送方使用的IV;因此您必须将其与加密数据一起发送并将其传递给 mcrypt_decrypt()

请注意,您还必须使用 mhash() 和 key (与加密 key 不同的 key )来生成消息的 HMAC,并在接收端检查它。如果您不这样做,中间人就可以在您检测不到的情况下轻松修改您的部分消息。

关于PHP:mcrypt 将字符串的开头损坏为垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1321669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com