You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中mcrypt_encrypt返回空值,TripleDES密钥大小不支持问题排查

解决mcrypt_encrypt返回空值的问题

嘿,看你遇到的这个问题,其实错误提示已经把核心原因说得明明白白啦——TripleDES(3DES)算法要求密钥长度必须是24字节,但你的密钥不符合这个要求,才导致加密失败返回空值!

问题分析

你的代码里,$secret = 'der102rtv1'是9个字符的字符串,经过base64_decode()处理后得到的是7字节的内容,远小于TripleDES要求的24字节密钥长度,这直接触发了mcrypt的报错:Warning: mcrypt_encrypt(): Key of size 7 not supported by this algorithm. Only keys of size 24 supported,最终导致加密结果为空。

解决方案

1. 生成符合要求的密钥

有两种常见的处理方式:

  • 直接生成24字节随机密钥:这是最安全的方式,比如用openssl_random_pseudo_bytes()生成:
    $key = openssl_random_pseudo_bytes(24);
    
    生成后要把密钥妥善保存,解密时需要用同一个密钥。
  • 基于现有secret扩展密钥:如果必须使用现有的$secret,可以通过哈希函数将其扩展到24字节,比如用SHA-256哈希后截取前24字节:
    $key = substr(hash('sha256', $secret, true), 0, 24);
    

2. 修正后的完整代码示例

下面是用哈希扩展密钥后的完整加密代码:

$secret = 'der102rtv1';
$data = '24000441;82;100';

// 基于secret生成24字节的有效密钥
$key = substr(hash('sha256', $secret, true), 0, 24);

$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);

$encrypt = base64_encode(mcrypt_encrypt('tripledes', $key, $data, 'ecb'));
echo $encrypt;

3. 额外建议:使用更安全的加密模式

ECB模式是不安全的加密模式(相同明文会生成相同密文),建议改用CBC模式,同时需要生成随机的初始化向量(IV):

$secret = 'der102rtv1';
$data = '24000441;82;100';

$key = substr(hash('sha256', $secret, true), 0, 24);
$blockSize = mcrypt_get_block_size('tripledes', 'cbc');
// 生成随机IV,长度与块大小一致
$iv = mcrypt_create_iv($blockSize, MCRYPT_DEV_URANDOM);

$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);

// 加密时带上IV,解密时需要用到同一个IV
$encrypt = base64_encode($iv . mcrypt_encrypt('tripledes', $key, $data, 'cbc', $iv));
echo $encrypt;

4. 长远建议:替换为openssl扩展

mcrypt扩展在PHP7.1之后已经被废弃,虽然你当前使用的PHP5.6还能运行,但如果之后升级PHP版本,建议切换到openssl_encrypt和openssl_decrypt函数,兼容性更好且安全性更高。

内容的提问来源于stack exchange,提问作者Saber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:52