1.6 LOKI加密算法
LOKI是由澳大利亚的L.Brown和J.Seberry等人提出的一种16层DES型迭代分组加密算法,该加密算法于1989年提出,又于1991年做了修改,原方案称为LOKI89,修改后的方案称为LOKI91。LOKI加密算法和DES加密算法非常相似,也是由E扩展、S盒代替、P置换,以及与层密钥进行模2加来构建层函数的。LOKI加密算法的分组长度为64比特,密钥长度也为64比特,迭代层数为16。LOKI91加密算法是AES的候选算法之一,采用16层的平衡Feistel结构,其分组长度为128比特,密钥可以为128、192、256比特。
1.6.1 LOKI89加密算法
明文P首先与密钥进行模2加,再被分成32比特的左右两部分,然后经过如下所示的16层迭代变换。
Li=Ri-1
Ri=Li-1⊕F(Ri-1⊕Ki-1), i=1,2, …,16
最后一层不变换,第16层输出与层密钥K16进行模2加后即可得到密文。
LOKI91加密算法去掉了LOKI89加密算法中的输入、输出与密钥的结合过程。
F函数由E扩展、S盒代替和P置换三部分组成。
E扩展按表1.6.1所示的E扩展表将32比特扩展成48比特。
表1.6.1 E扩展表
LOKI加密算法使用了4个相同的S盒。S盒的输入为12比特,输出为8比特。LOKI加密算法首次使用了有限域上的多项式来构建S盒,它使用了16个F2上的8次不可约多项式,通过有限域GF(28)中的模幂运算来实现S盒代替。我们把F2上的多项式简记为由它们系数组成的二元数组,例如,将多项式x8+x6+x5+x4+x2+x+1简记为(101110111), S盒的计算使用下列16个F2上的8次不可约多项式,即
二元数组与F2上的多项式相对应,在S盒的计算中需要相互转换。
将输入的48比特从左到右每12比特输入一个 S 盒,将12比特记为 b0…b11,令 r 为(b2b3b4b5b6b7b8b9)的二进制值,c为(b0b1b10b11)的二进制值,则S盒的输出值为
o=(c+r)31 mod gr
在LOKI91加密算法中,S盒的输出值为
f=c+[(r×17)⊕0xff]mod 256
将f看成F2上的多项式,计算
o=f 31 mod gr
式中,o可看成二元数组,即S盒的8比特输出。
4个S盒的32比特输出经过P置换后可变成层函数F的输出,如表1.6.2所示。
表1.6.2 层函数F的输出
LOKI89加密算法的层密钥是通过将密钥分成左右两半,并且经过变换和循环移位生成的,记K=KL| KR, ROL(·, n)表示循环左移n位,相关伪代码如下:
for(i=0; i<16; i+=2) { Ki=KL KL=ROL(KL,12) Ki+1=KR KR=ROL(KR,12) } KL=ROL(K14,12) KR=ROL(K15,12) K16=KL|KR
LOKI89加密算法和LOKI91加密算法的层密钥生成规律如图1.6.1所示。
图1.6.1 LOKI89加密算法和LOKI91加密算法的层密钥生成规律
1.6.2 LOKI91加密算法
LOKI91加密算法的层密钥生成的相关伪代码如下:
for(i=0; i<16; i+=4) { Ki=KL KL=ROL(KL,12) Ki+1=KL KL=ROL(KL,13) Ki+2=KR KR=ROL(KR,12) Ki+3=KR KR=ROL(KR,13) }
LOKI91加密算法的结构框图和层密钥生成过程如图1.6.2所示。
图1.6.2 LOKI91加密算法的结构框图和层密钥生成过程
将128比特的明文分组分成64比特的左右两部分,即L0和R0,然后进行如下伪代码所示的16层变换。
for(i=1; i<=12; i++) { Ri=Li-1⊕F(Ri-1+K3i-2, K3i-1); Li=Ri-1+K3i-2+K3i; }
最后一层左右两部分不变换。
K3i-2、K3i-1、K3i(i=1,2, …,16)为48个64比特的层密钥,层密钥生成规律如下:
(1)由输入密钥生成4个64比特的字K40‖K30‖K20‖K10。如果输入密钥长度为256比特,则记为4个64比特的字Ka‖Kb‖Kc‖Kd,则
K40‖K30‖K20‖K10=Ka‖Kb‖Kc‖Kd
如果输入密钥长度为192比特,则记为3个64比特的字Ka‖Kb‖Kc,即
K40‖K30‖K20‖K10=Ka‖Kb‖Kc‖F(Ka, Kb)
如果输入密钥长度为128比特,则记为2个64比特的字Ka‖Kb,即
K40‖K30‖K20‖K10=Ka‖Kb‖F(Kb, Ka)‖F(Ka, Kb)
(2)进行如下伪代码所示的48层变换。
for(i=1; i≤48; i++) { Ki=K1, i=K4, i-1⊕gi(K1, i-1, K3, i-1, K2, i-1); K4, i=K3, i-1; K3, i=K2, i-1; K2, i=K1, i-1; }
其中
gi(K1, K3, K2)=F[K1+K3+(δ×i), K2]
δ=[sqrt(5)-1]×263=0x9E3779B97F4A7C15
函数F(A, B)由五部分组成,如图1.6.3所示。
图1.6.3 F(A, B)函数的组成示意图
第一部分是一个由参数B(即部分密钥)控制的比特置换,记为KP(A, B)。如果将A分成32比特的左右两部分,即AL和AR,记B的低位32比特为BR,则KP(A, B)就是下面的置换:当B的第i(i=1,2, …,32)比特为1时,AL和AR的对应比特互换,用式子表示KP(A, B):
KP(A, B)=KP(AL‖AR, BR)={[(AL&~BR)|(AR·BR)]‖[(AR&~BR)|(AL·BR)]}
式中,&~表示逐位进行与非运算,||表示连接,|表示逐位进行或运算,· 表示逐位进行与运算。
第二部分是一个E扩展,它将64比特扩展成96比特后作为S盒的输入。E扩展规律如表1.6.3所示。
表1.6.3 E扩展规律
第三部分是8个S盒,由S1和S2按S1S2S1S2S2S1S2S1的顺序组成,S1和S2的输入分别为13比特和11比特,输出都为8比特,由下列两个式子生成。
S1(x)=[(x⊕0x1fff)3 mod 0x2911]&0xff
S2(x)=[(x⊕0x7ff)3 mod 0xAA7]&0xff
上面两个式子分别是在有限域GF(213)和GF(211)中进行运算的。E扩展后的96比特从左到右依次作为8个S盒的输入。
第四部分是一个固定的P置换,如表1.6.4所示。
表1.6.4 P置换
第五部分又是8个S盒,由S1和S2按S2S2S1S1S2S2S1S1的顺序组成。P置换的64比特输出从左到右依次作为8个S盒的低8位输入,每个S盒的高输入比特则由B的高32比特(63~32比特)从左到右按顺序组成。