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

Crypto++库HMAC使用问题:无法还原明文及密钥用法困惑

无法通过Crypto++的HMAC还原原始明文的问题解答

兄弟,你这里犯了一个核心的认知错误——HMAC是消息认证码,不是加密解密算法,它从设计之初就不具备还原原始明文的能力!

先给你理清HMAC的核心作用

HMAC的本质是用来做两件事:

  • 验证消息的完整性:确认消息在传输过程中没有被篡改
  • 验证消息的真实性:确认消息确实是持有共享密钥的发送方发出的

它是单向的哈希运算,和MD5、SHA256这类哈希算法一样,只能从明文生成唯一的摘要值,没法反向推导回明文。

正确的HMAC使用流程(结合你的代码)

你的代码已经实现了发送方生成HMAC的逻辑,另一端的正确操作不是“还原明文”,而是用相同的密钥验证HMAC的有效性,步骤如下:

  1. 发送方需要把「明文」和「生成的HMAC值」传给接收方(注意:密钥是双方预先安全约定的,绝对不能明文传输)
  2. 接收方用相同的密钥、相同的哈希算法(SHA256),重新计算收到的明文的HMAC值
  3. 将计算出的HMAC和收到的HMAC对比,如果一致,说明消息没被篡改且来源可信

给你写一段接收方的验证代码,适配你原有的逻辑:

// 接收方获取到的内容:
string receivedPlain = "HMAC Test"; // 从发送方拿到的明文
SecByteBlock key(16); // 双方预先约定好的相同密钥
string receivedMac = "..."; // 从发送方拿到的HMAC值

try {
    HMAC< SHA256 > hmac(key, key.size());
    bool isVerified = false;

    // 使用HashVerificationFilter进行验证
    StringSource ss(receivedPlain + receivedMac, true,
        new HashVerificationFilter(hmac,
            new ArraySink((byte*)&isVerified, sizeof(isVerified))
        )
    );

    if (isVerified) {
        cout << "✅ HMAC验证通过!消息完整且来源可信" << endl;
    } else {
        cout << "❌ HMAC验证失败!消息可能被篡改或密钥错误" << endl;
    }
} catch(const CryptoPP::Exception& e) {
    cerr << "验证出错:" << e.what() << endl;
    exit(1);
}

额外提醒

如果你的需求是加密后能还原明文,那应该用对称加密算法,比如Crypto++里的AES算法(可以搭配CBC、GCM等模式),而不是HMAC。HMAC和加密算法通常是搭配使用的(比如先加密,再对密文生成HMAC),用来同时保证消息的保密性和完整性。

内容的提问来源于stack exchange,提问作者samini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:06