C++哈希算法类型识别程序始终返回Unknown问题求助
哈希算法识别程序错误排查与修复
原代码核心问题
- 逻辑完全颠倒:你错误地将输入的哈希字符串当作原始数据,计算它的SHA256哈希后再和原字符串对比——这根本不是哈希算法识别的逻辑。正确逻辑应该是根据输入哈希的长度(十六进制字符串长度对应二进制哈希的字节数)匹配对应算法,再做合法性验证(可选)。
- 仅硬编码支持SHA256:代码只检查了SHA256,完全没处理需求中的MD5、SHA512、SHA3-512等算法。
- 混淆十六进制与二进制长度:输入的哈希是十六进制字符串,比如SHA512的哈希是128个十六进制字符(对应64字节二进制哈希),但你直接拿字符串长度和算法的二进制输出长度对比,两者数值差一倍,导致匹配条件永远不成立。
- 未初始化OpenSSL算法库:缺少必要的算法注册步骤,可能导致部分哈希算法无法被
EVP_get_digestbyname()获取。
修复后的代码
#include <iostream> #include <string> #include <vector> #include <cctype> #include <cstring> #include <openssl/evp.h> // 定义常见哈希算法的名称和对应的十六进制字符串长度 struct HashInfo { const char* name; size_t hex_length; }; const std::vector<HashInfo> hash_algorithms = { {"MD5", 32}, {"SHA1", 40}, {"SHA256", 64}, {"SHA512", 128}, {"SHA3-256", 64}, {"SHA3-512", 128} }; // 辅助函数:检查字符串是否为合法十六进制 bool isHexString(const std::string& s) { for (char c : s) { if (!isxdigit(static_cast<unsigned char>(c))) { return false; } } return true; } std::string determineHashAlgorithm(const std::string& hash) { // 先校验输入是否为合法十六进制格式 if (!isHexString(hash)) { return "Unknown"; } // 遍历所有算法,匹配长度 for (const auto& info : hash_algorithms) { if (hash.length() == info.hex_length) { // 验证算法是否被OpenSSL支持 const EVP_MD* md = EVP_get_digestbyname(info.name); if (md != nullptr) { return info.name; } } } return "Unknown"; } int main(int argc, char* argv[]) { if (argc != 2) { std::cout << "Usage: " << argv[0] << " <hash>\n"; return 1; } // 初始化OpenSSL哈希算法库 OpenSSL_add_all_digests(); std::string hash = argv[1]; std::string algorithm = determineHashAlgorithm(hash); std::cout << "Hash algorithm: " << algorithm << std::endl; // 清理OpenSSL资源 EVP_cleanup(); return 0; }
额外说明
- 对于SHA256和SHA3-256这种长度相同的算法,若需要更精准的区分,可以将输入的十六进制字符串转换为二进制数据,再结合算法特性做进一步验证(比如SHA3的输出具有特定的海绵结构特征)。
- 编译时需要链接OpenSSL库,例如GCC编译命令:
g++ -o myprogram myprogram.cpp -lcrypto
内容的提问来源于stack exchange,提问作者YoYoYo
相关产品推荐
相关产品推荐

