分组密码算法Serpent-256的差分代数分析
【摘要】:
现代密码理论与技术是信息安全的重要基础。现代密码学中加密算法包括对称加密和非对称加密,前者又分为分组密码,流密码和Hash函数。分组密码由于其具有速度快,易于标准化和便于软硬件实现等优点,已经成为一种重要的加密方案。
密码学家利用各种数学方法设计高效安全的加密算法,而密码分析学家寻找设计中存在的弱点并进行相应的改进,最终设计出高效安全的算法。目前,差分分析,线性分析,Square攻击和代数分析已经成为密码分析的主流分析技术。
1977年,DES成为分组密码算法的第一个标准,长久以来得到了广泛的应用。其分组大小和密钥长度分别是64位和56位,这成为DES的主要安全弱点。因此DES不再安全,需要用新的安全算法替代。最终,美国国家标准技术局NIST征集高级加密标准(AES)以替换DES。NIST宣布在2001年AES选出之前,3DES作为临时的标准算法。
1997年,NIST发起了AES的征集活动。征集要求AES的分组大小是128位,密钥长度是128、192和256位。
1998年,NIST公布了在第一轮中选出的15个AES侯选算法,第二次会议在1999年召开,讨论了全球密码分析学家对侯选算法的分析结果。最终,NIST从原始的侯选算法中选出五个算法,AES最后一轮的侯选算法有MARS、RC6、Rijndael[1]、Serpent和Twofish。在侯选大会上,Rijndael作为获胜者得到87票,Serpent得到58票,Twofish得到31票,RC6得到23票,MARS得到13票。最后,NIST选Rijndael作为AES算法。由于Rijndael执行速度优于Serpent,因此Rijndael成为获胜者。
Serpent是由Ross Anderson、Eli Biham和Lars Knudsen设计,其运行速度优于DES,安全性优于3DES,它是一个比较安全的算法。至今,尚未发现针对Serpent的短路攻击。设计者为本算法提供了一些分析,证明Serpent可以抵抗已有攻击。Serpent算法轮数是32轮,而多数算法是16轮。虽然可能存在一些未知的攻击会破解16轮Serpent,但是攻击32轮是困难的。因此Serpent被认为是强安全算法。然而,随着轮数的增加,势必降低加密速度,这也是Serpent比Rijndael慢的原因。设计者认为Serpent会有至少一个世纪的生命期。因此,对Serpent的安全性分析工作具有很重要的意义。
2002年,Courtois和Pieprzyk运用流密码的分析技术——代数攻击,来分析分组密码[6]。他们对Rijndael和Serpent进行了分析。分组密码的代数攻击主要运用了S盒的性质,将分组密码表示成为二次布尔函数方程。在这些方程中,每轮S盒的输入和输出是未知量,然后将布尔函数扩展至整个算法中。这样方程中未知量数目和方程数目都非常大。求解二次方程的基本方法是线性化,线性化的思想是将方程中的二次项用一个新的项替代,从而将方程转化成为线性方程组。在超定方程组中(方程的数目比未知变量的数目要少),文献[34]提出了一个推广的线性化算法,该算法中,由某些变量和方程的乘积产生新的方程,但是这种方法不能保证所产生的方程是独立无关的。文献[6]提出另外一种线性化方法,这种方法利用方程的稀疏性以产生更多的新的方程而尽可能少的引入新项。但是,这种方法的时间复杂度很难去估计,其有效性目前一直没有定论。
差分分析由Eli Biham和Adi Shamir于1990年提出[7,8],是密码分析中最基本和重要的方法之一。攻击者分析两个明文差分和其相应密文的差分来获取密钥信息。通过寻找多轮高概率的差分特征,猜测一轮或二轮的轮密钥进行分析。
本论文中,我们将提出一个新的攻击方法,差分-代数攻击,并利用该攻击方法对8轮Serpent-256进行分析。本论文的主要工作如下:
1.给出了新的密码分析技术:差分-代数分析方法
差分分析的有效性在于是否能找到多轮数的高概率差分特征。对于代数攻击,随着轮数的增加,方程的数目也不断增加,求解方程也就更加困难。目前对代数攻击的研究更多着眼于寻找求解方程的方法上,如XL算法。如果现有的差分分析结果基于一个具有较高概率优势的差分特征得出,利用差分分析方法再对其进行改进将非常困难。而对于代数攻击,如果不能找到有效的求解方程的方法,改进其当前的分析结果也是非常困难的。我们考虑利用分组密码算法的代数特性扩展当前差分分析结果到多轮。
王小云教授为本论文提出了组合差分分析与代数攻击相结合的差分-代数分析的思想,基于该思想,在导师的指导下,我们建立了差分-代数分析的数学模型。
在差分分析中,基于r轮的差分特征可以攻击r+1轮或r+2轮。我们将利用差分-代数分析方法扩展到更多轮-第一步是建立从r+1轮到r+s轮的多变量代数方程组,方程组中,系数与密文和差分特征的输出差分有关,未知量是后s轮的子密钥。如果一对明文对是正确对,满足差分特征,将其对应的密文代入方程组中系数项,该方程组的解一定包含正确子密钥的值。如果我们可以求得方程组的解,则成功实现了对r+s轮的攻击。
为了建立方程组,本论文中首先给出了S-box的布尔函数的表示算法。基于我们提出的算法,开发了相应的软件,给定S-box的真值表(输入是m位,输出是n位),可以自动生成S-box布尔函数。
然而,求解后几轮的非线性方程组仍然是困难的。但是,对方程组进行解的验证却是容易的。为了减少分析的复杂性,在验证过程中采用了以下关键技术:
1)如果一个分组密码算法的雪崩效应不够理想,在每个方程中,仅包含部分密钥比特,这对攻击是非常有利的。通过逐一验证每个方程的方法来找到方程组的解。根据随机分布原理,验证每个方程时,对于所有可能的解中,将有一半是满足方程的,一半是不满足的。
2)选择最优的方程验证顺序,尽早确定出一些密钥比特的值。
对于那些包含较少子密钥变量的方程优先验证。在确定下一个要验证的方程时,选择那些包含的子密钥变量中,已经验证的子密钥变量最多的,而且新出现的子密钥变量最少的方程来验证。
3)将方程中出现的子密钥变量空间进行分割。
在方程中出现的所有的子密钥的可能的值都要进行验证,如果方程中未知量较多,验证方法和穷搜相比,没有太多优势。为了加强这种优势,我们使用了两个方法:其一是为了减少方程组中的变量数和项数,将基于差分特征的输出差分推导出更多轮的差分信息;其二是对子密钥变量作一些变换,可以达到减少变量数的目的。
由于差分-代数分析中利用了子密钥在方程组中的分布特性,使得在差分-代数攻击中验证的子密钥数少于差分分析中猜测的子密钥数。因此我们的分析中对子密钥空间进行了更为细致的分割。为了与差分分析进行比较,我们引入两个重要的评估参数,其一是Eli Biham和Adi Shamir提出的信噪比S/N,其二是满足正态分布的成功率P_s。P_s与选择明文数及S/N等有关。基于其关系式,我们得到以下结论:如果后几轮的子密钥分布不理想,也就是密文位只与后几轮的部分子密钥位有关,针对该类密码算法的差分-代数分析将比差分分析更为有效。
2.8轮Serpent-256的差分-代数分析
至今,Serpent-256差分分析的最好结果由Biham等得出[9]。他们找到了概率为2~(-93)的6轮差分特征,从而获得了基于该差分特征的8轮256位密钥的Serpent算法的差分分析。该分析的时间复杂度是2~(206.7)次8轮Serpent加密,数据复杂度2~(84),存储要求是2~(89)字节。
在我们的分析中,构造了最后两轮的方程组,未知变量是7-8轮的子密钥比特,系数和密文及6轮差分特征的输出差分相关。通过利用非活性S盒的特征,导出第8轮的5比特的输入差分,第7轮的52比特的输出差分和76比特的输入差分。我们构造的方程组有128个方程,其中76个方程最高次数为9,项数约为5000项,47个方程最高次数为3,项数约为250项,而5个方程最高次数为3,项数不超过10项。我们寻找到验证方程解的最优次序,以减少分析的复杂度。
我们的方法运用2~(83)个选择明文,2~(180.4)次8轮Serpent-256加密运算,需要的存储是2~(176.7)字节。和差分分析相比,我们的攻击时间复杂度大大减少,而且数据复杂度也有所降低。从分析结果可以得到结论:在Serpent算法中,由于在每轮的线性变换中,输出比特仅与少量输入比特有关,导致了我们的攻击的可行性。