当前位置: 首页 > news >正文

openssl+AES开发实例(linux)

文章目录

  • 一、AES介绍
  • 二、AES原理
  • 三、AES开发实例

一、AES介绍

AES(Advanced Encryption Standard)是一种对称密钥加密标准,它是一种对称加密算法,意味着相同的密钥用于加密和解密数据。AES 是 NIST(美国国家标准与技术研究院)于2001年发布的标准,用于替代原先的 DES(Data Encryption Standard)。

以下是 AES 的一些基本特点和特性:

  1. 密钥长度: AES 支持多种密钥长度,包括128位、192位和256位。密钥长度的不同影响了加密算法的安全性,通常更长的密钥长度意味着更高的安全性。

  2. 分组长度: AES 将数据分成固定大小的块(分组),每个块的大小是128位。这是 AES 固定的块大小,无论密钥的长度如何。

  3. 轮数: AES 加密算法的运算过程分为多轮,轮数的不同也影响了加密算法的安全性。AES-128有10轮,AES-192有12轮,AES-256有14轮。

  4. 结构: AES 算法采用了迭代、替代-置换网络(Substitution-Permutation Network,SPN)结构。这个结构包含了一系列的替代(SubBytes)、置换(ShiftRows)、混淆(MixColumns)和轮密钥加(AddRoundKey)操作。

  5. 高度安全性: AES 被广泛认为是一种安全可靠的加密算法。它经历了广泛的密码学分析和攻击尝试,至今未发现实质性的攻击。

  6. 广泛应用: AES 在各种应用中得到广泛使用,包括安全通信、数据加密、磁盘加密、虚拟专用网络(VPN)、SSL/TLS 协议等。

  7. 灵活性: AES 的灵活性体现在支持不同的密钥长度,可以根据具体的安全需求选择合适的密钥长度。

总体而言,AES 是一种高效、安全且灵活的对称密钥加密算法,适用于多种安全应用场景。在实际使用中,应选择适当的密钥长度,并考虑使用适当的加密模式和初始化向量(IV)以增强安全性。
使用 OpenSSL 进行 AES

二、AES原理

