【发布时间】:2016-09-27 09:27:53
【问题描述】:
我有一个字符串,我需要使用 C++ 和 Crypto++ 在 HMAC 256 中进行编码。来自库wiki的代码:
AutoSeededRandomPool prng;
SecByteBlock key(16);
prng.GenerateBlock(key, key.size());
string plain = "HMAC Test";
string mac, encoded;
/*********************************\
\*********************************/
// Pretty print key
encoded.clear();
StringSource ss1(key, key.size(), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "key: " << encoded << endl;
cout << "plain text: " << plain << endl;
/*********************************\
\*********************************/
try
{
HMAC< SHA256 > hmac(key, key.size());
StringSource ss2(plain, true,
new HashFilter(hmac,
new StringSink(mac)
) // HashFilter
); // StringSource
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}
/*********************************\
\*********************************/
// Pretty print
encoded.clear();
StringSource ss3(mac, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource
cout << "hmac: " << encoded << endl;
该示例提供了工作,但似乎做了很多。我要做的就是:
- 取一个字符串:“GreatWallOfChina”
- 键:m2hspk1ZxsjlsDU6JhMvD3TQQhm+zOwab3slKEILoSSnfk3b2+NUyeJiCrRAJ/D3V5y+QDZaIqRx9q9siMopaA==
- 将密钥转换为 base64:bTJoc3BrMVp4c2psc0RVNkpoTXZEM1RRUWhtK3pPd2FiM3NsS0VJTG9TU25mazNiMitOVXllSmlDclJBSi9EM1Y1eStRRFphSXFSeDlxOXNpTW9wYUE9PQ==
- 使用该 base64 密钥创建 hmac256。
所以,我的问题是,以上示例代码中的所有步骤都是必需的吗? (字节块声明、十六进制编码等)
抱歉,如果这是一个非常愚蠢的问题。
【问题讨论】:
-
第 2 步是 Base64 编码的十六进制数据: 9B 68 6C A6 4D 59 C6 C8 E5 B0 35 3A 26 13 2F 0Fc74 D0 42 19 BE CC EC 1A 6F 7B 25 28 42 0B A1 24 A7 7E 4D DB DB E3 54 C9 E2 62 0A B4 40 27 F0。第 3 步 Base64 编码的第 2 步。这没有任何意义。
-
@zaph 我理解你的困惑。我应该详细说明一下。 [link]docs.gdax.com/#logon [/link] - 寻求建立与 gdax/coinbase 的修复连接。作为登录的一部分,您必须使用由消息的某些内容组成的字符串对您发送的消息进行签名。他们提供了一个 nodejs 示例,该示例似乎将提供的加密密钥转换为 base64。然后用它来生成hmac。可悲的是,这就是我的逻辑的来源。此外,他们所说的只是:“没有尾随分隔符。RawData 字段应该是 HMAC 签名的 base64 编码。”
标签: c++ cryptography hmac crypto++