Twofish算法一般包括以下的基本组件:
(1) Feistel Network。常被用来将一个函数(通常称为F函数)转换成一个排列,可用非线性函数来表式:
F:{o,1}n/2 X {0,1}m-->{0,1}n/2
Twofish采用的是一个16回合的Feistel Network,使用了一个双射F函数。F函数是一个与密钥相关64 bits的排列运算。它包含了三个部份:R0,R1和回合数r0R0经过函数g的运算后成为T0,R1先左旋8 bits后再经过函数g的运算后成为T1,接着T0,T1再经过PHT的组合运算后得到函数F的输出值F0,F1 :
每一回合的核心F函数,均由两个g函数构成。函数g是整个Twofish最重要的部分,其输入X是32位的数据,分成4个字节,每一个字节运算时都有属于自己的S一boxes,运算完成后得到的结果再输入到一个4?4的MOS矩阵,可得到一个32位的输出结果Z0整个数学表示式如下:
X1=[X/28]mod28i=q,….,3
Y1=s1[x1]i=0,…,3
其中MDS矩阵如下所示:
(2)s-boxes。是一种非线性的置换运算,可以用表格来表示。不同的S-box可由随机的方式产生,或用特定的算法产生出来。S-box输入和输出个数,随分组密码算法的不同而有所不同。Twofish使用四个8x8位的S-boxes,是由两个固定的8x8位的置换,再加上密钥的数据所产生出来的。
(3)MDS矩阵。是一个作用在域上的线性映射,从一个包含a个元素的向量映射到有b个元素的向量,会产生一个含有a+b个元素的合成向量,而这个向量有一个性质就是:任何非零的向量它的非零元素个数至少有b+1个。换句话说,MDS通常表示成含有。axb个元素的矩阵型态,而Twofish本身就使用了一个作用在GF(28)上4 x4的MDS矩阵。
(4)PHT。PHT是一种可以快速执行的简单混合操作。假设给定两个输入a和b,则32位的PHT定义为:
(5)whitening。是在第一个回合之前和最后一个回合之后,将密钥的数据和分组数据进行XOR的操作。
(6)Key shceduling。shceduling的作用是从源密钥产生k0,…,K39,共40个长度为4字节的扩展密钥以及4组相关的S-boxes。这些S-boxes由g函数使用。Twofish定义了128、192、256位三种源密钥长度,短于256位的输入密钥用O填充至就近长度。Key shceduling的基本流程如下:设k二N/64,则源密钥M可分成2k个32位的字,构成两个长度为k的字向量,
Me=(M0,M2,…,M2K-2),M0=(M1,M3,…,M2K-1)
第三个字向量S=(SK-1,,SK-2,…,S0)由下式确定:
其中向量(m0,m1,…,m8k-1)的每个元素由源密钥的相邻8位组成,RS矩阵定义如下:
Me、Mo、S就是产生扩展密钥的三个要素。K0,…,K39由下面的表达式确定: