C++使用libtomcrypt生成SHA3等哈希时偶发截断问题求助
问题根因
- 你遇到的截断问题和libtomcrypt本身无关,是C++
std::string构造逻辑的问题:- 你使用的
string(reinterpret_cast<char*>(hashResult))构造函数,会把输入的char*当做以'\0'(即0x00字节)结尾的C风格字符串处理,一旦哈希结果中出现0值字节,就会被判定为字符串结束,后续内容直接被截断,完全符合你定位到的「遇到1字节零就截断」的特征。
- 你使用的
- 额外隐藏问题:你动态申请的
hashResult数组没有释放,存在内存泄漏风险。
修复方案
修改hashSHA3_512函数中二进制哈希转字符串的逻辑,手动指定哈希结果的长度,避免依赖终止符判定长度,同时优化内存管理:
#include <vector> #include <string> // 保留原有libtomcrypt相关头文件引入 std::string hashSHA3_512(const std::string& input) { // 用vector代替动态数组,自动管理内存,避免泄漏 std::vector<unsigned char> hashResult(sha3_512_desc.hashsize); hash_state md; sha3_512_init(&md); sha3_process(&md, reinterpret_cast<const unsigned char*>(input.c_str()), input.size()); sha3_done(&md, hashResult.data()); // 关键修复:使用带长度参数的string构造函数,传入完整的哈希长度 std::string stringifiedHash(reinterpret_cast<char*>(hashResult.data()), hashResult.size()); return stringToHex(stringifiedHash); }
验证说明
修改后所有哈希结果的64字节都会被完整传入转十六进制函数,不会因为中间出现0值字节被截断,所有SHA系列算法的场景都可以复用该修复逻辑。
内容的提问来源于stack exchange,提问作者Emilio Gennaro
相关产品推荐
相关产品推荐

