#include <openssl/evp.h> #include <string.h>

std::string encryptByAES(std::string input, std::string key) { // 算法 const EVP_CIPHER* cipher = EVP_aes_128_ecb(); const int key_length = EVP_CIPHER_key_length(cipher); const int iv_length = EVP_CIPHER_iv_length(cipher);

// 创建EVP_CIPHER_CTX对象
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();

// 初始化加密
EVP_EncryptInit_ex(ctx, cipher, NULL, (const unsigned char*)key.c_str(), NULL);

// 加密数据
int input_length = input.length();
int block_size = EVP_CIPHER_block_size(cipher);
int output_length = input_length + block_size;
unsigned char* output = new unsigned char[output_length];
int output_length_actual = 0;
EVP_EncryptUpdate(ctx, output, &output_length_actual, (const unsigned char*)input.c_str(), input_length);

// 结束加密
int final_output_length = output_length - output_length_actual;
unsigned char* final_output = new unsigned char[final_output_length];
EVP_EncryptFinal_ex(ctx, final_output, &final_output_length);

// 合并加密结果
unsigned char* result = new unsigned char[output_length_actual + final_output_length];
memcpy(result, output, output_length_actual);
memcpy(result + output_length_actual, final_output, final_output_length);

// 转换为16进制字符串
std::string hex_result;
for (int i = 0; i < output_length_actual + final_output_length; ++i) {
    char hex_byte[3];
    sprintf(hex_byte, "%02x", result[i]);
    hex_result += hex_byte;
}

// 释放内存
delete[] output;
delete[] final_output;
delete[] result;
EVP_CIPHER_CTX_free(ctx);

return hex_result;

}

// Java 代码示例 public static String encryptByAES(String input, String key) throws Exception { // 算法 String algorithm = 'AES'; String transformation = 'AES'; // Cipher:密码,获取加密对象 // transformation:参数表示使用什么类型加密 Cipher cipher = Cipher.getInstance(transformation); // 指定秘钥规则 // 第一个参数表示:密钥,key的字节数组 长度必须是16位 // 第二个参数表示:算法 SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm); // 对加密进行初始化 // 第一个参数:表示模式,有加密模式和解密模式 // 第二个参数:表示秘钥规则 cipher.init(Cipher.ENCRYPT_MODE,sks); // 进行加密 byte[] bytes = cipher.doFinal(input.getBytes()); return bytesToHexString(bytes); }

private static String bytesToHexString(byte[] sources) { if (sources == null) return null; StringBuilder stringBuffer = new StringBuilder(); for (byte source : sources) { String result = Integer.toHexString(source & 0xff); if (result.length() < 2) { result = '0' + result; } stringBuffer.append(result); } return stringBuffer.toString(); }

QT+openssl实现AES加密:Java代码与C++实现对比

原文地址: https://www.cveoy.top/t/topic/nQQo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录