VS2022 + OpenSSL 3.0实现DES、AES、RSA加密

news/2024/12/26 16:10:21/文章来源:https://www.cnblogs.com/Unalome-3301/p/18633270


一、DES加密

#include <openssl/des.h>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <iomanip>
#define MAX_LINE 1024
#pragma warning(disable  : 4996)using namespace std;signed main() {const_DES_cblock key = "0183439";DES_key_schedule schedule;DES_set_key_checked(&key, &schedule);const_DES_cblock input;int cnt = 0;const_DES_cblock de[20];cout << "请输入时每满7字节换行:\n";while (cin >> input && input[0] != '\\') {cnt++;//cout << "Input: " << input << "\n";DES_cblock output;DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);cout << "Encrypted: ";for (int i = 0; i < sizeof(input); i++)cout << setw(2) << setfill('0') << hex << (int)output[i];cout << "\n";DES_ecb_encrypt(&output, &de[cnt], &schedule, DES_DECRYPT);//cout << "Decrypted: " << de << "\n";cout << "\n";}cout << "\n";cout << "Decrypted: ";for (int i = 1; i <= cnt; i++) {cout << de[i] << " ";}cout << "\n";return 0;
}

运行结果
image

二、AES加密

#include <iostream>
#include <random>
#include <string>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/err.h>
#include <openssl/aes.h>
#include <iomanip>
using namespace std;class AESClass {
public:// AES加密函数static string aesEncrypt(string plaintext, string key, string iv);// AES解密函数static string aesDecrypt(string plaintext, string key, string iv);
};class InitClass {
public:// 生成随机数unsigned long long generateRandomNumber();// 生成通用密钥string generateCommonKey();
};// 生成随机数
unsigned long long InitClass::generateRandomNumber() {// 随机数引擎的生成random_device rd;mt19937_64 gen(rd());// 生成16位的随机整数uniform_int_distribution<unsigned long long> dist(1000000000000000ULL, 9999999999999999ULL);return dist(gen);
}// 生成通用密钥
string InitClass::generateCommonKey() {// 随机数引擎的生成random_device rd;mt19937 gen(rd());// 生成16位的随机字符串const string charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";uniform_int_distribution<size_t> dist(0, charset.size() - 1);string result;for (int i = 0; i < 16; ++i) {result += charset[dist(gen)];}return result;
}// AES加密函数
string AESClass::aesEncrypt(string plaintext, string key, string iv) {string ciphertext;EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();// 初始化if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str())) {cout << "加密初始化失败" << endl;return "";}// 获取需要加密的缓冲区大小int ciphertext_len = plaintext.length() + AES_BLOCK_SIZE;unsigned char* encrypted = new unsigned char[ciphertext_len];int len;// 加密if (!EVP_EncryptUpdate(ctx, encrypted, &len, (const unsigned char*)plaintext.c_str(), plaintext.length())) {cout << "加密失败" << endl;return "";}// 完成加密int final_len;if (!EVP_EncryptFinal_ex(ctx, encrypted + len, &final_len)) {cout << "加密完成失败" << endl;return "";}len += final_len;// 将密文转换为字符串ciphertext.assign((char*)encrypted, len);delete[] encrypted;EVP_CIPHER_CTX_free(ctx);return ciphertext;
}// AES解密函数
string AESClass::aesDecrypt(string ciphertext, string key, string iv) {string decryptedText;EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();// 初始化if (!EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, (const unsigned char*)key.c_str(), (const unsigned char*)iv.c_str())) {cout << "解密初始化失败" << endl;return "";}// 获取需要解密的缓冲区大小int decrypted_len = ciphertext.length() + AES_BLOCK_SIZE;unsigned char* decrypted = new unsigned char[decrypted_len];int len;// 解密if (!EVP_DecryptUpdate(ctx, decrypted, &len, (const unsigned char*)ciphertext.c_str(), ciphertext.length())) {cout << "解密失败" << endl;return "";}int plaintext_len = len;// 完成解密int final_len;if (!EVP_DecryptFinal_ex(ctx, decrypted + len, &final_len)) {cout << "解密完成失败" << endl;return "";}plaintext_len += final_len;// 将解密文转换为字符串decryptedText.assign((char*)decrypted, plaintext_len);delete[] decrypted;EVP_CIPHER_CTX_free(ctx);return decryptedText;
}signed main() {AESClass AES;InitClass init;// 要加密的字符串和密钥string inputString;string key = init.generateCommonKey();string iv = to_string(init.generateRandomNumber());// 输入字符串cout << "请输入明文: ";getline(cin, inputString);// cout << "初始化向量: " << iv << endl;// cout << "密钥: " << key << endl;// AES加密string encryptedText = AES.aesEncrypt(inputString, key, iv);if (encryptedText.empty()) {cout << "AES加密失败" << endl;return 1;}cout << "加密后的字符串: " << encryptedText << endl;// AES解密string decryptedText = AES.aesDecrypt(encryptedText, key, iv);if (decryptedText.empty()) {cout << "AES解密失败" << endl;return 1;}cout << "解密后的字符串: " << decryptedText << endl;return 0;
}

