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
相关产品推荐
相关产品推荐

