C++开发环境,OPENSSL加密函数在工程中引用

可以从官网下载openssl的源码,然后引用到工程中

1、安装过程建议看这篇

保姆级OpenSSL下载及安装教程-CSDN博客

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加密函数,同上,可以对加密效果进行验证

SHA256加密在线工具 - Coding.Tools


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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值