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

基于CBC、ECB、CTR、OCF、CFB模式的AES加密算法

1、什么是AES加密算法

什么是加密算法?我在文章《从个人角度看什么是加密算法》中描述了我对加密算法的一些浅薄的理解。我不是信息安全领域的大神,只求有一个入门罢了!

这篇文章是文章《从个人角度看什么是加密算法》的延伸,所以在阅读前,请务必仔细阅读并理解上一篇文章的内容。

既然加密算法本质上是对明文和密钥的一系列运算,那么AES加密算法就是一种被定义的具有明确运算方式的过程。这个运算过程不可能简单,不然它也不会成为目前应用最广泛的加密算法。

AES,Advanced Encryption Standard,高级加密标准,又称Rijndael加密法。是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES是对称加密算法,这说明它的加解密使用的密钥相同,且它的加密算法可逆。

1.1、AES的基本结构

AES是分组密码。分组密码就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。

AES规定自己的分组长度固定为128位,16个字节。密钥长度则可以是128、192或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-1284410
AES-1926412
AES-2568414

所谓的加密轮数,就是对分组数据进行一轮加密,对于AES-128算法来说,共进行10轮加密,其中前9轮加密方式相同,第10轮不同,最终得到的就是密文。

比如明文P,使用加密函数:

C = encrypt(P, K);

加密后得到密文C。在加密函数encrypt()里,共进行10轮计算,前9轮每一轮都是对分组数据P1进行加减乘除,得到的结果P2再进行加减乘除,最后1轮加减乘没有除。运算过程中别忘了让密钥K参与进来。

轮次加密

上面只是举个例子!

实际AES加密中前9轮的操作并不是加减乘除,而是:字节代换、行位移、列混合和轮密钥加。第10轮也并不是加减乘,而是:字节代换、行位移、轮密钥加,不执行列混合。

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文矩阵(矩阵中一个元素大小就是明文中的一个Byte字节)。 明文分组的16个字节如何在这个4x4的矩阵中排列呢?遵循:从上到下、从左到右排序。假设明文分组的数据为abcdefghijklmnop,分别对应为:P0、P1、P2、P3、P4、P5、P6、P7、P8、P9、P10、P11、P12、P13、P14、P15,存储在内存中是以编码后的数据保存:0x61、0x62、0x63、0x64、0x65、0x66、0x67、0x68、0x69、0x6A、0x6B、0x6C、0x6D、0x6E、0x6F、0x70。明文数据保存在字节矩阵中的位置为:

字节矩阵中如何存储明文分组数据

实际参与运算的是最后一个矩阵!

不只是明文数据需要放在矩阵表中参与运算,128位密钥K(以AES-128为例)也是用4x4矩阵表示,以字节为单位:K0、K1、K2、K3、K4、K5、K6、K7、K8、K9、K10、K11、K12、K13、K14、K15,按从上到下、从左到右顺序排列:

密钥在字节矩阵中排列

每一轮都需要这样的一个密钥矩阵(128位,16个字节)参与运算,每一轮的密钥又不能相同,而AES-128算法传入的密钥只有128位。怎么办呢?

在加密算法中,会对传入的128位原始密钥通过一个密钥编排函数生成10个密钥矩阵,加上原始密钥矩阵共11个。在第一轮加密前,需要将明文和原始密钥进行一次异或加密操作,然后10轮加密操作分别用生成的10个密钥矩阵参与运算。

下面简单介绍下每轮加密的四个操作:字节代换、行位移、列混合和轮密钥加

1.1.1、字节代换

AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。每个盒是一个16x16的字节矩阵。需要字节代换的4x4的数据矩阵,每个字节值的高4位作为行值(0-15),低4位作为列值(0-15),在S盒上查找到对应的单元的字节值,全部替换掉即可。如果是解密,就使用逆S盒。

1.1.2 行位移

行移位是一个简单的左循环移位操作。数据矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节。

1.1.3 列混合

这里的运算我看不大懂!

1.1.4 轮密钥加

数据矩阵与密钥矩阵对应字节位进行异或操作

密文的解密操作不只是加密的10轮操作的逆操作(10-9-8-7-6-5-4-3-2-1),还是每轮中的逆操作(轮密钥加-列混合-行位移-字节代换),还是每个操作的逆操作(比如行位移本来是往左移,逆操作就往右移,字节代换本来是在S盒中查找替换,逆操作就是在逆S盒中查找替换)。

AES算法详细介绍请参考:https://blog.csdn.net/qq_28205153/article/details/55798628?spm=1001.2014.3001.5506。写的非常好!!!

2、AES加密模式

AES加密模式共五种:CBC、ECB、CTR、OCF、CFB。它们每轮加密使用的方法都相同,不同的点在于传入的128位明文数据在加密前需要做一些额外的运算。比如CBC模式,就需要多传入一个初始值,让其与明文分组矩阵进行异或操作,然后再进行10轮加密操作。

五种加密模式的详细介绍请参考:https://www.cnblogs.com/starwolf/p/3365834.html



http://www.kler.cn/a/9909.html

相关文章:

  • Linux源码阅读笔记-V4L2框架基础介绍
  • 树形dp总结
  • 微服务架构面试内容整理-API 网关-Gateway
  • Android OpenGL ES详解——立方体贴图
  • 猿创征文|Inscode桌面IDE:打造高效开发新体验
  • 实现一个BLE HID鼠标
  • 洛谷 P1341 无序字母对
  • Monitor方案MT9800学习笔记(三) —— 点屏(V-by-One信号接口)
  • MybatisPlus <= 3.5.3.1 TenantPlugin 组件 存在 sql 注入漏洞(CVE-2023-25330)
  • 测试:腾讯云轻量4核8G12M服务器CPU流量带宽系统盘
  • pytorch进阶学习(三):在数据集数量不够时如何进行数据增强
  • 花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)
  • 【LeetCode】剑指 Offer 49. 丑数 p240 -- Java Version
  • JavaScript 基础入门速成上篇
  • GPT、科技、人类的生产、知识与未来(下)
  • IO流复习
  • 算法题:图的表示形式与遍历框架
  • k8s 磁盘不够用,docker数据迁移 导致 /tmp Permission denied,docker优化日志 日志切割, 日志自动删除
  • 小米手机root后过软件检测
  • Flink (十) --------- 容错机制
  • ActiveMQ使用(二):在JavaScript中使用mqtt.js
  • 和开振学Spring boot 3.0之Spring MVC:④获取参数(上)
  • 《Java8实战》第1章 Java 8、9、10 以及 11 的变化
  • 小程序的组件化开发
  • 图的遍历及连通性
  • Spark 简介与原理