可以从官网下载openssl的源码,然后引用到工程中
1、安装过程建议看这篇
2、安装别人已经编译好的openssl后,检查bin,lib,include,并且在vs工程中配置好项目属性,配置后,应可以查看到如下所示的头文件路径,库目录,附加依赖的lib
在附加依赖项中输入
libssl.lib
libcrypto.lib
3、开始编写加密算法程序
创建一个main.cpp,并且添加对应的头文件
#include <openssl/evp.h>
#include <openssl/sha.h>
#include <openssl/md5.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
4、添加Base64加密函数,该运算过程结果,可以拿网站上的运算结果进行比较,如同样输入参数为hello123,则函数运行结果和网站上的结果,应当一致
Base64编码/解码器,在线解码Base64 (sojson.com)
std::string base64Encode(const std::string& str)
{
BIO* bio, * b64;
BUF_MEM* bufferPtr;
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_write(bio, str.c_str(), str.length());
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bufferPtr);
std::string base64Str(bufferPtr->data, bufferPtr->length);
BIO_free_all(bio);
return base64Str;
}
5、添加sha256加密函数,同上,可以对加密效果进行验证
std::string sha256(const std::string& str) {
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, str.c_str(), str.size());
SHA256_Final(hash, &sha256);
std::string hashStr;
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();
}
6、添加md5加密函数,注意代码相当于选择同网站上32位小写的加密方式
MD5在线加密/解密/破解—MD5在线 (sojson.com)
std::string md5(const std::string& str)
{
unsigned char result[MD5_DIGEST_LENGTH];
MD5((const unsigned char*)str.c_str(), str.length(), result);
std::string hash;
char buf[3];
for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {
sprintf(buf, "%02x", result[i]);
hash.append(buf);
}
return hash;
}
7、添加程序入口验证
设置输入的data为Hello,World!,然后打印加密后的数据,在调试时,经过base64加密后的字符串,还可以通过监控变量查看到,但是在sha256加密和md5加密后的字符串,则无法通过监控变量查看到
std::string encryptDataTime(const std::string& data) {
std::string base64Str = base64Encode(data);
std::string shaHash = sha256(base64Str);
std::string md5Hash = md5(shaHash);
return md5Hash;
}
int main() {
std::string data = "Hello, World!";
std::string encryptedData = encryptDataTime(data);
std::cout << "Encrypted Data: " << encryptedData << std::endl;
return 0;
}
8、编译时可能遇到C4996的问题,提示since openssl 3.0,导致无法按期生成exe,这里可以找到vs项目属性->配置属性->C/C++->常规,然后把将警告是为错误,改为否,再把SDL检查改为否,则可以编译通过
9、补充一个base64解码,因为base64是可以加密再解密,但sha256和md5是不可逆的
该函数可以跟上面的base64加密互相验证,也可以和网站上的结果互相验证
std::string base64Decode(const std::string& input)
{
BIO* bio, * b64;
int decodedLength = 0;
char* decodedData = new char[input.length()];
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bio = BIO_new_mem_buf(input.c_str(), input.length());
bio = BIO_push(b64, bio);
decodedLength = BIO_read(bio, decodedData, input.length());
BIO_free_all(bio);
return std::string(decodedData, decodedLength);
}