由于工作中涉及到加解密,包括Hash(SHA256)算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法,笔者通过查询发现openssl库以上算法都支持,索性借助openssl库实现上述5类算法。笔者用的openssl库版本为 OpenSSL 1.1.1k 。
Hash(SHA256)算法
算法代码如下:
#include <openssl/sha.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <vector>
// 将字节数组转换为十六进制字符串
// 将字节数组转换为十六进制字符串
std::string bytesToHex(const unsigned char* bytes, size_t length) {
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (size_t i = 0; i < length; ++i) {
ss << std::setw(2) << (int)bytes[i];
}
return ss.str();
}
int main() {
// 原数据
const std::string data = "6572B36A91E28FB900134C3010C445437DC04D04";
// 创建一个SHA256上下文
SHA256_CTX sha256;
SHA256_Init(&sha256);
// 更新上下文以包含要哈希的数据
SHA256_Update(&sha256, data.c_str(), data.size());
// 计算哈希值
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_Final(hash, &sha256);
// 将哈希值转换为十六进制字符串并输出
std::string hashHex = bytesToHex(hash, SHA256_DIGEST_LENGTH);
std::cout << "SHA256 hash: " << hashHex << std::endl;
return 0;
}
运行结果如下:
HMAC_SHA256 算法
算法代码如下:
#include <openssl/hmac.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstring>
// 将字节数组转换为十六进制字符串
std::string bytesToHex(const unsigned char* bytes, size_t length) {
std::stringstream ss;
ss << std::hex << std::setfill('0');
for (size_t i = 0; i < length; ++i) {
ss << std::setw(2) << (int)bytes[i];
}
return ss.str();
}
int main() {
// 要进行HMAC的数据
const std::string data = "374D34303534424E39323330351000FFFFFFFFFF";
// HMAC的密钥
const std::string key = "c0df3585876ac6bb02bf6347b3654993";
// 输出缓冲区
unsigned char* hmacResult = new unsigned char[EVP_MAX_MD_SIZE];
unsigned int hmacLen = 0;
// 使用HMAC_SHA256进行计算
HMAC_CTX* hmacCtx = HMAC_CTX_new();
HMAC_Init_ex(hmacCtx, key.data(), key.size(), EVP_sha256(), NULL);
HMAC_Update(hmacCtx, (unsigned char*)data.data(), data.size());
HMAC_Final(hmacCtx, hmacResult, &hmac