论文在线分享-AES加密算法的分析与实现-CNKI知网查重网站

论文在线分享-AES加密算法的分析与实现

2021-06-30 10:18:41
作者:杭州千明

论文相关方法-AES加密算法的分析与实现

  在网络快速发展的时代,互联网给人类带来了诸多便利,同时也带来了信息泄露的问题。数据加密技术在网络安全中起到了关键性的作用,数据加密技术使得敏感信息免受来自外界的蓄意攻击,保证了数据不被篡改和盗取。当今网络上流行的数据加密标准是AES加密标准,也称Rijndael算法,取代了已有的DES和3DES,成为了21世纪保障信息安全的新一代加密标准。

  本片论文对AES加密算法进行了研究,介绍了国内外已有的一些AES加密算法理论分析成果,分析了AES加密的原理。文章阐述了AES加密算法的四个主要步骤。对算法中的S盒和列混淆变换进行了改进,提高了原有算法的抗攻击能力。最后编程实现一个加密解密系统,从而实现了AES加密。

  计算机网络的广泛普及,带给人们精彩纷呈的多元化世界,信息安全得到了越来越多的人的重视,影响到了生活的方方面面,大到国防、航天、生物医疗小到微信的聊天记录,信息安全起到了重要作用。保护信息安全成为保障财产安全以及维护自身利益的重要手段。信息依赖于计算机和网络的传输,确保计算机与网络系统的信息安全逐渐发展为计算机科学领域的研究热点。

  经过三年的选择,美国国家标准与技术研究院(NIST)于2001年发布的Rijndael算法即AES算法最终脱颖而出,替代了原先的DES,被全世界广泛采用,成为新一代的高级加密标准。

  AES的出现使得网络安全得到极大提高,但随着计算机速度的越来越快与算法运用的普及,使得AES算法对一些加密要求比较高的数据,安全程度就得不到保障,所以需要后来者不断的对其补充与升级,本片论文分析了AES加密算法的实现过程,提出了AES的优化思想,近一步完善了AES算法。

  1.2 AES算法国内外研究现状

  自从AES算法发布以来,一直受广大国内外密码学者的关注。世界各地的专家和密码机构试图攻击破解AES算法,但仍对AES完整的算法没有实现有效的攻击。

  AES算法实现的设计者自己提出了Square攻击。Square是AES加密算法的原型,所以这种攻击方式对AES加密算法同样适用。但是Square攻击手段是猜测密钥字节的第四轮平衡的变化,适用于128位密钥的低轮简化算法,对高轮次的AES算法构不成威胁。Stefan Lucks针对密钥生成算法的缺陷,在Rijndael提出的Square攻击方法的基础上,将密钥长度延长至192bit和256bit,提高了该方法的速度。

  此后Paul Kocher,Joshua Jaffe和Beniamin Jun提出了简单能量分析即SPA。系统处理的数据不同时,执行不同的模块的差异性就会更加明显,更易受到攻击。SPA利用了计算数据或者读写寄存器的操作产生的能量消耗是有差异的变化,揭示加密操作的执行顺序,破解加密系统。此方法已经成功破解了DES加密算法。但SPA的抵御方法也很简单,尽量避免过程密钥和条件分支,就可以有助于防御SPA攻击。

  后来Kocher基于SPA的研究,提出了更进一步的差分能量分析方法DPA。DPA在灵敏度上优于SPA,在小信号条件下能够更有效的进行DPA分析,而不需要了解算法的具体实现细节。可以基于某一特定事件,区分加密设备的不同能耗,通过统计方法对能量信息进行分析,得到准确的密钥。DPA用于DES算法的分析,也用于AES算法的分析,这是攻击算法最有效的手段。

  找出AES算法的缺点,也就是在找寻AES的改进方法,在密码学基础理论的研究和应用中,一些国外的研究机构比较权威,他们制定了自己的国家密码标准。很多国家在关键算法上投入了大量的资源,但美国仍旧占据主导了主导地位。我国在信息技术领域也作出了相当大的努力并在理论研究中取得了良好的效果。

  武汉大学博士后曾祥勇,基于S盒构造8个布尔函数,计算仿射变换函数的数学表达式,并通过对幂函数的进一步研究,进一步分析了S盒中的NT仿射函数,并通过其可逆的构造过程对S盒进行了进一步的研究。利用能量攻击吴文玲分析了Rijndael算法,使攻击复杂度降低到了267至2131,大大降低了攻击的规模。通过对q-多项式性质的研究,李娜给出了一种简单的求解S盒代数表达式的算法,它具有预先计算、简单操作和证书的特点用仿射等价法对由幂函数合成可逆仿射变换产生的S盒间的关系进行了一般性划分,阐明了它们之间的关系。

  第二章AES算法研究

  AES算法是一种对称密钥的分组迭代加密算法,数据包长度固定为128位,所用密钥可分为128位、192位或256个不同长度,具有较高的安全性,易于实现软硬件,算法设计简单,同时能抵抗已知的多数类型的攻击。

  2.1 AES算法结构

  AES是一个数据包密码,它是将明文分成几组,每组长度相等,每组加密一组数据,直到加密完整的明文。在AES标准规范中数据包长度只能是128位,即每个数据包16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。

  AES的算法结构不是Fesitel结构,它每一轮使用代换和混淆并行处理整个分组。因而扩散的更快。

  AES密码算法采用替换网络(SPN)结构,每一轮操作由四层组成:第一层是非线性层,每一轮中的单个字节分别用S盒替换;第二层和第三层是线性混合层。将当前状态数组移位成行并混合成列。第四层用子密钥与当前状态阵进行字节上的异或。具体算法结构如图所示。

  上图中(a)图给出了算法的整体结构,首先输入明文与子密钥进行异或,然后经过r轮迭代最终生成密文Y,其中第1到轮迭代结构为图(b),第r轮与前面各轮不同,缺少混合层。

  2.2 AES加密算法的理论分析

  AES是一个新的可以用于保护电子数据的加密算法。明确地说,AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。下图显示了AES用192位密钥对一个16位字节数据块进行加密和解密的情形。

  AES算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES使用了几种不同的技术来实现置换和替换,以下是你要加密的128位值以及它们对应的索引数组:

  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

  192位密钥的值是:

  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 170 1 2 3 4 5 6

  7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23

  当AES的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如图所示。

  在幕后,加密例程获取该密钥数组并用它来生成一个名为w[]的密钥调度表,

  w[]最初的Nk(6)行被作为种子,用原始密钥值(0x00到0x17)。剩余行从种子密钥来产生。变量Nk代表以32位字为单位的种子密钥长度。稍后我分析AES实现时你将清楚地看到w[]是怎样产生的。关键是这里现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥以将它们与原始种子密钥区别开来。

  AES加密例程开始是拷贝16字节的输入数组到一个名为State(态)的4×4字节矩阵中。

  在规范中,加密算法实现的一个预备的处理步骤被称为AddRoundKey(轮密钥加)。AddRoundKey用密钥调度表中的前四行对State矩阵实行一个字节一个字节的异或(XOR)操作,并用轮密钥表w[c,r]异或输入State[r,c]。

  举个例子,如果State矩阵的第一行保存的字节是{00,44,88,cc},第一列密钥调度表是{00,04,08,0c},那么新的State[0,2]值是用w[2,0](0x08或0x80)异或State[0,2](0x88)的结果:

  1 0 0 0 1 0 0 00 0 0 0 1 0 0 0 XOR1 0 0 0 0 0 0 0

  AES算法的主循环对State矩阵执行四个不同的操作,在规范中被称为SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换)和AddRoundKey。

  除了每次循环AddRoundKey都被调用并使用密钥调度表的下面四行外,AddRoundKey与预备处理步骤中的AddRoundKey相同。SubBytes例程是一个代替操作,它将State矩阵中的每个字节替换成一个由Sbox决定的新字节。比如,如果State[0,1]的值是0x40如果你想找到它的代替者,你取State[0,1]的值(0x40)并让x等于左边的数字(4)并让y等于右边的数字(0)。然后你用x和y作为索引进到Sbox表中寻找代替值。

  MixColumns是一个代替操作,它是理解AES算法时最具技巧(或者说是最需要动脑筋的部分)的部分。它用State字节列的值进行数学域加和域乘的结果代替每个字节。

  假设State[0,1]的值是0x09,并且列1上的其它值分别为0x60,0xe1和0x04,那么State[0,1]的新值计算如下:

  此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。

  SubBytes、ShiftRows、MixColumns和AddRoundKey四个操作在一个执行Nr次的循环里被调用,Nr为给定密钥大小的轮数减1。加密算法使用的轮数要么是10,12,要么是14,这依赖于种子密钥长度是128位、192位还是256位。在这个例子中,因为Nr等于12,则这四个操作被调用11次。该迭代完成后,在拷贝State矩阵到输出参数前,加密算法调用SubBytes、ShiftRows和AddRoundKey后结束。

  2.3解密

  直接利用步骤InvSubBytes,Inv Shift Rows,InvMixCloumns和Add RoundKey的逆序和倒序即可得到解密算法,在该算法中,步骤出现的顺序和步骤本身与加密都不同。

  为了便于实现,将惟一的非线性步骤(SubBytes)放在轮变换的第一步。Rijndael结构可以定义一个等价的解密算法,其中使用的步骤序列是加密的Sam只需将每个步骤更改为相反,并更改关键编排方案。这种结构一致性不同于许多密码中组件和结构的一致性采用Feistel结构,如IDEA。

  两轮Rijndael的直接解密算法依次由FinalRound的逆、Round的逆和密钥加法组成。Round的逆变换记作InvRound,FinalRound的逆记作InvFinalRound。

  为了得到等价的解密算法,可以利用了一些步骤的以下两个性质:

  nvShiftRows和InvSubBytes的次序无关紧要;如果调整相应的轮密钥,AddRoundKey和InvMixColumns的次序可以颠倒。

  对第一个性质可做如下解释:InvShftRows只对字节进行换位,而不影响字节的值。InvSubBytea作用在单字节上,而与这些字节的位置无关。因此,这两步可以交换。

  对第二个性质的解释有些巧妙。对于任意的线性变换A:x→y=A(x),有定义:

  第三章AES算法优化设计与实现

  3.1关于S盒的优化

  S盒作为许多分组密码的唯一非线性模块,决定了整个加密算法的安全性强度,所以关于S盒的优化是很必要的。

  针对AES算法S盒的短周期现象,在满足AES仿射变换的前提下,让GF(28)空间中的所有元只属于一个迭代循环,并使其遍历所有值或是尽可能多的值,则得到优化方案如下:

  (1)不变

  (2),其中,

  (3)将字节看作GF(28)上的元素,映射到自己的乘法逆,其中0字节映射到自身。

  (4)将字节做GF(2)上的仿射变换,矩阵形式为:

  (5)循环迭代周期为256,属于一个迭代轨迹。

  当,时,每个元素都可以迭代,可以优化各种选择的仿射变换系数。

  3.2 AES的实现

  3.2.1软件系统概述

  本文以32位操作系统为例。程序分为两部分:字符串加密解密;文本加密解密。字符串加密部分,可以选择密钥长度:分别为128、192、256比特,并且可以设置自己的密码。然后只要在待加密的字符串窗口中输入要加密的字符串,就可以相应的进行加密解密。以密码长度选128bits,设置参数为1234实现的AES加密。

  程序界面如图所示:

  程序界面

  本程序分为两部分,一部分是字符串加密解密,另一部份是文本加密解密。

  字符串加密部分,可以选择密钥长度:分别为128、192、256比特,并且可以自己设置密码。这里以128bits密码长度,密钥设置为1234进行加密解密。

  文本加密部分能够入*.txt格式的文本,然后按128比特每组分组进行加密,再保存为*.txt.en文本,以和原来文本区分;解密时即需要导入以*.txt.en为后缀的文本,解密后保存为*.txt.en.de文本。如图所示:

  3.2.2 AES的C++实现

  本文只做加密过程,解密过程的顺序是加密的相反顺序。其中cipher是加密和解密时使用的算法。首先定义一个AES的类。建立了一种面向对象的方法,包括实现AES加密过程中各种功能的函数,使整个加密程序的结构可以看的清楚。

  AES分组长度为128 bits,Nb固定为4。根据界面密钥长度窗口keySize的选择,判断是密钥是128、192、256比特,然后设置密钥列数Nk,然后可得到Nr。

  实现了设置密钥块数,轮数,并且将设定了密码,和为密钥扩展提前做的初始化。主密钥的扩展首先将从界面输入的子密钥拷贝,并按一维数组排成4*Nk矩阵,然后取Nk列,进行移位变换,将第一位移到第四位,再进行SubWord()字节代换,最后再和上一个密钥的第1列做模二加法,得到新的子密钥块的第1列密钥,然后第2、3、4列是直接由前一列和上一子密钥模二加法得到。在每一轮的加密过程实现了将分组的待加密字符串的第一列与一个密钥字进行按位异或。

  字节代换是基于S盒的非线性转换,它用于将输入的每一个字节通过一个简单的查表操作,将其映射为别一个字节。映射方法是:把输入的字节高4位作为S盒的行值,低4位作为列值,然后取出对应行和列的元素作为输出。

  实现了行的循环移位操作,变换方法为:第0行不动,第1行循环左移一个字节,第2行循环左移2个字节,第3行循环左移3个字节。

  列混合变换是一个替代操作,将原矩阵中的每个元素都是一行和一列对应元素的乘积之和。在MixColumns变换中,乘法和加法都是定义在GF()上的。

  对给定的一个明文X,用State初始化为标准格式,并进行AddRoundKey()操作,将轮密钥与State异或。

  对前Nr-1轮中的每一轮,用S盒进行一次SubBytes代换操作;对State做一次ShiftRows行移位操作gmf对State做一次MixColumns列混淆操作;然后进行AddRoundKey操作。

  进行SubBytes,ShiftRows,AddRoundKey操作。

  将最后的State中的内容定义为密文。

  最后,通过将可视化界面的输入信息与变量和函数关联起来,并将AES类中的每个成员函数调用,将结果显示在界面上加密操作。