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神经元运动调制分析参考…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...