1.17 SKIPJACK加密算法
SKIPJACK是一種分組加密算法,其輸入、輸出分組為64比特,密鑰長度為80比特。輸入明文(密文)分成4個16比特的字,交替使用A和B兩種步進規則,經32次步進(即32層迭代變換)生成密文(明文)。第1~8次步進、17~24次進步按步進規則A進行,第9~16次步進、25~32次步進按步進規則B進行。A和B兩種步進規則如圖1.17.1所示。

圖1.17.1 SKIPJACK算法的兩種步進規則
圖1.17.1中,w1~w4表示4個16比特的字;G是依賴的密鑰可逆變換,也稱為G置換;計數器取值范圍1~32,分別用于32次步進。
用上角標i表示第i步進變化后的狀態,即用表示明文,
表示經 i次步進后的狀態,則步進規則A和B可用下列公式來表示。
1.加密
(1)步進規則A如下:

(2)步進規則B如下:

i=0,1, …,31
經上述32次步進后,可得,即密文。
2.脫密
(1)步進規則A的逆運算:

(2)進步規則B的逆運算:

經上述32次步進后,可得,即明文。
G置換依賴于密鑰的4層Feistel結構,如圖1.17.2所示。

圖1.17.2 SKIPJACK加密算法G置換
將80比特的密鑰分成10個字節,記為k0~k9。將第i步進輸入的16比特的字分成高位和低位兩個字節,分別記為g1和g2,迭代計算如下:
g3=F(g2⊕k4i)⊕g1
g4=F(g3⊕k4i+1)⊕g2
g5=F(g4⊕k4i+2)⊕g3
g6=F(g5⊕k4i+3)⊕g4
則
Gi(g1‖g2)=g5‖g6
式中,“‖”表示兩個字節相連接。在k4i~k4i+3中,下角進行的是模10加。
類似地有
(Gi)-1(g5‖g6)=g1‖g2
式中,gj=F(gj+1⊕k4i+j-1)⊕gj+2, j=4,3,2,1。
G置換中的F函數是8比特的字節非線性代替,如下所示。用高4比特表示行,低4比特表示列,如F(7a)=d6。

SKIPJACK加密算法有類似于DES的四種工作方式,它們是:
輸出反饋(OFB)方式:64比特。
密文反饋(CFB)方式:64比特、32比特、16比特、8比特。
電子密本(ECB)方式:64比特。
密文分組鏈接(CBC)方式:64比特。
例如,電子密本方式(下面所有數值都以十六進制的形式表示,左邊為最高比特)。
明文輸入為:33221100ddccbbaa。
密鑰為:00998877665544332211。
中間步驟如下:


密文輸出為2587 cae2 7a12 d300。