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神经元运动调制分析参考…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
