【问题标题】:Getting an error in PHP with function mcrypt_cbc()使用函数 mcrypt_cbc() 在 PHP 中出现错误
【发布时间】:2011-07-05 04:51:54
【问题描述】:

我正在使用我制作的这个函数来加密数据:

function encryptCredential($data) {
$key = '9cqkTFHOfOmKn8kt&NSlIK*XMRWWx*tNY$azRdEvm2to*AQOll%8tP18g35H!zNg9l85pgnww$&q6y@1WrWZhKhx&23acq^*FWf*xdnmI%7aWwM6JQLm%tzYG^*8PIh1zD@D5QKa98Gg';
$encryptedData = mcrypt_cbc(MCRYPT_TripleDES, substr($key,0,32), pad($data), MCRYPT_ENCRYPT, substr($key,32,16));
return base64_encode($encryptedData);
}

PHP 然后给我这个警告:

PHP Warning:  mcrypt_cbc() [<a href='function.mcrypt-cbc'>function.mcrypt-cbc</a>]: The IV parameter must be as long as the blocksize in /home/xxxxx/public_html/libraries/global.inc.php on line xx

我的钥匙太长了吗?应该是多少个字符?

【问题讨论】:

  • //start pad unpad functions function pad($text) { // Add a single 0x80 byte and let PHP pad with 0x00 bytes. return pack("a*H2", $text, "80"); //return $text; } function unpad($text) { // Return all but the trailing 0x80 from text that had the 0x00 bytes removed return substr(rtrim($text, "\0"), 0, -1); //return trim($text); } //end pad unpad functions
  • 来自manual :“此函数不应再使用,请参阅 mcrypt_generic() 和 mdecrypt_generic() 进行替换。”

标签: php encryption mcrypt


【解决方案1】:

您正在使用的功能似乎已被贬低,请参阅http://se2.php.net/manual/en/function.mcrypt-cbc.php

这个函数不应该再使用了,替换见 mcrypt_generic() 和 mdecrypt_generic()。

试试这些函数,看看你是否仍然得到错误

【讨论】:

    【解决方案2】:

    您应该在发现弃用警告时注意它们。

    也就是说,TripleDES 的块大小为 8 个字节,但您为 IV 提供了 16 个字节。将您的substr($key,32,16) 更改为substr($key,32,8),它应该可以工作。

    但我仍然建议迁移到新的 API。

    【讨论】:

      【解决方案3】:

      块大小以及 IV 大小为 8 个字节。密钥大小 24 字节。

      您可以通过mcrypt_get_iv_sizemcrypt_get_key_size 获取此信息。

      在 CBC 模式下,对于每条加密消息,IV 必须是唯一且不可预测的。使用mcrypt_create_iv(8) 创建一个合适的。不需要保密,可以和密文一起保存。

      【讨论】:

        【解决方案4】:

        感谢所有帮助。我稍后会修复 IV,但对于任何看到此页面并需要它们的人来说,这里是我的新功能:

        `//启动encryptCredential函数 函数 encryptCredential($data) { $key = '9cqkTFHOfOmKn8kt&NSlIK*XMRWWx*tNY$azRdEvm2to*AQOll%8tP18g35H!zNg9l85pgnww$&q6y@1WrWZhKhx&23acq^*FWf*xdnmI%7aWwM6JQLm%tzYG^*8PIh1zD@D5QKa98g'; $cipher = mcrypt_module_open(MCRYPT_blowfish, '', 'cbc', ''); mcrypt_generic_init($cipher, substr($key,8,56), substr($key,32,8)); $encrypted = mcrypt_generic($cipher, pad($data)); mcrypt_generic_deinit($cipher); 返回 base64_encode($encrypted); } //结束 encryptCredential 函数

        //启动decryptCredential函数 函数解密凭据($数据){ $encryptedData = base64_decode($data); $key = '9cqkTFHOfOmKn8kt&NSlIK*XMRWWx*tNY$azRdEvm2to*AQOll%8tP18g35H!zNg9l85pgnww$&q6y@1WrWZhKhx&23acq^*FWf*xdnmI%7aWwM6JQLm%tzYG^*8PIh1zD@D5QKa98g'; $cipher = mcrypt_module_open(MCRYPT_blowfish, '', 'cbc', ''); mcrypt_generic_init($cipher, substr($key,8,56), substr($key,32,8)); $decrypted = unpad(mdecrypt_generic($cipher, $encryptedData)); mcrypt_generic_deinit($cipher); 返回$解密; } //结束decryptCredential函数`

        【讨论】:

        • 这里是一个带有 iv 和密钥大小的模块列表:
        • cast-128, iv:8, key:16 gost, iv:8, key:32 rijndael-128, iv:16, key:32 twofish, iv:16, key:32 arcfour, iv:, key: cast-256, iv:16, key:32 loki97, iv:16, key:32 rijndael-192, iv:24, key:32 safeplus, iv:16, key:32 wake, iv:,键:blowfish-compat,iv:8,key:56 des,iv:8,key:8 rijndael-256,iv:32,key:32 serpent,iv:16,key:32 xtea,​​iv:8,key: 16 条河豚, iv:8, key:56 enigma, iv:, key: rc2, iv:8, key:128 Tripledes, iv:8, key:24
        猜你喜欢
        • 2016-12-24
        • 1970-01-01
        • 2022-12-11
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 2018-01-18
        • 1970-01-01
        相关资源
        最近更新 更多