【发布时间】:2023-03-09 10:13:01
【问题描述】:
这个 C# 代码:
string code_verifier = "xe-V-ykFyCazK3jCWwqRCZHKAKJ0MqdZs8F6xenxjFE";
byte[] sha256verifier = sha256(code_verifier);
string code_challenge = base64urlencodeNoPadding(sha256verifier);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < sha256verifier.Length; i++)
builder.Append(sha256verifier[i].ToString("x2"));
output("code_verifier: " + code_verifier);
output("builder: " + builder.ToString());
output("code_challenge: " + code_challenge);
产生这些结果:
code_verifier: xe-V-ykFyCazK3jCWwqRCZHKAKJ0MqdZs8F6xenxjFE
builder: 8b6526951bf46153a9a276be579ee1070f86e0812fbde8b8c37a3e64c3368525
code_challenge: i2UmlRv0YVOpona-V57hBw-G4IEvvei4w3o-ZMM2hSU
我正在尝试使用 poco 在 C++ 中做同样的事情,这是我的代码:
std::string verifier_ = "xe-V-ykFyCazK3jCWwqRCZHKAKJ0MqdZs8F6xenxjFE";
std::string sha256verifier = sha256(verifier_);
std::stringstream ss;
Poco::Base64Encoder b64enc(ss, Poco::BASE64_URL_ENCODING || Poco::BASE64_NO_PADDING);
b64enc << sha256(sha256verifier);
std::string challenge = ss.str();
cout << "verifier: " << verifier_ << endl;
cout << "sha256verifier: " << sha256verifier << endl;
cout << "challenge: " << challenge << endl;
结果是:
verifier: xe-V-ykFyCazK3jCWwqRCZHKAKJ0MqdZs8F6xenxjFE
sha256verifier: 8b6526951bf46153a9a276be579ee1070f86e0812fbde8b8c37a3e64c3368525
challenge: YTIzY2U1YTYxY2IwMTU0ZmFhZjU1ZWY2ZDEyNGYzZjE3MjQzN2M1MTExNmRiZTY1ZDU1ZTc1NWY2ZjMyNjZi
C# sha256() 函数返回一个 32 元素字节数组,base64urlencodeNoPadding 将其转换为 32 个字符的字符串。
C++ sha256() 函数返回由 Poco::Base64Encoder 转换为与 C# 字符串无关的 64 元素字符串的相同数据的 32 元素十六进制编码字符串。
如何从 C++ 中获得与从 C# 中获得的结果相同的结果?
这是我的 poco sha256 函数
std::string::sha256(std::string buffer) {
Poco::Crypto::RSAKey key(Poco::Crypto::RSAKey::KL_2048,
Poco::Crypto::RSAKey::EXP_LARGE);
Poco::Crypto::RSADigestEngine eng(key, "SHA256");
eng.update(buffer.c_str(), buffer.size());
const auto& sig = eng.digest(); // We just want the digest, unsigned.
return Poco::DigestEngine::digestToHex(sig);
}
【问题讨论】:
-
我使用了两个结果相同的 sha256 函数,zedwood.com/article/cpp-sha256-function 和 Poco::Crypto::RSADigestEngine
-
如您所见,该函数在末尾执行
return Poco::DigestEngine::digestToHex,从而向您返回一个十六进制字符串。 -
那么我可以从中获取一个 char 数组吗?如果可以的话,我如何从中生成一个 Base64URL 编码的字符串?
标签: c++ encryption poco