1.5 FEAL加密算法
FEAL是由日本NTT电子通信实验室的A.Schimizu和S.Miyaguchi于1987年提出的一个分组加密算法,采用平衡Feistel结构,几乎同DES加密算法完全一样。它的分组长度为64比特,迭代层数为N(N=2x, x>1)。密钥长度有128比特和64比特两种类型,前者称为FEAL-NX,后者称为FEAL-N,当前者的后64比特全为0时,两者就完全一致了。FEAL加密算法以字节为单位进行运算,便于软件快速实现。
FEAL加密算法框图如图1.5.1所示。
图1.5.1 FEAL加密算法框图
明文P同子密钥KN+1进行模2加后被平分成32比特的左右两部分L0和R 0, L 0和L 0⊕R 0作为第一层的输入,经过N层的迭代过程如下:
Li=Ri-1
Ri=Li-1⊕F(Ri-1, Ki), i=1,2, …, N
对(LN, RN)进行如下变换:
(LN, RN)=(RN, LN)
RN=RN⊕LN
(LN, RN)=(LN, RN)⊕KN+2
(LN, RN)即所求的密文。层密钥K1, K2, …, KN的长度为2字节,KN+1、KN+2的长度为8字节,层密钥的生成规律见1.5.2节。
1.5.1 层函数F
层函数F对2字节的层密钥和4字节的输入进行模2加、模256加和循环移位操作后,得到4字节的输出。记2字节的层密钥为(β0, β1),4字节的输入为(α0, α1, α2, α3),则层函数F的4字节输出(c0, c1, c2, c3)为:
Z1=α1⊕β0⊕α0
Z2=α2⊕β1⊕α3
c0=S0(α0, c1)
c1=S1(Z1, Z2)
c2=S0(Z2, c1)
c3=S1(α3, c2)
式中,S0和S1为两个S盒,它们的输入为2字节,输出为1字节。这两个S盒分别由下面两个公式生成(其中“<<<”表示循环左移位):
S0(X1, X2)=[(X1+X2)mod 256]<<<2
S1(X1, X2)=[(X1+X2+1)mod 256]<<<2
在程序实现中可以把整个层函数F看成一个48比特输入、32比特输出的非线性S盒。
1.5.2 层密钥生成规律
先介绍密钥K为128比特的情形。由128比特的密钥K生成KN+2个层密钥是通过(N/2+4)层的迭代过程来完成的,如图1.5.2所示。
图1.5.2 FEAL加密算法的层密钥生成框图
将输入密钥K平分成64比特的左右两部分KL和KR,又将KL平分成32比特的左右两部分A0和B0,将KR平分成32比特的左右两部分KR1和KR2,经过(N/2+4)次迭代过程(其中“>>>”表示循环右移位):
Ar=Br-1
Br=f(Ar-1, Br-1⊕Qr⊕Ar-2)
K 2 r-1=Br>>>16
K2 r=Br&0xffff, r=1,2, …, N/2+4
KN+1=KN+1‖KN+2‖KN+3‖KN+4
KN+2=KN+5‖KN+6‖KN+7‖KN+8
当r=1时,定义Ar-1=0。
Qr由KR来决定,即
f 函数(DES加密算法的核心)和层函数 F(层函数)非常相似,它的输入为8字节,输出为4字节。记输入的8字节为(α0, α1, α2, α3, β0, β1, β2, β3),输出的4字节为(f0, f1, f2, f3),则f函数为:
f1=α1⊕α0
f2=α2⊕α3
f1=S1(f1, f2⊕β0)
f2=S0(f2, f1⊕β1)
f0=S0(α0, f1⊕β2)
f3=S1(α3, f2⊕β3)
S0和S1同层函数F中的S0和S1。
当输入密钥K为64比特时,在尾部补64个0,即可用上面的方法来生成层密钥,此时KR全为0, Qr也全为0。
FEAL加密算法的脱密过程和加密过程一致。