0%

AES算法

前言

AES是目前最常见的一种对称算法, AES是一种分组算法,所有的数据都按块进行加密,AES的数据块大小为16字节(128bit), 但是AES的密钥有128/192/256bits三种,密钥的长度不同的话,加密的轮数有差异。

比如AES128算法,会进行10次轮运算,也就是一个分组数据会被加密10次。

AES算法

原理

AES算法每个分组长度为128bit,即16字节。这16个字节组成一个4X4的矩阵。在算法的每一轮中,矩阵的内容都在变化,直到最后的结果作为密文。
aes_block

类似地,128bit的密钥也用字节表示成矩阵,通过密钥的编排函数矩阵扩展为一个44个字的序列W[0-43]。前4个字是原始的密钥, 后面的40个字分别为每一轮运算的密钥。

aes_keys

AES算法的整体流程如下:

aes_flow

1、在第一轮之前,使用原始密钥对明文进行一次异或
2、第1~9轮的处理一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。
3、第10轮:字节代换、行位移、轮密钥加。

AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。

参考资料: https://blog.csdn.net/qq_28205153/article/details/55798628

填充

分组算法每次输入都是固定长度的数据,如果数据总长度不是分组长度的整数倍,那么最后一块分组数据就需要在后面填充数据,补齐分组长度。

根据怎么对明文进行填充,分为3种方式:

  • NoPadding 不填充,那么就是不支持数据长度不是分组长度倍数的数据, 对AES就必须是128bit的倍数
  • PKCS5Padding (默认) 在明文块后面填充响应数量的字符,每个字符的值等于缺少的字符数。 如10个字节, 后面的6个字节都填6.
  • ISO10126Padding 最后一个字符填充成缺少的字符数, 其他的随机。

密钥长度

不同密钥长度的算法,进行的轮数不一样。 AES128 10轮, AES192 12轮, AES256 14轮。运算的逻辑都一样。具体的运算细节不深入了。

加密都是按块加密,每个块128位即16字节。


行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

博客地址: https://fishmwei.github.io

掘金主页: https://juejin.cn/user/2084329776486919