手动推导计算AES中的s盒的输出
初衷
为了解决一道密码学课后作业:
在AES中,对于字节 “00” 和 “01” 计算S盒的输出。
百度查了很久,很多都是浅尝则之,没有具体说明S盒计算的具体过程和方法,要么就是说直接使用S盒求出,搞的我很崩溃,本身也是半吊子。后来在这篇文章的帮助下,顺利找到了解决方法。
很明显,如果通过查表的方式,很容易就可以得出 “63” “ 63 ” 和 “7C” “ 7 C ” 这两个输出。但是这道题不能这么做,需要手动计算S盒的输出。
算法过程简介
AES加密算法涉及4种操作:
- 字节替代(SubBytes)
- 行移位(ShiftRows)
- 列混淆(MixColumns)
- 轮密钥加(AddRoundKey).
其中第一步字节替换,即SubBytes,它是作用在状态中每个字节上的一种非线性字节变换,这个变换(或称S_box
)按以下两步进行:
- 把字节的值用它的乘法逆来代替,其中 “00” 的逆就是它自己;
- 把经上一步处理后的字节值再进行如下定义的仿射变换:
因此第一步需要求多项式的乘法逆
又二进制多项式 b(x) b ( x ) 的乘法逆为满足
a(x)b(x)=1modm(x)(1) (1) a ( x ) b ( x ) = 1 m o d m ( x )
的二进制多项式 a(x) a ( x ) ,其中 a(x)=b−1(x) a ( x ) = b − 1 ( x )
计算过程
1. 求乘法逆(Multiplicative Inverse)
在RJNDAEL中的不可约多项式为:
m(x)=x8+x4+x3+x+1(17) (17) m ( x ) = x 8 + x 4 + x 3 + x + 1
假设我们要求 a(x) a ( x ) 的逆,对 a(x) a ( x ) 和 m(x) m ( x ) 使用扩展欧几里得算法可以得到形如
b(x)∗a(x)+s(x)∗m(x)=1(18) (18) b ( x ) ∗ a ( x ) + s ( x ) ∗ m ( x ) = 1
的等式,即等价于
b(x)∗a(x)=1(modm(x))(19) (19) b ( x ) ∗ a ( x ) = 1 ( m o d m ( x ) )
其中