openssl+AES开发实例(linux)
文章目录
- 一、AES介绍
- 二、AES原理
- 三、AES开发实例
一、AES介绍
AES(Advanced Encryption Standard)是一种对称密钥加密标准,它是一种对称加密算法,意味着相同的密钥用于加密和解密数据。AES 是 NIST(美国国家标准与技术研究院)于2001年发布的标准,用于替代原先的 DES(Data Encryption Standard)。
以下是 AES 的一些基本特点和特性:
-
密钥长度: AES 支持多种密钥长度,包括128位、192位和256位。密钥长度的不同影响了加密算法的安全性,通常更长的密钥长度意味着更高的安全性。
-
分组长度: AES 将数据分成固定大小的块(分组),每个块的大小是128位。这是 AES 固定的块大小,无论密钥的长度如何。
-
轮数: AES 加密算法的运算过程分为多轮,轮数的不同也影响了加密算法的安全性。AES-128有10轮,AES-192有12轮,AES-256有14轮。
-
结构: AES 算法采用了迭代、替代-置换网络(Substitution-Permutation Network,SPN)结构。这个结构包含了一系列的替代(SubBytes)、置换(ShiftRows)、混淆(MixColumns)和轮密钥加(AddRoundKey)操作。
-
高度安全性: AES 被广泛认为是一种安全可靠的加密算法。它经历了广泛的密码学分析和攻击尝试,至今未发现实质性的攻击。
-
广泛应用: AES 在各种应用中得到广泛使用,包括安全通信、数据加密、磁盘加密、虚拟专用网络(VPN)、SSL/TLS 协议等。
-
灵活性: AES 的灵活性体现在支持不同的密钥长度,可以根据具体的安全需求选择合适的密钥长度。
总体而言,AES 是一种高效、安全且灵活的对称密钥加密算法,适用于多种安全应用场景。在实际使用中,应选择适当的密钥长度,并考虑使用适当的加密模式和初始化向量(IV)以增强安全性。
使用 OpenSSL 进行 AES
二、AES原理
AES(Advanced Encryption Standard)算法的实现细节涉及其内部的迭代结构,包括替代-置换网络(Substitution-Permutation Network,SPN)的设计。以下是 AES 算法的基本步骤和细节:
-
密钥扩展(Key Expansion): AES 使用不同长度的密钥(128位、192位、256位),密钥扩展阶段将初始密钥扩展成一个密钥表(Key Schedule),用于轮密钥加。扩展的过程包括字节替代、循环左移、列混淆和轮密钥加。
-
初始轮密钥加(AddRoundKey): 在第一轮中,初始输入数据与扩展的密钥表进行异或运算。这一步引入了密钥的影响。
-
主轮结构(Main Rounds): 主轮结构是 AES 算法的核心,它包括多轮的字节替代、行移位、列混淆和轮密钥加。
-
字节替代(SubBytes): 每个字节都通过一个固定的 S 盒(Substitution Box)进行替代。S 盒是一个由预定义的非线性变换构成的查找表。
-
行移位(ShiftRows): 将每一行进行循环左移操作。第一行不动,第二行左移一个字节,第三行左移两个字节,第四行左移三个字节。
-
列混淆(MixColumns): 每列进行混淆操作,涉及每个字节与固定矩阵的乘法运算。
-
轮密钥加(AddRoundKey): 每轮结束时,进行一次轮密钥加,将当前的状态与扩展的轮密钥异或。
-
-
最终轮结构(Final Round): 最后一轮没有列混淆,只包括字节替代、行移位和轮密钥加。
-
解密(Decryption): 解密过程与加密过程类似,但是操作的顺序和密钥使用有所不同。解密使用的密钥表是加密时生成的逆序。
这些步骤的循环次数取决于 AES 使用的密钥长度。具体而言:
- 对于 AES-128,有10轮主结构(主轮)。
- 对于 AES-192,有12轮主结构。
- 对于 AES-256,有14轮主结构。
AES 算法的设计采用了严密的代数和数学结构,以确保其安全性和效率。这种设计使得 AES 成为一种广泛使用的对称密钥加密算法,适用于多种安全应用。
三、AES开发实例
加密的示例代码如下。请确保你的系统上已经安装了 OpenSSL 库,并在编译时链接相应的库。
#include <iostream>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <cstring>std::string aes_encrypt(const std::string &plaintext, const std::string &key) {// 检查密钥长度if (key.length() != 16 && key.length() != 24 && key.length() != 32) {std::cerr << "Error: AES key length must be 16, 24, or 32 bytes." << std::endl;return "";}// 初始化 AES 上下文AES_KEY aes_key;if (AES_set_encrypt_key(reinterpret_cast<const unsigned char *>(key.c_str()), 8 * key.length(), &aes_key) != 0) {std::cerr << "Error: Failed to set AES encryption key." << std::endl;return "";}// 填充明文int padding = AES_BLOCK_SIZE - plaintext.length() % AES_BLOCK_SIZE;std::string padded_text = plaintext + std::string(padding, static_cast<char>(padding));// 分配内存保存加密后的数据unsigned char *cipher_text = new unsigned char[padded_text.length()];// 加密AES_encrypt(reinterpret_cast<const unsigned char *>(padded_text.c_str()), cipher_text, &aes_key);// 将加密后的数据转为十六进制字符串std::string result;for (size_t i = 0; i < padded_text.length(); ++i) {char hex[3];sprintf(hex, "%02x", cipher_text[i]);result += hex;}delete[] cipher_text;return result;
}int main() {// 128-bit (16-byte) AES keystd::string key = "0123456789abcdef";// 要加密的明文std::string plaintext = "Hello, AES encryption!";// 执行加密std::string ciphertext = aes_encrypt(plaintext, key);// 输出结果std::cout << "Plaintext: " << plaintext << std::endl;std::cout << "Ciphertext: " << ciphertext << std::endl;return 0;
}
在这个示例中,我们使用了 OpenSSL 的 AES 函数库进行加密。请注意,这里的密钥长度必须是 16、24 或 32 字节。对于安全性要求高的应用,建议使用更长的密钥和其他先进的加密模式。此外,本例中使用了 ECB 模式,实际应用中可能需要考虑使用更安全的加密模式,例如 CBC,并在每个块中使用随机的初始化向量(IV)。
相关文章:
openssl+AES开发实例(linux)
文章目录 一、AES介绍二、AES原理三、AES开发实例 一、AES介绍 AES(Advanced Encryption Standard)是一种对称密钥加密标准,它是一种对称加密算法,意味着相同的密钥用于加密和解密数据。AES 是 NIST(美国国家标准与技…...
FreeRTOS源码阅读笔记3--queue.c
消息队列可以应用于发送不定长消息的场合,包括任务与任务间的消息交换,队列是 FreeRTOS 主要的任务间通讯方式,可以在任务与任务间、中断和任务间传送信息,发送到 队列的消息是通过拷贝方式实现的,这意味着队列存储…...
云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统
云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统 通过容器互联搭建一个wordpress博客系统。wordpress系统是需要连接到数据库上的,所以wordpress和mysql的镜像都是需要的。wordpress在创建过程中需要指定一些参数。创建mysql容器时需要把mysql的数据保存在宿主机本…...
java读取OPC DA数据---Utgard
java读取OPC DA数据—Utgard Utgard库已经过时,原作者早已删除库,建议使用OPC UA,兼容OPC DA。 下面讲解Utgard使用 C#和C都不用配置DCOM,直接调用函数 既然是非要用Java,那就别想太方便,需要配置DCOM(后…...
在 Android 上简单安全地登录——使用凭证管理器和密钥
我踏马很高兴地听说, Credential Manager的公开版本将于 11 月 1 日开始提供。Credential Manager 为 Android 带来了身份验证的未来,简化了用户登录应用程序和网站的方式,同时使其更加安全。 登录可能具有挑战性 - 密码经常使用,…...
【Python】上市公司数据进行经典OLS回归实操
一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…...
科研学习|科研软件——有序多分类Logistic回归的SPSS教程!
一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度:Strongly Disagree——非常不同意,用“0”表示;Disagree——不同意,用“1”表示;Agree--同意,用“2”表示;Strongly Agree--非常…...
微服务简单理解与快速搭建
分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…...
QColorDialog开发实例
文章目录 一、QColorDialog基本用法:二、QColorDialog详解三、QColorDialog接口说明静态函数成员函数 四、QColorDialog代码开发实例 QColorDialog 是 Qt 框架中用于选择颜色的对话框类。它提供了一个用户友好的界面,允许用户选择颜色。以下是 QColorDi…...
linux实现全局快捷键
文章目录 第一步:加载KF5GlobalAccel库第二步:代码实现2.1 定义一个QAction2.2 KGlobalAccel::self()注册快捷键3 源码地址有一个需求,就是在应用在后台运行时,用户可以通过快捷键将应用唤起。或者应用响应。 其实就是全局快捷键的功能。 这个功能利用了linux操作系统中的d…...
共享台球室小程序系统:智能化预约与管理
在当今数字化的时代,共享经济模式已经渗透到各个领域。其中,共享台球室作为一个结合了传统与现代元素的项目,越来越受到年轻人的喜爱。为了满足市场需求,我们设计了一款基于微信小程序的共享台球室预约与管理系统,通过…...
百度文心一言
1分钟了解一言是谁? 一句话介绍【文心一言】 我是百度研发的人工智能模型,任何人都可以通过输入【指令】和我进行互动,对我提出问题或要求,我能高效地帮助你们获取信息、知识和灵感哦 什么是指令?我该怎么和你互动&am…...
225.用队列实现栈(LeetCode)
思路 思路:用两个队列实现栈后进先出的特性 ,两个队列为空时,先将数据都导向其中一个队列。 当要模拟出栈时,将前面的元素都导入另一个空队列,再将最后一个元素移出队列 实现 实现: 因为C语言没有库可以…...
汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)
毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰值的频谱,每个峰值表示在特定距离处存在物体。 请问,这种多目标…...
8.指令格式,指令的寻址方式
目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 (1)指令寻址 (2)数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…...
k8s自定义Endpoint实现内部pod访问外部应用
自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云, 一部分云原生的,一部分是实体的 业务上云期间逐步实现上云,保证各个模块之间的解耦性 比如使…...
[100天算法】-分割等和子集(day 78)
题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入:…...
共享台球室小程序系统的数据统计与分析功能
随着共享经济的繁荣发展,共享台球室作为一种新型的娱乐方式,越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率,我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能,还集…...
Istio学习笔记- 服务网格
Istio 服务网格 参考:Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥…...
离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论
公开数据集中文版详细描述参考前文:https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文:https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
