AES算法

收集了几个博主

1、https://blog.csdn.net/shaosunrise/article/details/80219950

2、AESECB加密算法 C 语言代码实现_c语言aes-256-cbc-CSDN博客

3、https://www.cnblogs.com/hello-/articles/8718186.html

4、AES加密过程详解-CSDN博客

5、AES加密算法原理的详细介绍与实现-CSDN博客

6、AES加密的四种模式详解 - 程序员大本营

前言

1、AES算法是当前最流行的对称加密算法,也是一种分组加密算法,分组密码就是把明文分为固定长度的16个字节,每次加密一组数据,直到加密完整个明文数据。加密出来的密文也是16字节;注意:加密出来的是0xff占用一个字节的数,是不可打印字符;

2、aes算法接口需要一般几个参数:16字节的一个数组输入参数,16字节字符数组的带存储加密数据的参数,一个数组key;例如unsigned char pt[16]={0x00, 0x11, 0x22, 0x33,0x44, 0x55,0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xff}; unsigned char pt[16]={0}; unsigned char key[16]={0x00, 0x11, 0x22, 0x33,0x44, 0x55,0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xff};

3、AES算法根据密钥分组长度16,32,64字节可以分为AES128, AES192,AES256,其所要求的秘钥长度和加密轮数也各不相同。鉴于这三种模式的算法在本质上没有区别,所以本文主要介绍AES-128(数据分组为16字节,秘钥长度为16字节,加密轮数为10轮),并给出C语言实现。

AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

确切的说分组密码只是规定了怎么加密一组明文,如果明文数据比较长,其他的组需要怎么进行加密取决于使用何种分组密码工作模式。对于AES-128而言,每次只加密16字节长度的数据,如果明文长度为32字节话,我们很容易想到第2组16字节可以仿照第1组16字节数据进行处理,这就是最简单的分组密码工作模式ECB(电子密码本)模式,本文主要讲述AES算法实现,对于长数据也是使用这种最简单的ECB分组处理方式,更多其他分组密码工作模式,请参考另一篇文章图解分组密码五大工作模式。

前面讨论的数据长度都是16字节,或者其整倍数长度的加密算法实现,对于数据长度不是分组长度整倍数的情形,通常需要对数据进行填充,使其长度达到分组长度的整倍数再来进行加密。对于数据长度不足分组长度整倍数使用何种格式进行数据填充有多种不同的填充标准,比如在数据后面填充二进制的0x0,直到达到要求的长度,这就是ZeroPadding方式;比如数据缺少几位就填充二进制的几,例如缺少4位填充0x04 0x04 0x04 0x04,这就是PKCS7/PKCS5填充方式。本文提供的实现不涉及数据填充,假定明文数据都是16字节的整倍数长度。

AES算法流程

AES算法主要可以分为秘钥扩展、字节替换、行移位、列混合和轮秘钥加这5个步骤。

秘钥扩展(KeyExpansions:给定的初始秘钥一般比较短,比如16字节,而算法如果进行10轮运算的话就需要16x(10+1)字节长度的秘钥,需要对原始秘钥进行秘钥扩展。

字节替换(SubBytes):一个非线性的替换步骤,根据查表把一个字节替换为另一个字节。

行移位(ShiftRows):将数据矩阵的每一行循环移位一定长度。

列混合(MixColumns):将数据矩阵乘以一个固定的矩阵,增加混淆程度。

轮秘钥加(AddRoundKey):将数据矩阵与秘钥矩阵进行异或操作。

相关推荐
ChoSeitaku16 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___24 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我29 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui11 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农1 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
前端郭德纲2 小时前
浏览器是加载ES6模块的?
javascript·算法
SoraLuna2 小时前
「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
算法·macos·cangjie