密码算法应用实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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-1F(Ri-1Ki-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比特的左右两部分,即L0R0,然后进行如下伪代码所示的16层变换。

for(i=1; i<=12; i++)
{
    Ri=Li-1F(Ri-1+K3i-2, K3i-1);
    Li=Ri-1+K3i-2+K3i;
}

最后一层左右两部分不变换。

K3i-2K3i-1K3ii=1,2, …,16)为48个64比特的层密钥,层密钥生成规律如下:

(1)由输入密钥生成4个64比特的字K40K30K20K10。如果输入密钥长度为256比特,则记为4个64比特的字KaKbKcKd,则

K40K30K20K10=KaKbKcKd

如果输入密钥长度为192比特,则记为3个64比特的字KaKbKc,即

K40K30K20K10=KaKbKcF(Ka, Kb)

如果输入密钥长度为128比特,则记为2个64比特的字KaKb,即

K40K30K20K10=KaKbF(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比特的左右两部分,即ALAR,记B的低位32比特为BR,则KP(A, B)就是下面的置换:当B的第ii=1,2, …,32)比特为1时,ALAR的对应比特互换,用式子表示KP(A, B):

KP(A, B)=KP(ALAR, BR)={[(AL&~BR)|(AR·BR)]‖[(AR&~BR)|(AL·BR)]}

式中,&~表示逐位进行与非运算,||表示连接,|表示逐位进行或运算,· 表示逐位进行与运算。

第二部分是一个E扩展,它将64比特扩展成96比特后作为S盒的输入。E扩展规律如表1.6.3所示。

表1.6.3 E扩展规律

第三部分是8个S盒,由S1S2S1S2S1S2S2S1S2S1的顺序组成,S1S2的输入分别为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盒,由S1S2S2S2S1S1S2S2S1S1的顺序组成。P置换的64比特输出从左到右依次作为8个S盒的低8位输入,每个S盒的高输入比特则由B的高32比特(63~32比特)从左到右按顺序组成。