




免费预览已结束,剩余33页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本 科 毕 业 论 文简化高级加密标准算法的实现The Design and Implementation of a S-AES Algorithm姓 名:学 号:学院:软件学院系:软件工程专 业:软件工程年 级:指导教师: 年 月摘要1997年1月,美国国家标准和技术研究所(NIST)发布公告征集新的高级加密标准,即AES。新的加密标准将取代旧的数据加密标准(DES)和三重DES而成为一个联邦信息处理标准(FIPS)。被美国国家标准和技术研究所(NIST)认可为AES的分组密码由比利时密码学家Joan Daemen和Vincent Rijmen所设计的Rijndael选择使用比前任旧的数据加密标准(DES)更加开放及透明的处理过程。这个处理过程不仅赢得了开放密码社区的喝彩,同时也帮助增强了怀疑前任DES有后门的人对于优胜算法安全性的信心。之所以需要主要是因为DES相对较小的56位密钥容易被暴力攻击破解。除此之外,DES主要是为了硬件而设计,当在软件中实现时速度相对缓慢。然而三重DES避免了密钥长度过短的问题,但是在软件中运行时速度非常慢,不适用于有限资源的平台,并且可能受到与64位(如今相当小的)大小的分块有关的潜在安全问题的影响。AES,即Rijndael接受一个128位的明文,并且在一个128、192或者256位的密钥的控制下产生一个128位的密文。它是一个替代置换网络的设计,并且带有一个称作轮的步骤的集合,其中轮数可以为9、11或者13(取决于密钥长度)。由于每轮中都采用了不同的轮常量来消除密码行为中的对称性,和多轮数的线性及非线性变换,使得Rijndael有了很强的抗线性及差分密码分析能力。S-AES在结构及特征上与Rijndael非常相似,只是参数规模更小。本文实现了用S-AES进行加密解密的软件,能够对分组长度16位,密钥长度16位的数据进行1轮的加密解密。关键词:简化高级加密标准;Rijndael;分组密码AbstractJanuary 1997, National Institute of Standard and Technology (NIST) announced that they wished to choose a successor to DES and Triple DES to be known as AES, which would become a Federal Information Processing Standard (FIPS).Rijndeal, the block cipher which is designed by Belgian cryptographists Joan Daemen and Vincent Rijmen, and ratified as a standard by National Institute of Standards and Technology of the United States (NIST), was chosen using a process markedly more open and transparent than its predecessor, the aging Data Encryption Standard (DES). This process won plaudits from the open cryptographic community, and helped to increase confidence in the security of the winning algorithm from those who were suspicious of backdoors in the predecessor, DES.A new standard was needed primarily because DES has a relatively small 56-bit key which was becoming vulnerable to brute force attacks. In addition the DES was designed primarily for hardware and is relatively slow when implemented in software. While Triple-DES avoids the problem of a small key size, it is very slow in software, is unsuitable for limited-resource platforms, and may be affected by potential security issues connected with the (nowadays comparatively small) block size of 64 bits.AES encrypt a 128-bit plaintext with a 128-bit, 192-bit or 256-bit key. Its a Substitution-Permutation Network, SPN design. It has a process of several steps called round. The number of round could be 9, 11, or 13(according to key size).Because of different round-constants which erase the symmetry of cipher behaviors in every round, and multi-round linear and non-linear substitution, Rijndael is very strong to linear and differential cryptanalysis.S-AES is similar to Rijndael in both structure and main features except for smaller parameters. This article implement a software which encrypt and decrypt with S-AES, and is capable to deal data with 16-bit length block size, 16-bit length key, for 1-round encryption and decryption.Key words: S-AES;Rijndael;Block Cipher目录第一章 绪论11.1简介11.2替代置换网络21.3分组密码2第二章 算法基础知识42.1有限域42.2 S-盒62.3 ShiftRows变换72.4 MixColumns变换82.5加入轮密钥92.6密钥扩展92.7解密112.7.1逆 ShiftRows变换122.7.2逆S-盒122.7.3逆MixColumns变换12第三章系统总体设计133.1系统概述及功能133.1.1开发背景133.1.2总体目标133.1.3功能需求133.1.1系统结构14第四章 系统详细设计154.1系统MFC界面设计154.2输入输出方法设计154.3加密解密方法的设计164.4S-盒的设计184.5ShiftRows的设计184.6MixColumns和InvMixColumns的设计194.7加入轮密钥及扩展密钥的设计20第五章 系统测试及运行结果225.1测试数据225.2运行结果22第六章总结24致谢25参考文献26ContentChapter 1 Introduction11.1 Overview11.2 Substitution-Permutation Nerwork21.3 Block Cipher2Chapter 2 Basics of S-AES Algorithm42.1 Finite Field42.2 S-Box62.3 ShiftRows72.4 MixColumns82.5 AddRoundKey92.6 KeyExpansion92.7 Decrypt112.7.1Inverse ShiftRows122.7.2Inverse S-Box122.7.3Inverse MixColumns12Chapter 3 System Overall Design133.1 Introduction to System and the Function133.1.1Development Background133.1.2Overall Object133.1.3Functional Requirements133.1.1System Architecture14Chapter 4 System Detail Design154.1Syetem MFC UI Design154.2I/O Method Design154.3Encrypt and Decrypt Method Design164.4S-Box Design184.5ShiftRows Design184.6MixColumns and InvMixColumns Design194.7AddRoundKey and KeyExpansion Design20Chapter 5 System Testing and the Running Results225.1Test Data225.2Running Results22Chapter 6 Summarize24Acknowledgement25References26第一章 绪论第一章 绪论1.1 简介20世纪70年代中期由美国人开创的DES(数据加密标准)可以说经历了近1/4个世纪漫长而辉煌的年代,并逐渐由繁荣走向衰落。它之所以走向衰落,是由于20世纪末出现了差分密码分析及线性密码分析。美国国家标准和技术研究所(NIST)于1997年初发起并组织了在全世界广泛征集新的加密标准算法的活动,同时要求每一种候选算法应当支持128、192和256比特的密钥长度。经过3年多时间的反复较量,对首轮入选的15种不同算法进行了广泛的评估与测试,筛选出5种算法进入决赛。最终,由比利时的密码专家Joan Daemen(Proton world International 公司)及Vincent Rijmen(Leuven 大学)所提出的加密算法Rijndael 凭借其安全性(稳定的数学基础、没有算法弱点、算法抗密码分析的强度、算法输出的随机性)、大小(不能占用大量的存储空间和内存)、实现特性(灵活性、硬件和软件适应性、算法的简单性等),在最后一轮中击败了来自RSA、IBM、Counterpane System 以及一个英国/以色列/丹麦联合小组的竞争,赢得了最终的胜利,成为21世纪新的高级加密算法AES。AES(即Rijndael)本质上是一种对称分组密码体质,采用代替/置换网络,每轮由三层组成:线性混合层确保多轮之上的高度扩散,非线性层由16个S盒并置起到混淆的作用,密钥加密层将子密钥异或到中间状态。AES是一个迭代分组密码,其分组长度和密钥长度都是可变的,只是为了满足AES的要求才限定处理的分组大小为128位,而密钥长度为128位、192位或256位,相应的迭代轮数Nr为10轮、12轮、14轮(包含最后一轮没有Mix Columns的特殊轮)。AES汇聚了安全性能、效率、可实现性和灵活性等优点。最大的优点是可以给出算法的最佳差分特征的概率,并分析算法抵抗差分密码分析及线性密码分析的能力。AES对内存的需求非常低,也使它很适合用于受限制的环境中,AES的操作简单,并可抵御强大和实时的攻击。而S-AES作为AES的简化,除了远小于AES的参数规模及复杂度,以及相应变化带来的性能降低外,可以说具有AES的一切特性。借助于对S-AES的理解,能使我们更进一步的了解AES的工作原理。1.2 替代置换网络替代-置换网络(SP-网络)就是由多重S变换和P变换组合成的变换网络,即迭代密码,是成绩密码的一种,由Shannon提出。其基本操作时S变换(代替)和P变换(换位),前者称为S盒,后者称为P盒。S盒的作用是起到混乱作用,P盒的作用是起到扩散的作用。1.3 分组密码术语分组密码实际上是用来和通常的流密码(stream cipher)进行区分的。一个密码算法是一个隐藏消息的含义的过程。起初,它们是以简单的替代密码的形式,然后是流密码的形式,它们可以对消息的单独符号进行编码。在实际应用方面,它经常使用轮转机以及后来出现的移位寄存器(类似于LFSR)。这种理论试图找到一个具有很好的平衡性质的长周期生成器,而且通过一个非线性函数对输出进行过滤以创建一个密钥流。不幸的是,许多近来相关的研究使得大多数的基于LFSR的密码都不再安全。分组密码和流密码的区别在于它是在一步当中对一组符号进行编码。从明文到密文的映射对于一个给定的秘密密钥来说是固定的。也就是说使用同样的秘密密钥相同的明文将映射成相同的密文。大多数常用的分组密码大都使用64位或者128位的分组大小。意思是说它们以64位或者128位的分组来处理明文。对于更长的消息,可以通过多次调用密码来进行编码,通常是使用一种链接模式(chaining mode),例如CTR以保证消息的保密性。由于映射大小的缘故,分组密码可以实现成一个很大的查找表。早期的分组密码包括IBM设计小组锁设计的(DES和Lucifer)以及在20世纪80年代和90年代早期的那些过多的设计。在AES于1997年开始之后,这种提交给大会的设计方案彻底消亡了。早期的分组密码系列是对64位的分组进行编码的而且密钥也很短,仅在64位左右。一些设计例如IDEA和Blowfish打破了这种模型并使用了更大的密钥。大多数密码的基本设计都是比较一致的:找到一种非线性函数并且使用它对明文进行多次的迭代,这使得在没有密钥的情况下从密文映射回明文是很困难的。作为对比,DES有16轮同样的函数,IDEA有8轮,RC5起初有12轮,Blowfish有16轮,AES有10轮(现在一直认为RC5仅在16轮或者更多轮的时候才是安全的。虽然通常应该默认使用AES,但在代码空间可能是一个问题的地方也可以使用RC5)。通过使用一个算法来执行这种映射,分组密码可以非常简洁、高效并且几乎在任何地方都可以使用。从技术上讲,分组密码就是密码学家所谓的伪随机置换(Pseudo Random Permutation, PRP)。也就是说如果你能让每种可能的输入都通过这个密码算法,那么你将会得到实际上是输入的一种随机置换的输出(这是分组密码作为一个双射的结果)。秘密密钥控制了置换的顺序,而且不同的密钥应该选择看起来是随机的置换。尽管一个分组密码的行为非常类似于一个随机置换,但是它不应该用在自己身上。因为对于一个给定的密钥,其映射是静态的,即同样的明文分组将映射成相同的密文分组。这意味着,一个用于已加密的数据的分组密码在某些环境下可以直接泄露出相当多的数据。不严格的说,从安全性的角度来看,一个“好的”分组密码是一个在知道了其置换(或者部分置换)的情况下,除了穷举搜索之外不能得到密钥的算法;即一个攻击者,虽然他收集了关于置换顺序的信息,但是他不可能找到一个比尝试所有可能的密钥更快的找出密钥的方法。目前,人们相信AES所支持的3种密钥大小都具有这种性质。13第二章 算法基础知识第二章 算法基础知识122.1 有限域S-AES的密钥扩展及加密算法都依赖于一个依赖于包含16个元素的有限域的S-盒。由集合0,1组成的有限域GF(2)中所有的运算都要模2。我们用GF(2)x来表示GF(2)中带着系数的多项式。定义有限域GF(16)= GF(2)x/(x4 + x + 1);GF(2)中有系数的多项式模x4 + x + 1。有限域GF(16)是容易被认为是由16个级数低于4的多项式组成且所有运算都要模x4 + x + 1。即x4 + x + 1 = 0或者x4 = x + 1(因为系数要模2,即-1 = 1,故加减运算结果相同,所以两个相等的表达式相加的结果是消去)。同时也要注意到x5 = x2 + x和x6 = x3 + x2。所以在GF(16)中,我们有(x3 + x2 + x)( x3)= x6 + x5 + x3= (x3 + x2) + ( x2 + x) + x3 = x。注意到x4 + x + 1不能够被因式分解成2个GF(2)x中的多项式,所以我们说x4 + x + 1对于GF(2)x是不可约分的。这个不可约性使得GF(16)= GF(2)x/(x4 + x + 1)成为一个跟GF(p)=Z/(p)相似的域因为素数对于Z是不可约分的。既然GF(16)是一个域,我们就可以转化所有的非零元素。这与在GF(p)(整数模p)形式的有限域中转化元素非常相似,其中p是质数。因为欧几里得算法同样能够应用在多项式。在多项式的版本里,余数总是比除数的阶低。我们来看一下更加熟悉的情况,GF(229)(229是质数,所以仅仅是整数模229)的倒置并且看它是怎样在GF(16)中工作的。让我们将37转化到GF(229)。首先使用欧几里得算法找出37和229的最大公约数(是1)然后逆向的把1当做37和229的整数线性复合进而减少模229的等式。然后我们将x3+x2转化到GF(16)中;步骤本质上是相同的。229 = 6 * 37 + 737 = 5 * 7 + 27 = 3 * 2 + 11 = 7 3 * 21 = 7 - 3(37 5 * 7)1 = 16 * 7 3 * 371 = 16 * (229 6 * 37) 3 * 371 = 16 * 229 99 * 371 16 * 229 99 * 37(mod 229)1 16 * 0 + 130 * 37(mod 229)37-1 130(mod 229)x4 + x + 1 = (x + 1)(x3 + x2) + ( x2 + x + 1)x3 + x2 = (x)( x2 + x + 1) + xx2 + x + 1 = (x + 1)(x) + 11 = ( x2 + x + 1) + (x + 1)(x)1 = ( x2 + x + 1) + (x + 1)( x3 + x2) + (x)( x2 + x + 1)1 = ( x2 + x + 1)( x2 + x + 1) + (x + 1)(x3 + x2)1 = ( x2 + x + 1)( x4 + x + 1) + (x + 1)(x3 + x2) + (x + 1)(x3 + x2)1 = ( x2 + x + 1)( x4 + x + 1) + (x3 + x) (x3 + x2)1 ( x2 + x + 1)( x4 + x + 1) + (x3 + x) (x3 + x2)(mod x4 + x + 1)1 ( x2 + x + 1)(0) + (x3 + x) (x3 + x2)(mod x4 + x + 1)(x3 + x2)-1 x3 + x(mod x4 + x + 1)半位元组指4位的串(半字节)。后面将会经常将GF(16)中的元素b0x4 + b1x3 + b2x2 + b3x与半位元组b0b1b2b3建立关联。S-AES接受16位明文并产生16位密文,使用扩展密钥k0k31。加密算法由5个函数复合组成应用到明文:ARK1 MC SR NS ARK0(所以ARK0最先调用),描述如下。每个函数都对状态进行操作。A状态由表2-1中的4个半位元组组成。明文的初始状态如表2-2所示。密文的最终状态见表2-3。表2-1表2-2表2-32.2 S-盒S-AES并不是将块分割成4x4的字节数组,而是将其分割成2x2的4位的半位元组数组。这叫做状态数组。如图2-1:图2-1 S-AES状态数组S-盒是从半位元组到半位元组的非线性可逆映射。工作方式如下:首先,逆转GF(16)中的半位元组。由上面可知,x3 + x2的逆运算结果是x3 + x,所以1100转到1010。半位元组0000不可逆的,所以在这步转到它本身。然后关联半位元组N = b0b1b2b3(逆的输出)GF(2)y/(y4 + 1)中的元素N(y) = b0y4 + b1y3 + b2y2 + b3y。令GF(2)y/(y4 + 1)中a(y) = y3 + y2 + 1及b(y) = y3 + 1。S-盒的第二步是将N(y)变成a(y)N(y) + b(y)。注意到因为y4 + 1 = (y + 1)4在GF(2)中可消去,所以GF(2)y/(y4 + 1)不是域并且并不是其所有的非零元素可逆;然而多项式a(y)可以。乘法与加法运算方式与GF(16)中相似,差别仅在于模y4 + 1,所以y4 = 1。在加密的第一阶段,S-盒用来将每个半位元组转化成新的半位元组。首先我们将b0b1b2b3与多项式b0x4 + b1x3 + b2x2 + b3x关联。然后将这个多项式转化为GF(16)的元素,使用“质多项式”x4 + x + 1。然后像AES一样乘以一个矩阵并加上一个向量。图2-2 S-盒运算示意图注意图2-2所示的等式中加法和乘法运算都是模2(或者异或XOR),但不是在GF(16)中。因为计算机可以通过查表完成S-盒置换,这里给出完整的S-盒表。如图2-3。图2-3 完整的S-盒置换表图2-4 等价的完整的S盒置换矩阵置换表对于手动计算测试范例更加有用。而置换矩阵,如图2-4,从左上角开始横向移动,然后下一行继续横向移动,依此类推。数字0-15与它们的4位二进制表示法关联。所以0000 = 0转到9 = 1001,0001 = 1转到4 = 0100,0100 = 4转到13 = 1101,依此类推。2.3 ShiftRows变换下一阶段是行变换。事实上,第一行保留不变,仅变换第二行。如图2-5。图2-5 S-AES Shift Row变换2.4 MixColumns变换行变换之后,我们将列混合。每一列都乘以矩阵这些操作是在GF(16)中进行的,所以记得1代表多项式1,而4代表多项式x2。所以MixColumns同样可以写成如图2-6的形式。但是要去掉模x4 + x + 1。在多轮数(Nr 2)的时候,在最后一轮是没有列混合的,目的是简化解密过程。图2-6 S-AES Mix Column变换状态的列Ni , Nj被认为是GF(16)z/(z2 + 1)中的元素Niz + Nj。例如,对于列Ni , Nj,如果Ni , = 1010,Nj = 1001,则等价于(x3 + x)z + (x3 + 1)。依然,GF(16)z代表GF(16)中有系数的z多项式。所以GF(16)z/(z2 + 1)表示多项式模z2+1。所以z2 = 1。函数MC用多项式c(z) = x2z + 1乘以每一列。例如:(x3 + x)z + (x3 + 1)( x2z + 1) = (x5 + x3)z2 + (x3 + x + x5 + x2)z + (x3 + 1) = (x5 + x3 + x2+ x)z + (x5 + x3 + x3+ 1) = (x2+ x + x3 + x2+ x)z + (x2+ x + 1) = (x3)z + (x2+ x + 1)转到列Nk , Nl,其中Nk = 1000,Nl = 0111。注意到z2+1 = (z+1)2 在GF(16)中可消去,故GF(16)z/(z2 + 1)不是域且不是所有非零元素可逆;然而多项式c(z)可逆。映射MC同样可以被看作是状态的矩阵映射,如图2-7。图 2-7 状态矩阵映射函数的复合ARK MC SR NS被认为是第i轮。在第一轮开始之前有个额外的ARK,且当轮数大于1时最后一轮没有MC。2.5 加入轮密钥每一轮加密的最后一步就是加入轮密钥。事实上在第一轮之前也完成了这个步骤。在第一轮开始之前,扩展密钥的前两个字(W0和W1)被加入进来。在第一轮,W2 和W3被加入进来。所有的加法都是通过模2来完成,或者说是异或XOR。2.6 密钥扩展密钥扩展的进行与AES非常相似。密钥的4个半位元组被整合成2个8位的“字”,借着扩展成4个字。扩展操作产生第三及第四个字,如图2-8:图2-8 S-AES 密钥扩展图2-9 S-AES g函数图2-8中的g函数如图2-9。与AES很相似,首先旋转交换半位元组,然后将其通过S-盒变换。主要的不同之处在于轮常数是通过xj+2产生的,其中j是扩展的轮数。即第一次扩展密钥时使用轮常数x3 = 1000 作为第一个半位元组并且0000作为第二个半位元组。第二次使用x4 = 0011作为第一个半位元组,0000作为第二个。经过以上这些步骤以后,就得到了一个完整的1轮S-AES加密过程,如图2-10所示:图2-10 一轮S-AES过程示意图2.7 解密对于一般的函数(可复合且可逆的)(fg)-1 = f-1g-1。同样,如果一个函数与其自身复合,那么就是恒等映射,且是它自身的逆;这就是乘方。解密的过程就是ARK0InvNS InvSR InvMCARK1。2.7.1 逆 ShiftRows变换由于16位的分组长度实际上是2x2的数组,ShiftRows的逆变换其实就是其本身。2.7.2 逆S-盒要完成InvNS,在GF(2)/(y4 + 1)将半位元组乘以a(y)-1 = y2 + y + 1再加上a(y)-1b(y) = y3 + y2。这可以用放射矩阵映射描述。如图2-11。图 2-11 InvNS的放射矩阵映射描述同样也可以简单的使用逆S-盒置换表进行简单的查表操作而避免相对复杂的GF(16)中的运算。2.7.3 逆MixColumns变换因为MC是乘以c(z) = x2z + 1,所以函数MC-1就是在GF(16)z/(z2 + 1)乘以c(z)-1 = xz + (x3 + 1)。映射MC-1同样可以被认为是状态的矩阵映射。如图2-12。图 2-12 InvMC的矩阵映射第三章 系统总体设计第三章 系统总体设计33.1 系统概述及功能3.1.1 开发背景近年来,随着计算机性能的飞速提升与互联网的迅速发展,计算机与网络开始更多更深入的融入到人们的日常生活中。与舒适便利一同到来的,还有信息安全的危机。21世纪是信息的世纪,可以说信息本身就是一种财富,由此信息的安全就更加凸显其重要性。这也就刺激了各种层出不穷的加密算法的研究与发展。AES作为NIST历时数年最终选择出来的加密标准,其安全性及其他各方面的性能毋庸置疑,已越来越多的应用到各种场合。我的课题就来源于AES的简化版本,拥有更小规模的参数但是特征基本一致的S-AES。本设计主要是基于16位分组及密钥长度的一轮S-AES。3.1.2 总体目标我要设计的是一款是用简化高级加密标准S-AES进行加密及解密的软件,可以使用指定长度的密钥对指定长度的明文进行加密从而获得指定长度的密文,以及反过来使用指定长度的加密后的密文及密钥还原出加密前的明文。系统还可以清空明文/密文,密钥两个文本框以便重新输入数据。总体目标如下:(1) 实现加密解密算法的图形化界面显示。(2) 可以输入明文密钥进行加密,并输出密文。(3) 可以输入加密后的密文及该加密密钥进行解密,并输出明文。(4) 可以清空输入框进行重新输入。(5) 简约、美观、一目了然的人性化用户界面。3.1.3 功能需求(1) 利用MFC实现加密解密算法的图形化界面显示。(2) 可以输入长度为16位的明文及16位的密钥进行加密,并输出正确的16位的密文。(3) 可以输入长度为16位的加密后的密文及该加密密钥进行解密,并输出相应的16位的明文。3.1.1 系统结构对于这样一个基于S-AES的加密解密系统来说,结构就是简单的输入处理输出。系统处理流程如图3-1所示。图3-1 系统流程图29第四章 系统详细设计第四章 系统详细设计1.2.3.4.44.1 系统MFC界面设计本设计采用的模版是基于对话框的MFC应用程序。利用Edit Control控件进行明文/密文、密钥的输入以及算法运行结果的输出,Static Text用以显示相关的提示信息,Button点击触发事件以及Picture Control用来添加背景图片。界面效果图如图4-1。图4-1 界面效果图4.2 输入输出方法设计void CSAESDlg:showdata() /输出方法CWnd* p1 = this-GetDlgItem(IDC_EDIT_Input);CWnd* p2 = this-GetDlgItem(IDC_EDIT_Key);CWnd* p3 = this-GetDlgItem(IDC_EDIT_Output);Input.Format(L%s,Input);p1-SetWindowTextW(Input);Key.Format(L%s,Key);p2-SetWindowTextW(Key);Output.Format(L%s,Output);p3-SetWindowTextW(Output);通过实例化成CWnd类型使用窗口句柄传递将要输出的参数,然后通过变量的格式化Format进行赋值。void CSAESDlg:edited() /读入方法CWnd* p1 = this-GetDlgItem(IDC_EDIT_Input);CWnd* p2 = this-GetDlgItem(IDC_EDIT_Key);p1-GetWindowTextW(Input);p2-GetWindowTextW(Key);读入的方法与输出的基本相同,差别仅在于SetWindowTextW与GetWindowTextW的不同。void CSAESDlg:OnBnClickedReset() /重置明文/密文及密钥输入框的数据,重新输入Input.Format(L);Key.Format(L);Output.Format(L);showdata();调用showdata()方法,将3个编辑框都输出空值以重置。4.3 加密解密方法的设计void CSAESDlg:OnBnClickedEncrypt() /点击加密按钮后通过输入框的数据进行加密char c5;word4 rk222;CString d;edited();a00=(unsigned char)Input0-48;a01=(unsigned char)Input1-48;a10=(unsigned char)Input2-48;a11=(unsigned char)Input3-48;sk00=(unsigned char)Key0-48;sk01=(unsigned char)Key1-48;sk10=(unsigned char)Key2-48;sk11=(unsigned char)Key3-48;KeyExpansion(sk,rk);Encrypt(a,rk);for(int i=0;i2;i+)for(int j=0;j2;j+)aij+=48;c0=(char)a00;c1=(char)a01;c2=(char)a10;c3=(char)a11;c4=0;d=CString(char*)c);Output.Format(L%s,d);showdata();点击“加密”按钮后触发加密方法进行加密。将传递进来的参数ascii码值减去48从而获得09范围的数进行下一步的加密操作。由于数组a是自定义的unsigned char类型,与输入和输出的CString类型不相同,所以借用CString d 与char c进行转换。加密后的密文09加上48以对应ascii码表中的数字09从而正确输出结果。其中c4=0;添加0是为了避免冗余的数据在加密过程中产生乱码进而对整体算法的效果产生不良影响。void CSAESDlg:OnBnClickedDecrypt()/点击解密按钮后通过输入框的数据进行解密char c5;word4 rk222;CString d;edited();此部分代码同加密部分KeyExpansion(sk,rk);Decrypt(a,rk);此部分代码同加密部分Output.Format(L%s,d);showdata();解密方法与加密方法可以说是完全相同的,除了调用的是加密或者解密方法Encrypt(a,rk) 和Decrypt(a,rk)。4.4 S-盒的设计word4 S16 = /S-盒置换表9 ,4 ,10 ,11,13 ,1 ,8 ,5 ,6 ,2 ,0 ,3 ,12 ,14 ,15 ,7 ;word4 Si16 = /逆S-盒置换表10 ,5 ,9 ,11 ,1 ,7 ,8 ,15 ,6 ,0 ,2 ,3 ,12 ,4 ,13 ,14 ;/S-盒,通过查表S,Si的改变即可进而完成正向及逆向的S-盒变换void SubBytes(word4 a22,word4 box16)int i,j;for (i = 0;i 2;i+)for (j = 0;j 2;j+)aij = boxaij;通过查表进行一次简单的替换即完成了S-盒变换。S-盒置换表及其逆S-盒置换表的推导过程见2.2节。4.5 ShiftRows的设计void ShiftRows(word4 a22) /行交换word4 tmp;tmp = a10;a10 = a11;a11 = tmp;由于状态数组是2x2的大小,而且在ShiftRows变换中第一行不发生变化,所以用一个简单的换位操作就可以了。同时由于参数规模的特性,其逆变换也是其本身。4.6 MixColumns和InvMixColumns的设计 /GF(16)乘积表用以模拟GF(16)中的多项式乘法,行列数分别代表两个乘数word4 Mul1616 = 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,省略部分0 ,14,15,1 ,13,3 ,2 ,12,9 ,7 ,6 ,8 ,4 ,10,11,5 ,0 ,15,13,2 ,9 ,6 ,4 ,11,1 ,14,12,3 ,8 ,7 ,5 ,10;由于16位分组长度,16位密钥的参数规模比较小,所以我采用了一种与AES不同的方法进行GF(2n)中的乘法运算。这里是手动计算出的GF(16)乘积表,行列数分别代表两个乘数,然后需要计算时之需要传入相当于一个数组元素的下标进行一次查表操作就可以得到结果。而AES则是利用域的生成元的指数的关系,通过该生成元的对数表及反对数表两次操作查得运算结果。固然在GF(256)中性能的表现优良,但是在GF(16)中这样小规模的参数时就是我的方法比较好了,简化了操作且提高了性能,而且更容易理解。word4 mul(word4 a,word4 b)if (a & b)return Mulab;else return 0;通过查表返回GF(16)中乘法运算结果。void MixColumns(word4 a22)/列混合word4 b22;int i,j;for (j = 0;j 2;j+)for (i = 0;i 2;i+)bij = aij mul(4,a(i+1)%2j);for (i = 0;i 2;i+)for (j = 0;j 2;j+)aij = bij;进行MixColumns变换,其中使用了(i+1)%2来进行2x2矩阵中需要交叉进行的操作。void InvMixColumns(word4 a22)word4 b22;int i,j;for (j = 0;j 2;j+)for (i = 0;i 2;i+)bij = mul(9,aij) mul(2,a(i+1)%2j);for (i = 0;i 2;i+)for (j = 0;j 2;j+)aij = bij;MixColumns的逆变换,乘以MixColumns变换矩阵的逆。4.7 加入轮密钥及扩展密钥的设计void AddRoundKey(word4 a22,word4 rk22) /加入轮密钥int i,j;for(i = 0;i 2;i+)for(j = 0;j 2;j+)aij = rkij;将密钥与状态数组进行位异或从而得到一次线性变换。/扩展密钥以获得轮结束后的轮密钥int KeyExpansion(word4 k22,word4 W222) word4 tk22;word4 RC2 = 8,0;int i,j;for(j = 0;j 2;j+)for(i = 0;i 2;i+)tkij = kij;for(j = 0;j 2;j+)for(i = 0;i 2;i+)W0ij = tkij;for(j = 0;j 2;j+)tk0j = RCj;for(j = 0;j 2;j+)tk0j = Stk1(j+1)%2;for(j = 0;j 2;j+)tk1j = tk0j;for(i = 0;i 2;i+)for(j = 0;j 2;j+)W1ij = tkij;return 0;对密钥进行密钥扩展以获得完整的一轮S-AES所需要的两组密钥。第五章 系统测试及运行结果第五章 系统测试及运行结果55.1 测试数据这里提供一组测试数据及其推导过程。首先将明文的每个字符的ascii码值减去48将其限定在09的范围内。明文a22 = 1,2,3,4,密钥sk22 = 5,6,7,8。转为二进制即a22 = 0001,0010,0011,0100,sk22 = 0101,0110,0111,1000。首先执行KeyExpansion以获得轮结束后需要的轮密钥。sk0j = RCj,其中RC = 8,0,即1000,0000。即得sk = 1101,0110,0111,1000。接下来执行sk0j = Ssk1(j+1)%2以获得“字” W2,然后sk1j = sk0j以得到W3,即得sk22 = 1011,0011,1100,1011。然后执行轮开始
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智力开发行业研究报告及未来行业发展趋势预测
- 2025年钣金加工行业研究报告及未来行业发展趋势预测
- 2025年航空食品研发与生产一体化服务合同
- 1《迷娘》公开课一等奖创新教学设计(表格式)统编版高中语文选择性必修中册
- 责任保证担保个人借款合同书7篇
- DB61T 805-2014 玉米 咸科858规范
- 部队文职考试题库及答案
- (人教版部编版)初中历史九年级上册 第一单元测试及答案01
- 家乐福商品合同(标准版)
- 水库淤泥清理与处理方案
- 中山酒店行业状况分析
- 液压车间生产管理制度
- 植保无人机应急处置预案
- 湖北十堰生产实习报告
- 营销体系之业绩如何做增量10大方法
- 《中国古代的服饰》课件
- (部编版)小学道德与法治《学习伴我成长》完整版课件
- 新人教版高中数学选择性必修第一册全套精品课件
- 小学语文综合实践活动方案10篇
- 捷豹XF汽车说明书
- 应急车辆维护与保养方案
评论
0/150
提交评论