1 基本信息
输入:算法输入128bit明文[QX1] 或者密文,密钥长度支持128、192、256,两个表格[QX2] ;应用输入长度不限。
结构:Feistel结构[QX3]
填充:算法无规定明文填充方式,可由用户自行协商[QX4] ;密钥长度采用0填充
核心计算过程:初始白话、轮函数、输出白话、密钥生成
特点:加解密过程除了子密钥使用顺序相反,其他完全一样[QX5]
输出:算法输出128bit密文[QX6] ;应用长度输出为64bit的倍数
操作模式:CBC、ECB、CTR、OFB等
轮数:16轮
2 加密过程:
2.1数据分组和补位
输入:不限制用于应用程序的输出长度,但每个分组明文为128bit。密钥长度可以是128、192、256中的一种。
当明文分组长度不符合分组要求时,可采用用户约定的填充算法,具体填充规则可参照DES那个文档。当密钥长度不符合要求时,填充0,直到最先满足要求时就不再填充,比如未填充时密钥长度为150bit,则填充0至密钥长度为192而不是256.
2.2数据处理
2.2.1 h函数介绍
为了理解密码算法的整个操作流程,这里先介绍密码算法中用到的h函数。
h函数输入为X与Li,均为32bit,输出Z也为32bit。从上图中也可以看到,h函数的操作与k相关(k=密钥长度/64)。q1和q0是置换操作。将输入的32位字分为4个Byte,每个Byte单独做置换之后,与输入Li进行异或,经过多轮这样的计算,得到一个4*1的列向量,这个向量与定义在GF(2^8)上的4*4MDS矩阵相乘,得到4*1的列向量。最后将这个列向量中的四个元素组成32-bit数据Z,用到的本原多项式为:
MDS矩阵为:
H函数的操作可以描述为:
由于q0和q1都是固定的,所以只要输入X和L就可以得到输出值Z,即Z=h(X,L)。在twofish算法中Li是根据密钥得到的,在整个计算过程中不再发生变化,所以可以根据h函数建立一个表格,根据输入X,查表就可以得到输出Z的变化,这也是进行代码实现的思路。
2.2.2 置换
在上面h函数的介绍过程中,提到了两个置换q0和q1,可以将这两个操作理解为两个S盒,用8bit输入得到8bit输出。下面介绍S盒的设计原理,q0和q1都是采用如下方法构造:
x 为输入,y为输出。a0和b0其实是将输入分为高4位与低4位,经过中间结果变换再重新组合成8位数据。这里边用到了t0和t1两个置换。构造q0所用的置换为:
构造q1所用的置换为:
由于操作固定,可以为构造过程建立一个映射表,这就是s盒,一共有两个s盒。
q0的S盒为:
q1用到的S盒为:
比如对于q0置换,当输入x=0时,输出y=0xa9。
2.2.3密钥扩展操作
密钥扩展框图如下(以密钥长度为128bit举例):
上面说明白了h函数就可以理解密钥生成操作了.一共需要40个轮子密钥K,都是利用原始密钥生成的。生成过程如下;
里边有Me(even)和Mo(odd)两个变量还未说明,它的产生过程是:
令N=128(192、256)是密钥长度,k=N/64,原始密钥由8k个字节m0、m1、m2、…m8k-1组成。Mi=(m4i,m4i+1,m4i+2,m4i+3)(i=0,1,2…2k-1),Me=(M0,M2,…M2k-2),Mo=(M1,M3…M2k-1)。其实就是将原始密钥分为奇偶字
对于2iρ这个操作(0<=i<20),2i是一个Byte,乘以ρ是将Byte扩展为字,字中的每个Byte都是相等的,均为2i。经过上面的操作就得到了两个密钥,重复20次就得到所有密钥。
2.2.4输入白化(input whitening)
这个操作比较简单,将明文分为4个字,然后分别与K0、K1、K2、K3进行异或操作。进行白化操作,用于增加增针对密码剩余部分的密钥搜索攻击的难度。
2.2.5轮函数
轮函数整体框图如下:
轮函数的内部细节如下:
一共需要进行16轮计算。从上图可以看到,轮函数的操作主要由F函数和异或构成构成,整体计算过程用数学形式表示为
第一个式子表示,将第r轮输入的第0个字和第一个字进行F运算,得到Fr,0和Fr,1。再进行一些简单的异或、移位操作就得到下一轮的输入。
F函数是核心运算,它由g和PHT两个操作构成,数学表示为:
前两个式子是g函数,后两个式子是PHT操作。PHT操作比较简单就是做两个模2^32加法,下面介绍g函数,其实g=h(Ri,S),Ri是输入的数据,S是由原始密钥mi生成得到的,生成过程如下:
其中RS矩阵是:
这也是GF(2^8)上的矩阵相乘,用到的本原多项式是:
轮密钥加也是模2^32加法,用到的密钥是生成的密钥。
2.2.6 输出白化
输出白化与输入白化类似,都是进行异或操作。用到的密钥是K4、K5、K6、K7。
这个图里的undo last swap是取消第16轮输出的交换操作,因为算法规定第16轮输出不交换次序,所以这里通过附加一个交换来抵消第16轮交换的影响。
这个图里的undo last swap是取消第16轮输出的交换操作,因为算法规定第16轮输出不交换次序,所以这里通过附加一个交换来抵消第16轮交换的影响。
3 解密过程:
加解密过程除了子密钥使用顺序相反,其他完全一样。[QX1]
由上面的解密程序即可印证这一点
4对整个文件加密:
当文件包含多个分组时,需要选择运行模式,常见的包括ECB、CBC、CFB、OFB、CTR等。这只是对明文或密文分组进行处理,整个过程仍然只用一个密钥。
5 并行性分析
分组间:
分组间的并行性取决于所选择的加密模式。例如,如果选择的是ECB模式,那么分组间不存在数据依赖关系;如果选择的是CBC模式,那么后一分组需要使用前一分组的计算结果,具有直接的数据依赖关系,无法实现分组间并行。
分组内:
分组内不同轮之间具有较强的数据相关性,无法并行;但是轮操作与密钥生成可以实现并行处理,只要满足轮子密钥不影响轮函数的使用即可。
每一轮前两个输入字在进行g函数操作时可以并行。