AES(Advanced Encryption Standard)算法的实现细节涉及其内部的迭代结构,包括替代-置换网络(Substitution-Permutation Network,SPN)的设计。以下是 AES 算法的基本步骤和细节:

  1. 密钥扩展(Key Expansion): AES 使用不同长度的密钥(128位、192位、256位),密钥扩展阶段将初始密钥扩展成一个密钥表(Key Schedule),用于轮密钥加。扩展的过程包括字节替代、循环左移、列混淆和轮密钥加。

  2. 初始轮密钥加(AddRoundKey): 在第一轮中,初始输入数据与扩展的密钥表进行异或运算。这一步引入了密钥的影响。

  3. 主轮结构(Main Rounds): 主轮结构是 AES 算法的核心,它包括多轮的字节替代、行移位、列混淆和轮密钥加。

    • 字节替代(SubBytes): 每个字节都通过一个固定的 S 盒(Substitution Box)进行替代。S 盒是一个由预定义的非线性变换构成的查找表。

    • 行移位(ShiftRows): 将每一行进行循环左移操作。第一行不动,第二行左移一个字节,第三行左移两个字节,第四行左移三个字节。

    • 列混淆(MixColumns): 每列进行混淆操作,涉及每个字节与固定矩阵的乘法运算。

    • 轮密钥加(AddRoundKey): 每轮结束时,进行一次轮密钥加,将当前的状态与扩展的轮密钥异或。

  4. 最终轮结构(Final Round): 最后一轮没有列混淆,只包括字节替代、行移位和轮密钥加。

  5. 解密(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&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥加密标准&#xff0c;它是一种对称加密算法&#xff0c;意味着相同的密钥用于加密和解密数据。AES 是 NIST&#xff08;美国国家标准与技…...

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合&#xff0c;包括任务与任务间的消息交换&#xff0c;队列是 FreeRTOS 主要的任务间通讯方式&#xff0c;可以在任务与任务间、中断和任务间传送信息&#xff0c;发送到 队列的消息是通过拷贝方式实现的&#xff0c;这意味着队列存储…...

云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统

云原生Kubernetes系列 | 通过容器互联搭建wordpress博客系统 通过容器互联搭建一个wordpress博客系统。wordpress系统是需要连接到数据库上的,所以wordpress和mysql的镜像都是需要的。wordpress在创建过程中需要指定一些参数。创建mysql容器时需要把mysql的数据保存在宿主机本…...

java读取OPC DA数据---Utgard

java读取OPC DA数据—Utgard Utgard库已经过时&#xff0c;原作者早已删除库&#xff0c;建议使用OPC UA&#xff0c;兼容OPC DA。 下面讲解Utgard使用 C#和C都不用配置DCOM&#xff0c;直接调用函数 既然是非要用Java&#xff0c;那就别想太方便&#xff0c;需要配置DCOM(后…...

在 Android 上简单安全地登录——使用凭证管理器和密钥

我踏马很高兴地听说&#xff0c; Credential Manager的公开版本将于 11 月 1 日开始提供。Credential Manager 为 Android 带来了身份验证的未来&#xff0c;简化了用户登录应用程序和网站的方式&#xff0c;同时使其更加安全。 登录可能具有挑战性 - 密码经常使用&#xff0c…...

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化&#xff0c;所有解释变量5、绘制热…...

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度&#xff1a;Strongly Disagree——非常不同意&#xff0c;用“0”表示&#xff1b;Disagree——不同意&#xff0c;用“1”表示&#xff1b;Agree--同意&#xff0c;用“2”表示&#xff1b;Strongly Agree--非常…...

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…...

QColorDialog开发实例

文章目录 一、QColorDialog基本用法&#xff1a;二、QColorDialog详解三、QColorDialog接口说明静态函数成员函数 四、QColorDialog代码开发实例 QColorDialog 是 Qt 框架中用于选择颜色的对话框类。它提供了一个用户友好的界面&#xff0c;允许用户选择颜色。以下是 QColorDi…...

linux实现全局快捷键

文章目录 第一步:加载KF5GlobalAccel库第二步:代码实现2.1 定义一个QAction2.2 KGlobalAccel::self()注册快捷键3 源码地址有一个需求,就是在应用在后台运行时,用户可以通过快捷键将应用唤起。或者应用响应。 其实就是全局快捷键的功能。 这个功能利用了linux操作系统中的d…...

共享台球室小程序系统:智能化预约与管理

在当今数字化的时代&#xff0c;共享经济模式已经渗透到各个领域。其中&#xff0c;共享台球室作为一个结合了传统与现代元素的项目&#xff0c;越来越受到年轻人的喜爱。为了满足市场需求&#xff0c;我们设计了一款基于微信小程序的共享台球室预约与管理系统&#xff0c;通过…...

百度文心一言

1分钟了解一言是谁&#xff1f; 一句话介绍【文心一言】 我是百度研发的人工智能模型&#xff0c;任何人都可以通过输入【指令】和我进行互动&#xff0c;对我提出问题或要求&#xff0c;我能高效地帮助你们获取信息、知识和灵感哦 什么是指令&#xff1f;我该怎么和你互动&am…...

225.用队列实现栈(LeetCode)

思路 思路&#xff1a;用两个队列实现栈后进先出的特性 &#xff0c;两个队列为空时&#xff0c;先将数据都导向其中一个队列。 当要模拟出栈时&#xff0c;将前面的元素都导入另一个空队列&#xff0c;再将最后一个元素移出队列 实现 实现&#xff1a; 因为C语言没有库可以…...

汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)

毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰值的频谱,每个峰值表示在特定距离处存在物体。 请问,这种多目标…...

8.指令格式,指令的寻址方式

目录 一. 指令格式 二. 扩展操作码 三. 指令寻址 &#xff08;1&#xff09;指令寻址 &#xff08;2&#xff09;数据寻址 1.直接寻址 2.间接寻址 3.寄存器寻址 4.寄存器间接寻址 5.隐含寻址 6.立即寻址 7.基址寻址 8.变址寻址 9.相对寻址 10.堆栈寻址 一. 指令…...

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云&#xff0c; 一部分云原生的&#xff0c;一部分是实体的 业务上云期间逐步实现上云&#xff0c;保证各个模块之间的解耦性 比如使…...

[100天算法】-分割等和子集(day 78)

题目描述 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入:…...

共享台球室小程序系统的数据统计与分析功能

随着共享经济的繁荣发展&#xff0c;共享台球室作为一种新型的娱乐方式&#xff0c;越来越受到年轻人的喜爱。为了更好地满足用户需求和提高管理效率&#xff0c;我们设计了一款基于微信小程序的共享台球室预订与管理系统。该系统不仅具备基本的预订和管理功能&#xff0c;还集…...

Istio学习笔记- 服务网格

Istio 服务网格 参考&#xff1a;Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes&#xff0c;以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用&#xff0c;为复杂的部署带来了标准的通用流量管理、遥…...

离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...