Windows用户层使用指令操作内核程序执行指令! (9)应用加密算法

与Windows驱动开发中加密思路类似,但是在使用我的代码前,你必须正确安装OpenSSL

在安装完之后把其lib文件导入visual studio 根据自己安装目录定

同时也要将OpenSSL的两个dll文件放在文件目录

接下来就是代码

encryption.h

#pragma once
#include <iostream>
#include <openssl/md5.h>
#include <openssl/evp.h>
#include <openssl/aes.h>

#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")

//自己定义Aes的key和iv一定要16位
#define KEY "xxxxxxxxxxxxxxxx"
#define KEY_IV "xxxxxxxxxxxxxxxx"
#define KEY_SIZE 16
#define IV_SIZE 16

namespace encryption {
	std::string md5(std::string str);
	std::string base64_encode(std::string str);
	std::string aes_encrypt(std::string str);

	std::string encrypt(std::string str);
}

encryption.cpp

#include "encryption.h"

std::string encryption::md5(std::string str)
{
    unsigned char digest[16]; // MD5哈希值的大小固定为16字节
    unsigned int digestLength = sizeof(digest);

    EVP_MD_CTX* context = EVP_MD_CTX_new();
    if (!context) {
        // 处理错误
        return "";
    }

    if (EVP_DigestInit_ex(context, EVP_md5(), NULL) != 1) {
        // 处理错误
        EVP_MD_CTX_free(context);
        return "";
    }

    if (EVP_DigestUpdate(context, str.c_str(), str.size()) != 1) {
        // 处理错误
        EVP_MD_CTX_free(context);
        return "";
    }

    if (EVP_DigestFinal_ex(context, digest, &digestLength) != 1) {
        // 处理错误
        EVP_MD_CTX_free(context);
        return "";
    }

    EVP_MD_CTX_free(context);

    // 将digest转换为字符串
    char md5String[33];
    for (unsigned int i = 0; i < digestLength; ++i) {
        //sprintf(&md5String[i * 2], "%02x", digest[i]);
        sprintf_s(&md5String[i * 2], 3, "%02X", digest[i]);
    }
    md5String[32] = '\0';
    return std::string(md5String);
}

std::string encryption::base64_encode(std::string str)
{
    BIO* b64 = BIO_new(BIO_f_base64());
    BIO* bmem = BIO_new(BIO_s_mem());
    BIO_push(b64, bmem);
    BIO_write(b64, str.c_str(), str.size());
    BIO_flush(b64);
    char* buffer = NULL;
    long length = BIO_get_mem_data(bmem, &buffer);
    std::string result(buffer, length);
    BIO_free_all(b64);
    return result;
}

std::string encryption::aes_encrypt(std::string str) {
    // 确保密钥和 IV 的长度正确
    unsigned char key[16]; // 128-bit key
    unsigned char iv[16];  // 16-byte IV

    // 假设 KEY 和 KEY_IV 是已经定义的常量或变量
    std::memcpy(key, KEY, sizeof(key));
    std::memcpy(iv, KEY_IV, sizeof(iv));

    // 创建 EVP_CIPHER_CTX
    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();
    if (!ctx) {
        throw std::runtime_error("EVP_CIPHER_CTX_new failed");
    }

    // 初始化加密操作
    if (EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), nullptr, key, iv) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("EVP_EncryptInit_ex failed");
    }

    // 计算填充长度
    int len = str.length();
    int pad = 16 - (len % 16);
    std::string pad_str(pad, pad);
    str += pad_str;

    // 准备输入和输出缓冲区
    unsigned char* in = (unsigned char*)str.c_str();
    unsigned char out[1024];
    int out_len = 0, final_len = 0;

    // 加密更新
    if (EVP_EncryptUpdate(ctx, out, &out_len, in, len + pad) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("EVP_EncryptUpdate failed");
    }

    // 加密完成
    if (EVP_EncryptFinal_ex(ctx, out + out_len, &final_len) != 1) {
        EVP_CIPHER_CTX_free(ctx);
        throw std::runtime_error("EVP_EncryptFinal_ex failed");
    }

    // 释放 EVP_CIPHER_CTX
    EVP_CIPHER_CTX_free(ctx);

    // 返回 Base64 编码的结果
    std::string result = base64_encode(std::string((char*)out, out_len));
    return result;
}

std::string encryption::encrypt(std::string str)
{
    return md5(aes_encrypt(str));
}

可以根据自己喜爱添加加密算法

Windows用户层使用指令操作内核程序执行指令! (10) 应用程序入口和演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值