20.3 OpenSSL 对称AES加解密算法
AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以128比特为一个分组进行加密,其密钥长度可以是128比特、192比特或256比特,因此可以提供不同等级的安全性。该算法采用了替代、置换和混淆等技术,以及多轮加密和密钥扩展等机制,使得其加密效果优秀,安全性高,被广泛应用于各种领域中,如数据加密、文件加密、网络安全等。
AES算法加密和解密使用的密钥是相同的,该算法加密和解密速度较快,适用于对大量数据进行加密解密的场景。在实际应用中,通常采用混合加密方式,即使用RSA算法加密对称加密算法中的密钥,再使用对称加密算法加密数据,以保证数据的机密性和加密解密的效率。
AES算法常用两种加密模式,即CBC和ECB模式,它们分别具有不同的优缺点。
-
ECB(Electronic Codebook,电子密码本)模式是最简单的分组密码工作模式,将每个明文块独立加密,同样的密钥加密同样的明文块得到的密文也是一样的,因此容易被攻击者利用重复的密文进行分析破解。ECB模式加密效率高,适用于短报文加密,但不适用于长报文加密。
-
CBC(Cipher Block Chaining,密码块链)模式是一种分组密码工作模式,先将明文分组,然后对每个分组进行加密,加密时使用上一块密文作为输入,因此相同的明文块在不同位置上得到的密文是不同的,可以防止被攻击者利用重复的密文进行分析破解。CBC模式加密效率较低,但适用于长报文加密,因为不同的明文块之间互相影响,增加了安全性。
在实际应用中,通常采用CBC模式进行加密,因为它比ECB模式更安全,但加密效率较低。此外,还有其他的加密模式,如CFB、OFB、CTR等,不同的加密模式适用于不同的场景,需要根据实际需求进行选择。
OpenSSL库提供了对AES加密的支持,但在使用时读者还是需要自行封装一些通用加解密函数,如下代码片段是笔者常用的一些函数总结,其中aes_cbc_encrypt函数用于使用CBC模式对特定字符串加密,aes_cbc_decrypt则使用CBC模式对字符串进行解密,第二个函数AES函数则是使用OpenSSL库默认的加解密函数二次封装实现的。
#include <iostream>
#include <openssl/err.h>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <openssl/pem.h>extern "C"
{
#include <openssl/applink.c>
}#pragma comment(lib,"libssl_static.lib")
#pragma comment(lib,"libcrypto.lib")// CBC模式加密
int aes_cbc_encrypt(char* in, char* key, char* out)
{if (!in || !key || !out)return 0;unsigned char iv[AES_BLOCK_SIZE];for (int i = 0; i < AES_BLOCK_SIZE; ++i)iv[i] = 0;AES_KEY aes;if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0){return 0;}int len = strlen(in);AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_ENCRYPT);return 1;
}// CBC模式解密
int aes_cbc_decrypt(char* in, char* key, char* out)
{if (!in || !key || !out)return 0;// 加密的初始化向量unsigned char iv[AES_BLOCK_SIZE];// iv一般设置为全0for (int i = 0; i < AES_BLOCK_SIZE; ++i)iv[i] = 0;AES_KEY aes;if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0){return 0;}int len = strlen(in);AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, len, &aes, iv, AES_DECRYPT);return 1;
}// 将加密与解密整合在一起
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{if (strcmp(Type, "encode") == 0){AES_KEY AESEncryptKey;AES_set_encrypt_key(key, 256, &AESEncryptKey);AES_encrypt(InBuff, OutBuff, &AESEncryptKey);}else if (strcmp(Type, "decode") == 0){AES_KEY AESDecryptKey;AES_set_decrypt_key(key, 256, &AESDecryptKey);AES_decrypt(InBuff, OutBuff, &AESDecryptKey);}
}
有了上述算法封装,接下来笔者将依次演示这几种不同的加密函数是如何被应用的,首先简单介绍一下aes_cbc_encrypt与aes_cbc_decrypt这两个函数都是自己封装的AES加解密算法,这两个算法参数传递保持一致,第一个参数都是指定需要加密的缓冲区,第二个参数则是指定加密所使用的key,第三个参数是处理后的结果。
int main(int argc, char* argv[])
{char szBuffer[1024] = "hello lyshark";char szDst[1024] = { 0 };char szSrc[1024] = { 0 };// 计算一串密钥char key[AES_BLOCK_SIZE] = { 0 };for (int x = 0; x < AES_BLOCK_SIZE; x++){key[x] = 32 + x;}// AES加密if (aes_cbc_encrypt(szBuffer, key, szDst) != 0){std::cout << "加密后长度: " << strlen(szDst) << std::endl;}// AES解密if (aes_cbc_decrypt(szDst, key, szSrc) != 0){std::cout << "解密内容: " << szSrc << std::endl;}system("pause");return 0;
}
上述代码片段则是通过AES实现对数据加解密处理的功能,如下是这段代码的输出效果;

