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

图解AES密钥扩展与加密过程

在嵌入式软件开发中,特别是涉及到与云端进行数据传输时,为确保数据的安全性,需要对数据进行加密,本篇了就来介绍常用的一种加密方式——AES加密的原理。

1 AES加密简介

AES(Advanced Encryption Standard,高级加密标准)是一种广泛使用的对称加密算法,由美国国家标准与技术研究院(NIST)于 2001 年标准化,用于替代安全性不足的 DES 算法。

AES 的核心特性

  • 对称加密:加密和解密使用相同的密钥,密钥长度可选择 128 位、192 位或 256 位(分别称为 AES-128、AES-192、AES-256),密钥越长,安全性越高,但计算开销也略大
  • 分组加密:处理固定长度的明文块(128 位,即 16 字节),若明文长度不足 16 字节,需通过填充(如 PKCS#7)补足;若超过 16 字节,则分块处理并结合模式(如 CBC、GCM 等)保证安全性
  • AES 的加密过程是对 16 字节明文块(按 4×4 矩阵排列,称为 “状态矩阵”)进行多轮变换,轮数取决于密钥长度:
    • AES-128:10 轮
    • AES-192:12 轮
    • AES-256:14 轮

本篇介绍最基础的128 位密钥,10轮加密,并且明文长度为16 字节不需要填充的情况。

例如:“coder-love-study”字符串刚好16个字符,只需要对这一个数据块进行加密即可。

在执行加密前,需要先将字符串转为对应的16进制数,也就是通过ASCII码表进行转换。

另外,需要注意是的,16个字节的数据块,要按列优先的顺序,排列到4x4的矩阵中,如下图:

这里再附一份ASCII码对照表:

AES-128的密钥,刚好也是4x4的矩形(种子密钥),而进行10轮加密,使用的密钥是不同的,这些密钥都是从种子密钥扩展出来的。

下面就开始介绍AES的密钥扩展和具体加密过程

2 轮密钥的计算

AES 的原始密钥(种子密钥)通过特定算法扩展为多轮子密钥(如 AES-128 需扩展为 11 个子密钥,包含初始密钥和 10 轮密钥)。

扩展过程是按列进行扩展,其计算过程主要分为两大类:

  • 列索引是4的倍数:计算过程稍复杂
  • 列索引不是4的倍数:计算过程稍简单

2.1 S-Box表与轮常量表

在介绍密钥扩展的具体步骤之前,先了解一下要用到的一些表

2.1.1 S-box表

是一个固定的表格,16行x16列,用于数据映射,后面字节代换时会用到

2.1.2 轮常量表

也是一个固定的表格,一共有10列,后面计算4的倍数列的密钥时会用到,10个扩展密钥分别会使用对应的列。

2.2 计算4的倍数列

先来介绍4的倍数列的扩展密钥如何结算,例如第4列(轮密钥1的最左侧的列),计算过程为:

  • 通过i-1列(第3列)进行数据变换,包括:
    • 字节旋转:就是把第3列的数据先取出来,然后循环移动1位
    • S-box查表:每个数据,看作是行、列左边,去S-box中找到对应的位置,取出其存储的值,作为替换值
    • 与轮常量进行异或运算
  • i-4列的值(第0列)与i-1列变换后的值,进行异或运算

如上图的计算过程,最终计算得到第4列的密钥为:9C A5 3F AA

S-box的映射过程举例:

异或的计算过程:

2.3 计算非4的倍数列

再来看不是4的倍数列的扩展密钥如何结算,例如第5列(轮密钥2的第2列),计算过程为:

  • i-4列的值(第1列)与i-1(第4列),进行异或运算即可

2.4 最终结果

按照上述方式,通过种子密钥,依次计算出扩展密钥的第443列,也就得到了轮密钥1轮密钥10,后面在多轮加密时,会分别用到对应轮的密钥。

3 加密过程解析

AES-128有10轮加密,其过程可以归类为:

  • 初始变换
    • 执行轮密钥加(种子密钥加)
  • 9轮循环运算,每一轮的步骤相同,密钥不同
    • 字节代换
    • 行移位
    • 列混淆
    • 轮密钥加
  • 1轮最终轮
    • 字节代换
    • 行移位
    • 轮密钥加

3.1 初始变换

初始变换其实就是执行轮密钥加,准确的说是种子密钥加,因为初始变换使用的是种子密钥。

具体的变换过程,就是数据矩阵和种子密钥矩阵的对应位置的数据进行异或操作

初始变换举例

3.2 9轮循环运算

9轮循环中,每轮循环依次执行如下步骤:

  • 字节代换
  • 行移位
  • 列混淆
  • 轮密钥加(依次使用密钥是前面计算出的轮密钥1~轮密钥9

3.2.1 字节代换与行移位

字节代换,其实就是S-box表映射,前面在计算扩展密钥时就使用过,这里就是要对4x4矩阵中的每一个数据都进行S-box的映射替换。

行移位,其过程可理解为:

  • 第1行数据不动
  • 第2行左移1位,然后左边多出的1位数据再移动到右边
  • 第3行左移2位,然后左边多出的2位数据再移动到右边
  • 第4行左移3位,然后左边多出的3位数据再移动到右边

具体过程可参考下图:

3.2.2 列混淆

列混淆,是对4x4的数据再左乘一个列混淆的固定矩形。

列混淆的过程,和矩阵乘积运算是类似的,都是行列的数据先相乘再相加,不同点是:

  • 相乘的运算,是有限域(2的8次方内)的相乘
  • 相加的运算,替换为二进制的异或运算

有限域的相乘运算的具体过程如下:

  • 先转换为2进制进行计算
  • AES的列混淆,与加密数据相乘的数据只有1、2、3这3种情况
    • 与1相乘,不变
    • 与2相乘,如果数据最高位是0,乘2就是左移一位,仍在有限域内;如果最高位是1,左移1位后会溢出,需要再与0x1B(AES中规定的不可约多项式的16进制表示)异或
    • 与3相乘,先将3拆为1与2的异或,最终转换为先与2相乘,再与自身异或

示例,这里对矩阵的第1行第1列,和第4行第2列进行手动计算,分别得到了AF和AB

3.2.3 轮密钥加

在前面的初始变换中已解释过了轮密钥加,区别是:

  • 初始变换中,使用的种子密钥
  • 9轮循环中,使用的对应轮的轮密钥

轮密钥加的过程,是数据矩阵和密钥矩阵进行异或的过程

3.3 最终轮

最终轮中,执行如下步骤:

  • 字节代换
  • 行移位
  • 轮密钥加(使用轮密钥10

注意最终轮和前面9轮的区别是,没有了列混淆的步骤。

因此,“coder-love-study”数据,使用自定义的密钥,进行AES的10轮加密后,最终加密的就是上图的结果。

4 总结

本篇介绍了AES加密的原理,通过一个具体的字符串和自定义密钥,演示了AES加密的全过程,包括密钥的扩展过程,每轮加密的数据变换过程等,最终得到加密的结果。

http://www.dtcms.com/a/487167.html

相关文章:

  • ps如何做网站轮播图泰安企业建站公司哪里找
  • vue疑难解答
  • 【检索:Top K】12、非精准Top K检索权威指南:搜索引擎排序加速的核心技术与实战实现
  • 顺德品牌网站建设优惠做好公众号 网站建设
  • nullptr vs NULL:C/C++ 空指针的演变史
  • 深圳企业网站制作公司介绍网站防盗链设置
  • 搜索别人的网站是带logo的请问怎么做的精准广告投放
  • latex中自定义公式编号
  • 苏州正规做网站公司网站建设初期的需求分析
  • codetop高频(1)
  • LeetCode 994. 腐烂的橘子
  • 网站设计师需要什么知识与技能咸宁网站建设哪家专业
  • Python爬取百度地图-前端直接获取
  • thumos14数据集学习
  • 持续集成/持续部署(CI/CD)
  • HTTPS 的加密过程~
  • 用服务器ip做网站不配置iis做网站
  • 成都企业网站建设哪家好做网站模板链接放哪里
  • 网站手机端做app开发工具网站开发图标
  • 华为OD-21届考研-Java面经
  • PyTorch 实现多种 CNN 模型并采用集成方法提升 CIFAR-10 分类性能
  • 网站建设常用软件宣传链接用什么软件
  • 合肥响应式网站开发方案wordpress 本地 搭建网站
  • 国内做游戏破解的网站专门做2手手机的网站
  • 深度学习进阶(二)——视觉与语言的融合:多模态模型的架构演化
  • html做的旅游网站wordpress按作者分类
  • Jmeter 线程组、定时器、监听器、后置处理器常用配置说明
  • Jmeter分布式集群搭建与使用
  • 【Pytorch】MLP反向传播
  • 【pytorch学习打卡挑战】day2 Pytorch张量运算API