伽罗华域上的多项式乘法,其结果需要mod 本原多项式P(x),在
中可以通过以下方式简化计算。
例子:
3. AES加密:
AES每轮的加密步骤可以分为字节代换(S-BOX, substitute bytes)、行移位(shift rows)、列混合(mix columns)。
AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。S盒即状态矩阵中的元素按照以下方式映射为一个新的字节,把该字节的高4位作为行值,低4位作为列值,取出S盒或者逆S盒中对应的行的元素作为输出。例如,加密时,输出的字节S1为0x12,则查S盒的第0x01行和0x02列,得到值0xc9,然后替换S1原有的0x12为0xc9。
行移位是一个简单的左循环移位操作。当密钥长度为128比特时,状态矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节,如下图所示:
列混合变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图的公式所示:
注:矩阵相乘等价于有限域内多项式相乘.,乘01相当于原多项式不变,乘2相当于多项式乘x,乘3相当于多项式乘x+1。
同时,针对乘x,x+1,有更快速的方法计算,例如:
对于一般形式的多项式
,两侧乘x得到:
这时有两种情况:
(1)a_7 == 0,此时结果是一个小于指数小于8的多项式,不需要取模计算。
(2)a_7 == 1,则直接将a7x8替换为
,而不用进行除法取模计算,即
其中,加一个多项式等价于异或一个二进制数
具体操作方式如下:
这就可以把列混淆过程完全转换为异或运算。
轮密钥加是将128位轮密钥Si与状态矩阵中的数据进行逐位异或操作,如下图所示。其中,密钥Ki中每个字W[4i],W[4i+1],W[4i+2],W[4i+3]为32位比特字,包含4个字节,轮密钥加过程可以看成是字逐位异或的结果,也可以看成字节级别或者位级别的操作。也就是说,可以看成S0 S1 S2 S3 组成的32位字与W[4i]的异或运算。
AES总体如下:
4. RSA加密
在对称加密算法中,由于加密和解密使用同样规则(简称"密钥")。但这种加密模式有一个最大弱点:甲方必