第二种调用方式是采用API实现,其中的AES函数,通过AES_set_encrypt_key设置加密密钥,并直接调用AES_encrypt实现数据加密,反之,通过AES_set_decrypt_key设置解密密钥,并调用AES_decrypt解密,这段代码调用方式如下所示;
int main(int argc, char* argv[])
{unsigned char Buffer[1024] = "hello lyshark";unsigned char EncodeBuf[1024] = { 0 };unsigned char DecodeBuf[1024] = { 0 };unsigned char aes_key[32] = { 0 };// 随机生成密钥for (int x = 0; x < 32; x++){int ch = rand() % 5;aes_key[x] = (char)ch;}AES(Buffer, EncodeBuf, (unsigned char *)aes_key, (char*)"encode");std::cout << "加密数据长度: " << strlen((char *)EncodeBuf) << std::endl;AES(EncodeBuf, DecodeBuf, (unsigned char*)aes_key, (char*)"decode");std::cout << "解密数据: " << DecodeBuf << std::endl;system("pause");return 0;
}
如上代码,通过调用AES函数时,传入encode实现数据加密,传入decode实现数据解密,如下图所示;

相关文章:
20.3 OpenSSL 对称AES加解密算法
AES算法是一种对称加密算法,全称为高级加密标准(Advanced Encryption Standard)。它是一种分组密码,以128比特为一个分组进行加密,其密钥长度可以是128比特、192比特或256比特,因此可以提供不同等级的安全性…...
一文详解防御DDoS攻击的几大有效办法
伴随互联网的飞速发展,网络安全问题变得越来越突出,其中最常见的就是DDoS攻击,也就是分布式拒绝服务攻击。DDoS攻击者利用计算机或其他设备的协作,以发送大量请求的方式导致目标超负荷,导致不能正常运转或“宕机”。以…...
Python二级 每周练习题24
练习一: 体重比较器 要求: 请编程实现如下功能: (1)程序开始运行时,提醒用户输入三个人的名字和体重 (可以分开输入,每次输入名字或者体重) (2) 程序自动比较,找出最重的一个人的名字和体重输出 的格式不限,但是要有最重人的姓名…...
MySQL - Buffer Pool
Buffer Pool 主要用于缓存数据库表的数据页,以提高数据库的读取性能: 缓存数据页:Buffer Pool 是 MySQL 中用于缓存数据页的内存区域。数据页通常包含数据库表的数据,如行记录等。当查询或读取数据时,MySQL会首先查看…...
c++ 拆分函数返回值和参数类型
在c中,函数参数类型和返回值类型通常是一个比较明确的信息,好像确实无需在这个上面费周折。然而,硬编码数据类型会让代码复用性下降,如果能够通过某种方式自动获取函数参数和返回值类型,对于代码的可复用性,…...
Ubuntu 23.10安装TeXlive并安装CTEX中文支持
连接上互联网,打开SHELL命令行界面, 1. sudo apt install texlive texstudio texlive-lang-chinese 就可以安装好了。texlive-lang-chinese 是TEXLIVE对CTEX中文的支持。 2. Tex源文件必须采用UTF-8编码格式,编译器采用xelatex。这样对中文…...
SpringBoot中CommandLineRunner详解(含源码)
文章目录 前言实例导入库application.yamlRunnerSpringBootCommandLineRunnerApplication执行结果 先后顺序示例OrderRunner1OrderRunner2执行结果 通常用法加载初始化数据示例 启动后打印应用信息示例 启动异步任务示例 接口健康检查示例 外部服务调用示例 参数校验示例 动态设…...
通信基础(一):数据传输基础
一、波特率与比特率关系 比特率(信息传输速率、信息速率):指单位时间内在信道上传 送的数据量(即比特数),单位为比特每秒 (bit/s), 简记为b/s或bps。 波特率与比特率有如下换算关系: bitbaud *log 2(N) 其中, N是码元总类数。 特别注意ÿ…...
故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断
文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障…...
物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?
物联网(IoT)技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序,我们可以实现对医疗设备的远程访问、监控和管理,从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理ÿ…...
sharepoint2016-2019升级到sharepoint订阅版
一、升级前准备: 要建立新的sharepoint订阅版环境,需求如下: 1.单服务器硬件需求CPU 4核,内存24G以上,硬盘300G(根据要迁移的数量来扩容大小等); 2.操作系统需要windows server 20…...
CTFHub | MySQL流量、Redis流量、MongoDB流量的WriteUp
文章目录 MySQL流量题目题解 Redis流量题目题解 MongoDB流量题目题解 数据库类流量题需要用到Wireshark截取数据包,然后进行分析。 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程…...
NSS刷题 js前端修改 os.path.join漏洞
打算刷一遍nssweb题(任重道远) 前面很简单 都是签到题 这里主要记录一下没想到的题目 [GDOUCTF 2023]hate eat snake js前端修改 这里 是对js的处理 有弹窗 说明可能存在 alert 我们去看看js 这里进行了判断 如果 getScore>-0x1e9* 我们结合上面…...
ArcGIS Maps SDK for JS:隐藏地图边框
文章目录 1 问题描述2 解决方案 1 问题描述 近期,将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27,原本去除地图的css代码失效了。 v4.26及以前版本 ,需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…...
带你秒懂MySQL!! 一万字详细知识点和基础操作 欢迎评论区怼我 (三)
表操作 创建 # 创建表结构 create table user(id int comment ID,唯一标志,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 约束 非空约束限制该字段值不为nullnot null唯一约束保证…...
kubeadmin部署k8s1.27.4
kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…...
【Aurix Tricore】HighTec启动代码crt0-tc37x.c分析笔记
1. 前言 crt0是hightec 在其toolchain的gcc库中实现启动startup功能的核心代码。 HighTec已为tc3xx设置了一些默认的启动行为。在此启动过程中,目标被初始化并设置为其默认值。启动文件的代码在进入main()函数之前执行。之后,执行main()函数的构造函数。 编译器附带的启动…...
Linux高级命令(扩展)
一、find命令 1、find命令作用 在Linux操作系统中,find命令主要用于进行文件的搜索。 2、基本语法 # find 搜索路径 [选项 选项的值] ... 选项说明: -name :根据文件的名称搜索文件,支持*通配符 -type :f代表普通文…...
LLM在text2sql上的应用 | 京东云技术团队
一、前言: 目前,大模型的一个热门应用方向text2sql它可以帮助用户快速生成想要查询的SQL语句。那对于用户来说,大部分简单的sql都是正确的,但对于一些复杂逻辑来说,需要用户在产出SQL的基础上进行简单修改,…...
【MySQL】 复合查询 | 内外连接
文章目录 1. 复合查询多表笛卡尔积自连接在where子句使用子查询单行子查询多行子查询in关键字all关键字any关键字 多列子查询 在from子句中使用子查询合并查询unionunion all 2. 内连接3. 外连接左外连接右外连接 1. 复合查询 多表笛卡尔积 显示雇员名、雇员工资以及所在部门…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
