本文原创,转载请注明出处。
douqingl@gmail.com
1. 概述
由于工作的原因,我学习了SERPENT算法(注释1),并进行了软件实现,抓取了每一轮、每一步操作的中间数据,在此分享给大家。
首先,要说明的是,我学习SERPENT算法是为了硬件实现,所以本文不涉及软件实现时要关注的软实现效率、算法优化,只是为了弄清算法的每一步在干什么,提取详尽的标准数据。
来源 http://blog.csdn.net/douqingl
学习SERPENT算法时,我也查阅了一些资料。发现讲解最详尽的文档就是官方给出的说明文档——Serpent: A Proposal for the Advanced Encryption Standard(注释2)。但是这篇文档作为AES算法的投标文档,过分注重讲解算法设计时的数学原理,强调其安全性,对于数学基础不好的人来说,参照此文进行设计还是有些吃力的。
撰写本文之前,我阅读了官方给出的说明文档,参照官方文档和代码(
注释3
),自己写了C语言的实现,并用VS2010运行通过。我的C实现中,每一步运算的结果都打印了出来,方便我在硬件实现SERPENT时,抓取中间步骤的标准数据进行验证。
我会提供我的VS2010工程的下载方式做为参考(注释4),毕竟算法只靠嘴上说实在是抽象,对照着代码,能更好的理清逻辑关系。
正文分为
SERPENT算法数据加解密介绍、
SERPENT算法密钥编排介绍和
SERPENT软件实现两部分,进行详细阐述。
1. SERPENT算法数据加解密介绍
1.1 SERPENT是一种
分组加密算法(注释5)。当年DES(DATA ENCRYPTION STANDARD)加密性已经无法满足要求了(在摩尔定律的驱动下,硬件快速发展,DES 56bit的密钥在暴力破解面前不堪一击),所以有关部门(NIST)要一个高速、安全的算法,然后SERPENT/TWOFISH/RC6等等算法都被发明出来,参与AES投标 (不过上述三个都没被选中,(*^__^*) 嘻嘻……,中标的是Rijndael)。5个进入最后一轮的算法中,SERPENT的安全性最高,但是由于运算速度等原因落选了(设计者过分注重安全性的开发,性能上向DES看齐了,所以说立项时候要高瞻远瞩啊~)。
1.2 SERPENT运算时,每个BLOCK的长度是128bit(DES 64bit , Rijndael/
SM4 /
SM1 128bit
),密钥长度
128/192/256bit可选(其实是任意256bit以内,任意长度可选,128、192、256只是算法发明者建议的长度)。
1.3 SERPENT有两个版本,区别是使用SBOX不同,SERPENT-0使用DES的SBOX,SERPENT-1使用新的SBOX。本文讨论SERPENT-1版本,即通常意义上的SERPENT。
1.4 SERPENT算法整体结构如下,128bit数据输入后,先进行一次initial permutation(128bit input , 128bit output)打乱顺序,然后进行32轮运算后,进行一次final permutation(128bit input , 128bit output)再打乱一次顺序,输出就是运算结果了。注意,前31轮的运算使用同样的规则,而最后一轮使用特殊的规则,这一点不像DES,DES的16轮运算都是用同样的规则。同DES一样,initial permutation和final permutation互为反函数。
我们命名initial permutation的输入为P(plain text),输出为B(0),每一轮的输入为B(n),输出为B(n+1),n为轮数,0~31。final permutation的输出为C(