C语言目录加解密工具处理大文件时报digital envelope routines bad decrypt错误
问题排查结论
1 rm删除文件失败原因
你的代码直接通过sprintf(str, "rm %s", abs_path)拼接shell命令执行删除,当文件路径包含空格、特殊符号时,路径会被shell拆分为多个参数,导致rm找不到目标文件。你报错中出现的/home/kali/.mozilla/firefox/Crash就是典型的文件名带空格被截断的情况。
修复方案:
- 更推荐直接使用系统调用
unlink(abs_path),完全规避shell解析的问题,性能更好也更安全 - 如果要保留system调用,需要给路径包裹双引号:
sprintf(str, "rm \"%s\"", abs_path)
2 解密失败(bad decrypt)核心原因
2.1 密钥生成逻辑存在栈缓冲区溢出bug
你在generate_key函数中生成IV时的参数传错:
// 错误写法:传了密钥长度sizeKey作为IV的生成长度 RAND_bytes(iv, sizeKey); // 正确写法:应该传入IV的长度sizeIv RAND_bytes(iv, sizeIv);
你的IV缓冲区大小只有AES_BLOCK_SIZE(16字节),但你传入了AES256密钥对应的长度32字节,直接造成栈缓冲区溢出,溢出的内容会覆盖栈上相邻存储的key变量,导致你转十六进制存储到服务端的key已经被篡改,解密时使用正确的字符串也无法匹配原始密钥,必然出现解密失败。
2.2 解密命令存在参数缺失问题
你执行的解密命令为:
sudo ./main -p /home/kali -d 28924fd9021642cee4002de561b52640
按照你给出的命令格式./main -p PATH -d KEY IV,-d参数后面应该跟随KEY和IV两个参数,但你实际只传了一个32位的十六进制字符串,缺少IV参数,解密时读取的IV是内存中的随机垃圾值,也会直接触发解密失败。
内容的提问来源于stack exchange,提问作者Shenladen
相关产品推荐
相关产品推荐

