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加密算法的脫密過程和加密過程一致。