运行结果
image

三、RSA加密

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <iostream>
#include <string>
#pragma warning(disable  : 4996)
using namespace std;// 生成RSA密钥对
RSA* createRSAKeyPair() {int keyLength = 2048; // 密钥长度unsigned long e = RSA_F4; // 公钥指数(通常是RSA_F4)RSA* rsa = RSA_generate_key(keyLength, e, NULL, NULL); // 生成密钥if (rsa == NULL) {cerr << "密钥生成失败" << endl;return NULL;}return rsa; // 返回生成的RSA密钥
}// 获取PEM格式的公钥
string getPublicKey(RSA* rsa) {BIO* bio = BIO_new(BIO_s_mem()); // 创建内存BIOPEM_write_bio_RSA_PUBKEY(bio, rsa); // 将公钥写入BIOsize_t pubKeyLen = BIO_pending(bio); // 获取公钥长度char* pubKey = new char[pubKeyLen + 1]; // 分配内存BIO_read(bio, pubKey, pubKeyLen); // 读取公钥pubKey[pubKeyLen] = '\0'; // 确保字符串以NULL结尾string publicKey(pubKey); // 将公钥转换为字符串delete[] pubKey; // 释放内存BIO_free_all(bio); // 释放BIOreturn publicKey; // 返回公钥字符串
}// 获取PEM格式的私钥
string getPrivateKey(RSA* rsa) {BIO* bio = BIO_new(BIO_s_mem()); // 创建内存BIOPEM_write_bio_RSAPrivateKey(bio, rsa, NULL, NULL, 0, NULL, NULL); // 将私钥写入BIOsize_t privKeyLen = BIO_pending(bio); // 获取私钥长度char* privKey = new char[privKeyLen + 1]; // 分配内存BIO_read(bio, privKey, privKeyLen); // 读取私钥privKey[privKeyLen] = '\0'; // 确保字符串以NULL结尾string privateKey(privKey); // 将私钥转换为字符串delete[] privKey; // 释放内存BIO_free_all(bio); // 释放BIOreturn privateKey; // 返回私钥字符串
}// 消息加密
string encryptMessage(RSA* rsa, const string& message) {size_t rsaLen = RSA_size(rsa); // 获取RSA密钥大小unsigned char* encryptedMessage = new unsigned char[rsaLen]; // 分配内存int result = RSA_public_encrypt(message.length(), // 公钥加密reinterpret_cast<const unsigned char*>(message.c_str()), // 原始消息encryptedMessage, // 加密后的消息rsa,RSA_PKCS1_PADDING); // 使用PKCS#1填充if (result == -1) { // 加密失败char* err = new char[130];ERR_load_crypto_strings();ERR_error_string(ERR_get_error(), err);cerr << "加密失败 " << err << endl;delete[] err;return "";}string encryptedString(reinterpret_cast<char*>(encryptedMessage), result); // 将加密后的消息转换为字符串delete[] encryptedMessage; // 释放内存return encryptedString; // 返回加密后的字符串
}// 消息解密
string decryptMessage(RSA* rsa, const string& encryptedMessage) {size_t rsaLen = RSA_size(rsa); // 获取RSA密钥大小unsigned char* decryptedMessage = new unsigned char[rsaLen]; // 分配内存int result = RSA_private_decrypt(encryptedMessage.length(), // 私钥解密reinterpret_cast<const unsigned char*>(encryptedMessage.c_str()), // 加密后的消息decryptedMessage, // 解密后的消息rsa,RSA_PKCS1_PADDING); // 使用PKCS#1填充if (result == -1) { // 解密失败char* err = new char[130];ERR_load_crypto_strings();ERR_error_string(ERR_get_error(), err);cerr << "解密失败" << err << endl;delete[] err;return "";}string decryptedString(reinterpret_cast<char*>(decryptedMessage), result); // 将解密后的消息转换为字符串delete[] decryptedMessage; // 释放内存return decryptedString; // 返回解密后的字符串
}signed main() {// 生成密钥对RSA* rsa = createRSAKeyPair();if (rsa == NULL) {return -1;}string message;// 输入明文字符串cout << "请输入明文:";getline(cin, message);// 获取并显示公钥和私钥string publicKey = getPublicKey(rsa);string privateKey = getPrivateKey(rsa);// cout << "\n公钥:\n" << publicKey << endl;// cout << "私钥:\n" << privateKey << endl;string encryptedMessage = encryptMessage(rsa, message);cout << "加密后的字符串:\n" << encryptedMessage << "\n" << endl;// 解密消息string decryptedMessage = decryptMessage(rsa, encryptedMessage);cout << "解密后的字符串:\n" << decryptedMessage << endl;// 释放RSA对象RSA_free(rsa);return 0;
}

