AES算法流程

明文分组长度: 128bit

密钥长度: 128bit

迭代轮数: 10

加密和解密均在44的矩阵上进行,每个格子1个字节,共16个字节128bit

注意AES算法序列映射到矩阵上是列优先的,所以读取时都是一列一列地读,这不同于DES的行优先

轮密钥加

两个矩阵A,B进行异或,AijBij=Cij

字节代替

对于原矩阵的每一个格子的数值(1btye8bit),前4bit指明行数,后4bit指明列数,到S盒(不同于DES中的8个S盒)中找到对应位置的数值作为输出

行移位

14行依次循环左移 0byte1byte2byte3byte

注意是循环左移,每移动一位都相当于将最左侧的一个格子放到最右侧

列混合

×=

固定矩阵为:

[02030101010203010101020303010102]

计算方法

矩阵乘法的规则没有变化

这里的数值计算实际上为多项式计算,下面分为加法和乘法分别讨论

加法

多项式表示: (x6+x4+x2+x+1)+(x7+x+1)=x7+x6+x4+x2

二进制表示: 0101011110000011=11010100

十六进制表示: 0x570x83=0xd4

因为是模2加法,所以两个十六进制加法只需先将十六进制转化为二进制再进行异或操作

乘法

首先定义了一个运算-x乘法

假设存在一表达式b(x)=b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0,x乘法就是xb(x)

  • b7=0时,xb(x)运算后二进制的结果是b(x)对应的二进制左移一位,右侧补0
  • b7=1时,xb(x)运算后二进制的结果是b(x)对应的二进制左移一位,右侧补0,再与1B(00011011)进行异或

也就是说两个十六进制进行乘法运算,我们首先需要转化为二进制。其次我们必须想办法将乘法运算转化为x乘法(这样做只是会大幅度简化计算,否则需要使用两个多项式进行乘法运算),例如57H13H,我们可以将13H转化为01H+02H+10H01H就是乘1,10H对应多项式的x4,只需要乘4次x即可,而乘x的运算结果就是我们上面提到的那两种情况,判断b7是否为0即可。这样做即可免除使用两个多项式进行计算。

posted @   0x7F  阅读(313)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示