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

C++哈希算法类型识别程序始终返回Unknown问题求助

哈希算法识别程序错误排查与修复

原代码核心问题

  1. 逻辑完全颠倒:你错误地将输入的哈希字符串当作原始数据,计算它的SHA256哈希后再和原字符串对比——这根本不是哈希算法识别的逻辑。正确逻辑应该是根据输入哈希的长度(十六进制字符串长度对应二进制哈希的字节数)匹配对应算法,再做合法性验证(可选)。
  2. 仅硬编码支持SHA256:代码只检查了SHA256,完全没处理需求中的MD5、SHA512、SHA3-512等算法。
  3. 混淆十六进制与二进制长度:输入的哈希是十六进制字符串,比如SHA512的哈希是128个十六进制字符(对应64字节二进制哈希),但你直接拿字符串长度和算法的二进制输出长度对比,两者数值差一倍,导致匹配条件永远不成立。
  4. 未初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:27