运行结果
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SARscape洪水分类工具使用说明

SARscape6.1新增洪水分类工具,可以从多时相SAR数据提取洪水信息。工具主要使用了模糊分类技术——模糊C均值分类器(FCM),可加入坡度参数去除阴影的影响。 本文以洪水前后哨兵1数据为例,介绍洪水分类工具的使用。如下图为洪水发生前后两期已经经过预处理的后向散射系数图像…

汽车以旧换新政策的数字化协同解决方案

随着《汽车以旧换新补贴政策》的落地实施,汽车市场迎来了新的增长机遇。政策驱动与市场竞争的双重压力下,如何在短时间内整合资源、抢占市场先机,成为汽车经销商和销售团队的共同挑战。借助在线协同工具,企业能够打破部门与组织边界,实现从政策到执行全流程的高效管理,为…

36MT160-ASEMI开关电源整流方桥36MT160

36MT160-ASEMI开关电源整流方桥36MT160编辑:ll 36MT160-ASEMI开关电源整流方桥36MT160 型号:36MT160 品牌:ASEMI 封装:D-63 特性:插件整流方桥 正向电流:35A 反向耐压:1600V 恢复时间:>2000ns 引脚数量:5 芯片个数:4 芯片尺寸:50MIL 浪涌电流:500A 漏电流:>10…

java8--方法--格式化输出--printf

System.out.printf("%,.2f",10000.0 / 3.0); 效果图:ps: 在分隔符后可以指定字符串长度 System.out.printf("%,10.2f",10000.0 / 3.0); 效果图:

JDBC核心6步

1JDBC简介 java DataBase Connectivity,又称java数据库连接是独立于任何数据库管理系统的api java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现封装成jar文件,也就是我们俗称的数据库驱动jar包 学习JDBC,充分体现了面向接口编程的好处2.JDBC核心6步 1.注册…

【python应用】基于 Python 的远程管理工具:PyChi 远程管理系统

一、引言 在现代 IT 环境中,远程管理工具是开发者和运维人员必不可少的利器。本文将为大家介绍一个基于 Python 构建的多功能远程管理工具 PyChi,它能够让你轻松地对远程客户端进行管理操作,包括文件管理、系统命令执行、截图、录音等功能。二、软件简介 PyChi 是一个基于异…

Hexo-Github-pages-实现个人博客

Hexo + Github pages 实现个人博客 一、过程总览和回顾 我是新手,2024/12/21号尝试着自己搭建自己的个人博客网站,起初是只想着在自己本地电脑环境上搭建 一开始使用了Hugo,据说是世界上最快的静态网页生成器,但是捣鼓了一个下午,无功而返第一个原因:阅读官方文档不够仔细…

AI智能分析视频分析网关热知识:视频分析技术如何帮助提升城市公共安全?

城市公共安全是社会发展的重要基础,而视频分析技术的应用为提升这一领域的效率和效果提供了强有力的支持。随着城市化进程的加快,公共安全面临的挑战日益增多,如何有效监控和管理城市环境中的安全隐患,已成为城市管理者亟待解决的问题。接下来,我们将详细探讨视频分析技术…

quietflow.js-jquery背景层动画插件

quietflow.js是一款可以制作炫酷页面背景层动画效果的jquery插件。该jquery插件内置了9种不同效果的背景层动画,你可以为页面轻松的添加背景动画效果。 可用的背景层动画效果有:squareFlash vortex bouncingBalls shootingLines simpleGradient starfield layeredTriangles c…

用echarts绘制的相关地图,热力图层,点,背景等都可修改

实际项目中用echarts绘制的相关地图,热力图层,点,背景等都可修改,点位可点击。 注意事项: 项目中安装的echarts版本必须是4.9.0的,"echarts": "^4.9.0", "echarts-countries-js": "^1.0.5", "echarts-gl": "^1.1…

在Lazarus下的Free Pascal编程教程——在Lazarus中使用计时器组件TTimer

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。 了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版) VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发…