高级加密标准AES候选算法之一Serpent
1997年,美国国家标准和技术研究所(NIST)发布公告在全世界范围内征集新的加密标准。值的一提的是,在征集过程的最后一轮五个算法的评选中,Rijndael得87票,Serpent得59票,排名第二。Serpent是一个非常经典的SPN式分组密码体制,同时它的安全强度非常高。与Rijndael一样,Serpent尚未有重大安全漏洞被发现。
分组大小:128Bit
种子密钥长度:256Bit
加密(解密)轮数:32
混淆层:8个4X4的S盒(S0~S7)轮流使用(第i轮使用32个S(i%8))i=0,1,2,……31
8个S盒详见常见对称加密算法的混淆层(S盒)及其密码学指标。
扩散层:(Aj+1,Bj+1,Cj+1,Dj+1)=L(Aj,Bj,Cj,Dj)
线性扩散层LT结构图
(LT变换由移位,循环移位,异或运算组成)
(其中Aj、Bj、Cj、Dj和Aj+1、Bj+1、Cj+1、Dj+1均为32位字)
线性变换LT:
Serpent的密钥扩展算法:Serpent使用的是256比特密钥,同时也支持128和192比特密钥。若密钥长度不足256比特(即128和192比特情况),则通过这样的方案扩展到256比特:在原密钥数据尾部添加一比特0,再添加若干比特1,直到到达256比特为止。
由此我们得到了Serpent的256比特密钥,但在Serpent加密方案中使用的是33个128比特的轮密钥K0,K1,……K32。需要使用Serpent的密钥扩展方案将256比特密钥扩展为33*128比特的轮密钥,Serpent的密钥扩展方案如下:
将256比特密钥分为8个32比特的字,记为W-8,W-7......W-1,对他们进行如下操作扩展至W0,W1......W131:
Wi=(Wi-8⊕Wi-5⊕Wi-3⊕Wi-1⊕M⊕i)<<<11 i=0,1,2……131
其中M=0x9e3779b9为黄金分割点。
这样,我们得到了W0,W1......W131,再对它们进行S盒替换操作,如下
(k0,k1,k2,k3)=S3(W0,W1,W2,W3)
(k4,k5,k6,k7)=S2(W4,W5,W6,W7)
(k8,k9,k10,k11)=S1(W8,W9,W10,W11)
(k12,k13,k14,k15)=S0(W12,W13,W14,W15)
(k16,k17,k18,k19)=S7(W16,W17,W18,W19)
...…
..….
(k124,k125,k126,k127)=S4(W124,W125,W126,W127)
(k128,k129,k130,k131)=S3(W128,W129,W130,W131)
Serpent加密过程:
{
B0=IP(P)
Bi+1=R(Bi)
C=FP(B32)
其中
R(X)=L(Si(X⊕Ki)) i=0,1,2……30
R(X)=Si(X⊕Ki)⊕K32 i=31
}
P表示明文
C表示密文
B表示中间数据
R表示第i次循环迭代
S表示第i次所用S盒变换
L表示线性变换
IP{
Bk-> B4k
Bk+32-> B4k+1
Bk+64-> B4k+2
Bk+96-> B4k+3
}
FP{
B4k ->Bk
B4k+1 ->Bk+32
B4k+2 ->Bk+64
B4k+3 ->Bk+96
}
其中k=0,1,2……31
Serpent作为AES的5个候选算法之一,综合得分为59,排名第二。其安全性最高,只是加解密效率不高(32轮迭代),因此被淘汰。