基于OpenSSL实现二进制字节转SHA256的C++代码适配需求
适配OpenSSL SHA256函数处理二进制字节输入
我完全懂你的感受——刚上手OpenSSL时,很容易踩中“字符串哈希”和“原始字节哈希”的坑,花两天才发现差异太正常了!你原来的函数是把字符串的字符编码(比如ASCII)当作输入来计算哈希,但你需要的是直接处理原始二进制字节序列,我这就帮你修改函数:
修改后的二进制字节SHA256哈希函数
#include <openssl/sha.h> #include <sstream> #include <iomanip> #include <string> std::string sha256_bytes(const unsigned char* bytes, size_t length) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); // 直接传入二进制字节数组和长度,而非字符串的c_str() SHA256_Update(&sha256, bytes, length); SHA256_Final(hash, &sha256); std::stringstream ss; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]); } return ss.str(); }
关键差异说明
- 你的原函数用
str.c_str()和str.size(),本质是把字符串的文本字符编码(比如每个'0'/'1'对应ASCII码0x30/0x31)作为哈希输入,这就是为什么你得到的是文本哈希结果2d7ffa3c8f9c3fc043045f2564101eabf80bcdb983d1d560b6b93f52ea824942 - 修改后的函数直接接收
unsigned char*类型的二进制字节指针和字节长度,完全按照原始字节值计算哈希,和你想要的正确结果5e5c92432e692f803539715bb624cd2e35b5b491c6bc67aee87ae82600dedf12匹配
使用示例
假设你已经把二进制字符串(10111110011001010101110111001111010100011111011010110001110101111011110111000101101001100011110100010100011101000011011011100000)转换成了实际的二进制字节数组,比如:
// 示例:将二进制字符串转成字节数组(你需要根据自己的二进制数据来源调整) std::string binary_str = "10111110011001010101110111001111010100011111011010110001110101111011110111000101101001100011110100010100011101000011011011100000"; std::vector<unsigned char> bytes; for (size_t i = 0; i < binary_str.size(); i += 8) { std::string byte_str = binary_str.substr(i, 8); unsigned char byte = static_cast<unsigned char>(std::stoul(byte_str, nullptr, 2)); bytes.push_back(byte); } // 调用哈希函数 std::string result = sha256_bytes(bytes.data(), bytes.size()); // 此时result就是你需要的正确哈希值
如果你的二进制数据已经存在std::string里(注意这里的string是二进制容器,不是文本字符串),也可以这样调用:
std::string binary_data; // 存储原始二进制字节 std::string result = sha256_bytes(reinterpret_cast<const unsigned char*>(binary_data.data()), binary_data.size());
内容的提问来源于stack exchange,提问作者CsgoTalks Com
相关产品推荐
相关产品推荐

