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。