




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
密码学课程设计实验报告实验题目:文件加密/解密系统实验任务书课程设计题目文件加密/解密系统人数1学时2周设计目的、任务和要求设计目的:本课程设计力求为学生提供一个理论联系实际的机会。通过实践,建立密码学理论的整体思想,锻炼编写、调试程序的能力,学习文档编写规范,培养独立学习、吸取他人经验、探索前沿知识的习惯,树立团队协作精神。同时,课程设计可以充分弥补课堂教学及普通实验中知识深度与广度有限的缺陷,更好地帮助学生从全局角度把握课程体系。设计任务:(1)在深入理解DES或AES加密/解密算法理论的基础上,设计一个DES或AES加密/解密软件系统;(2)加/解密过程可用分组密码运行模式中的任一种模式;(3)完成一个明文分组的加解密,明文和密钥可以是二进制,十六进制或者ASCII码。进行加密后,能够进行正确的解密;(4)提供良好的用户界面;(5)要求提供所设计系统的报告及完整的软件。设计的方法和步骤第一步:进行系统设计;第二步:代码编码;第三步:对实现部分的软件功能或者模块进行测试 第四步:提交完整可执行软件,准备答辩;第五步:答辩,演示软件,教师根据实际情况提出测试用例,学生作最后的修改和完善,教师对软件运行部分进行评分;第六步:完成课程设计报告并提交。设计工作计划1. 本次课程设计的时间是2周,工作计划如下:2. 任务书下达,理解选题,明确软件功能,分析和设计:2天;3. 分析和设计报告的撰写:1天4. 实现部分设计及文档编写;1天;5. 编码及调试:4天;6. 报告完善及打印:1天;7. 成果提交和验收:1天。主要参考资料1、 陈鲁生、沈世镒现代密码学(2) 北京:科学出版社,2008年2、 Michael Welschenbach编著,赵振江,连国卿等译,编码密码学加密方法的C与C+实现,电子工业出版社,2003年6月;3、 /教研室签字: 年 月 日学院签字: 年 月 日第一章、AES加密解密原理由于DES已经无法满足高保密性的要求,美国于1997年1月开始征集新一代数据加密标准(即高级数据加密标准,Advanced Encryption Standard,AES)。2000年10月2日,正式宣布选择比利时密码学家所开发的Rijndael算法成为AES的最终算法。AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入 数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。1.1AES算法设计及性能研究现状:目前在理论上对于AES算法的研究主要集中在算法设计和性能分析上。1.1.1算法设计主要研究算法设计遵循的原则和整体结构。研究算法设计的目的一方面为性能分析提供了一条途径,从算法的结构上分析算法性能是简单有效的,研究算法整体结构上的缺陷为提出新的密码分析方法提供新的手段。另一方面,研究AES的算法设计对研发新的分组密码提供了设计原则和参考。目前分组数据加密算法的整体结构有两大类:Festiel网络、非平衡网络和SP网络。作为AES选择的Rijndael算法遵循分组密码的安全性和实现性原则,在整体结构上采用的是SP网络结构。1.1.2 性能分析主要研究算法的各项特性,主要可以分为实现分析和密码分析两类。(1)实现分析主要研究AES算法可实现的能力,即算法的实现性分析。当前实现性分析主要集中在AES的硬、软件实现的难易度和实现算法的效率等领域中。(2)密码分析主要研究AES算法抵抗现有己知密码攻击的能力,即算法的安全性分析。除此之外,由于S-盒是AES算法的唯一非线性变换器件,S-盒的性能在很大程度上决定了AES算法的安全性。因此,出现了许多分析和研究S-盒代数性质的研究成果。在这些成果中分析了S-盒的代数特征或是表达S-盒的线性方程组,以达到求解S-盒或是研究S-盒安全性的目的。1.2AES算法基础:1.2.1AES算法的数学基础定义一 一个由b7b6b5b4b3b2b1b0组成的字节b可表示成系数为0,1的二进制多项式b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x1+b0x0定义二 在GF(28)上加法的定义为二进制多项式的加法,且其系数模2。定义三 在GF(28)上乘法(用符号表示)定义为二进制多项式的乘积模一个次数为8的不可约多项式.此不可约多项式为(十六进制为11B)m(x) = x8+x4+x3+x+1上面定义的乘法在GF(28)上满足结合律,且有一个本原元(01)。例如:(57)16(83)16 = (x6+x4+x2+x+1)( x7+x+1) =x13+x11+x9+x8+x7+x7+x5+x3+x2+x+x6+x4+x2+x+1 = (x13+x11+x9+x8 +x6+x5+ x4+x3 +x+1) mod (x8+x4+x3+x+1) = x7+x6+1 = (C1) 16定义四 在GF(28)上的二进制多项式b(x)的乘法逆为满足下面方程式的二进制多项式a(x),记为b-1(x).a(x)b(x) mod m(x) = 1.b-1(x) = a(x) mod m(x).00除外,00的逆元还是00。定义五 GF(28)上的多项式加法定义为相应项系数相加。因为在域GF(28)上的加是简单的按位异或,所以在域GF(28)上的两向量的加也就是简单的按位异或.定义六 GF(28)上的多项式a(x) = a3x3+a2x2+a1x1+a0x0 和b(x) = b3x3+b2x2+b1x1+b0x0 相乘模x4 + 1 的积(表示为c(x) = a(x)b(x)为c(x) = c3x3+c2x2+c1x1+c0x0,其系数由下面4个式子得到:c0 = a0b0a3 b1a2 b2a1 b3 ,c1 = a1b0a0 b1a3 b2a2 b3 ,c2 = a2b0a1 b1a0 b2a3 b3 ,c3 = a3b0a2 b1a1 b2a0 b3 ,利用定义六,有xb(x) = b2x3+b1x2+b0x1+b3。如果再与x相乘后模x4+1,得b1x3+b0x2+b3x1+b2,由此可得:多项式每乘上一次x的运算结果,相当于多项式系数的一次左移操作。1.2.2 密码算法的设计准则关于实用密码的两个一般的设计原则是Shannon提出混乱原则和扩散原则:混乱原则:人们所设计的密码应使得密钥和明文以及密文之间的信赖关系相当复杂以至于这种信赖性对密码分析者来说是无法利用的。扩散原则:人们所设计密码应使得密钥的每一位数字影响密文的多位数字以防止对密钥进行逐段破译,而且明文的每一位数字也影响密文的多位数字以便隐蔽明文数字的统计特性。Rjindael算法的设计原则:Joan Daemen和Vincent Rijmen在设计Rijndael算法时主要考虑了以下三点:1.要能抵抗现在所有的已知密码攻击;2.在各种平台上都应具有良好的性能;3.设计要简单。从以上三点可看出Rijndael算法在设计时遵循了安全性原则和易实现性原则。算法整体结构的精心设计确保了算法的安全性、简单性和对称性,确保了算法的易实现性。为使密码算法能抵抗对密钥的强力攻击,必须保证密钥长度尽可能大。密钥长度要求至少128bist。另外为阻止对分组密码进行统计分析,分组长度必须足够大,使得对密文进行频率统计分析计算上不可行。1.2.3 AES算法的整体结构Rjindael采用的是代替/置换网络,即SP结构。每一轮有三层组成:P层为线性层,它包括ShiftRows变换(行移变换)和MixColumns变换(列混合变换),线性混合层确保多轮之上的高度扩散;S层为非线性层,由一个SubBytes变换组成,具体由非线性S-盒构成,起到混淆作用;密钥加层由AddRuondKey变换组成,将子密钥简单异或到中间状态上,实现密钥与明、密文的结合。(1) S层设计AES 定义了一个 S 盒,State 中每个字节按如下方式映射为一个新的字节:把该字节的高 4 位作为行值,低4 位作为列值,然后取出 S 盒中对应行和列的元素作为输出。S 盒是一个由 1616 字节组成的矩阵,包含了 8 位值所能表达的256种可能的变换。S盒按以下方式构造: 逐行按升序排列的字节值初始化 S 盒。第一行是 00,01,02,0F ;第二行是 10,11, 1F 等。在行 x 和列 y 的字节值是 xy。把 S 盒中的每个字节映射为它在有限域GF(28)中的逆。GF 代表伽罗瓦域,GF(28)由一组从000 到0ff的 256个值组成,加上加法和乘法。GF(28)=Z2X/( x8+x4+x3+x+1)。00 被映射为它自身 00。把 S 盒中的每个字节记成(b7,b6,b5,b4,b3, b2,b1,b0)。对 S 盒中每个字节的每位做如下矩阵方式所描述变换:1.2.4 P层设计P层也称为线性层,包括 ShiftRows和MixColumns变换,其目的是提供雪崩效应,从而起到扩散作用。MixColumns变换将状态阵列中的一个字节扩散到该字节所在列的每个字节中,ShiftRows变换则将原来处在同一列上的字节扩散到不同的列中。Rjindael算法P层的设计起到了很好的扩散作用,提高了抵抗差分密码攻击能力,这种设计同时也可有效抗击截短差分攻击和Square攻击。1.2.5 密钥加层设计轮函数实现的功能是把轮密钥加到状态中去。它执行了16个并行的把密钥加到状态中的运算。加法是通过异或运算来完成的:13AES部分算法优化目前提升轮变换执行效率的方法主要是利用查表和简单的移位异或操作来简化原有算法中的一些复杂运算,如矩阵运算和乘法运算。最为典型的就是在进行轮变换之前将用于字节替换变换的S-盒计算出来并存储到一个二维数组中,当在进行字节替换变换时直接从这个数组中查找到相应的字节数据来替换原来状态矩阵中的字节数据。这就将字节替换原来算法中的乘法求逆和仿射运算转变为一个简单的查表操作。虽然这要求在轮变换前要花费一定的时间和存储空间来计算和存储S-盒,但与原算法相比起来,优化后的算法实现变得相对简单,其执行的效率也大大提高。在轮变换的过程中,行移位变换只改变字节数据在状态矩阵中的位置,并不改变字节数据的值;而字节替换变换只根据S-盒对字节数据进行一一对应的替换,与字节数据所在的位置无关。所以,这两个变换层的顺序可以调换,且对于加密算法并没有什么影响。这两层顺序调换之后,可以方便的将字节替换变换和列混合变换并作一步,通过查表的方法来代替原来算法中的矩阵乘法的操作,得到变换后的结果。在这种优化的方法中,将以列为单位进行变换。第二章、AES算法描述:2.1 状态、密钥、算法轮数Rjindael算法是一个数据块长度和密钥长度都可变的迭代分组加密算法,数据块长度和密钥长度可以为128、192、256位。在加密前对数据块做预处理。首先,把数据块写成字的形式,每个字包含4个字节。其次,把字记为列的形式(如下图):AES把128位的输入看作是一个由16个字节组成的向量,并用一个44的列矩阵的形式来组织,叫做“状态”(state)。按同样的方式组织密钥,得到一个k矩阵:我们用Nb表示一个数据块中字的个数(列的个数),那么Nb=4,6或8;用Nk表示密钥中字的个数(列的个数),那么Nb=4,6或8。算法轮数Nr由Nb和Nk共同决定:NrNb = 4Nb = 6Nb = 8Nk = 4101214Nk = 6121214Nk = 81414142.2 非线性混合层的S变换字节代换(ByteSub)是作用在字节上的一种非线性变换,这个变换(或称S-box)是可逆的。它由以下两个部分组成:a 把字节的值用它的乘法逆代替;b 把经过a处理后的字节进行如下定义的仿射变换乘法取逆运算为: b(x)=a(x) mod m(x) (定义四)其中m(x) = x8+x4+x3+x+1,当a(x) = 0时,其逆元素也为0。下面是进行逆仿射运算的仿射变换矩阵:其中bi是bi在GF(28)上的乘法逆。2.3 P层的行移位和列混合描述行移位根据不同的分组长度做相应的循环移位运算,加密算法的行移位过程如图所示:在加密过程中,状态矩阵中的后三行要按字节进行左移位。在解密过程中,则要进行逆行移位,即将状态矩阵中的后三行按字节进行右移位。下表给出了在不同的情况下移位的次数。即在后三行的第1行要移位C1字节,第2行要移位C2字节,第3行要移位C3字节。NbC1C2C3412361238134行移位后所得的状态矩阵还要进行列混合,加密算法的列混合过程如图所示。在列混合变换时,把状态矩阵的一列看作在GF(2)上的多项式,与一个常数多项式c (x)相乘并模X4+l后得到的结果。其中:利用列混合可以使第一列的第一个字节与该列中的其他任一字节相互作用,而行移位则可以使第一轮中的其他字节互相混合,由此经过多轮运算可以达到相当强的扩散作用。2.4 密钥加层描述密钥加是负责把轮密钥加入到状态中去,简单地使用异或运算即可得到。轮密钥可以通过密钥调度得到。2.5 密钥调度密钥调度包括密钥编制和密钥选择两部分。并且遵循一下原则:2.5.1 轮密钥的比特总数为数据块长度与轮数加1的积:Nk*4*8*(Nr+1);2.5.2 种子密钥编制为扩展密钥,种子密钥长度为4* Nk个字节;2.5.3 轮密钥由以下方法从扩展密钥中获得:对第1轮密钥由前Nb个字构成;第2轮密钥由第二个Nb个字即第Nb+1个字到第2Nb个字构成,以下依次类推。AES算法利用外部输入密钥K(密钥串的字数为Nk) ,通过密钥扩展程序得到共4 (Nr + 1) 字的扩展密钥w4 *(Nr + 1) 。涉及如下三个模块:(1)位置变换RotWord (),把一个四个字节的序列a0,a1,a2,a3 左移一个字节变为 a1,a2,a3,a0。(2) SubWord ( ),对一个四字节的输入字a0,a1,a2,a3的每一个字节进行S盒变换,然后作为输出。(3) 变换 Rcon ,对轮常数的定义为: Rconi=(Rci,00,00,00);而Rci表示在有限域GF(28)中xi-1的值,即:Rcl=1(即01);Rci=x(Rci-1)= xi-1 (即02(Rci-l)。/*用于密钥调度的Rcon表*/static const unsigned char rcon 10 = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0X36(4)扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥 K;以后的字w i 等于它前一个字wi-1与前第Nk个字wi-Nk的异或 ,即w i = wi-1 XOR wi-Nk。但是若i 为Nk 的倍数 , 则wi = wi-Nk XOR SubWord(RotWord (wi-1)XOR Rcon i/Nk。2.6 加密算法AES加密算法由初始轮密钥加层和Nr轮的轮变换组成它的输入为初始状态阵列和轮密钥,执行加密算法后产生一个输出状态阵列,输入明文和输出密文均为128比特2.7 解密算法解密算法的结构与加密算法的结构相同,其中的变换为加密算法变换的逆变换,且使用了一个稍有改变的密钥编制。第三章、AES算法的实现:3.1 AES算法的流程图S盒置换明文分组数据X与原始密钥K1异或(XK1)行变换列混淆与子密钥Ki异或(XKi)S盒置换行变换与子密钥Kr+1异或(XKi+1)加密分组数据加密分组数据与子密钥Kr+1异或(XKi+1)与子密钥Ki异或(XKi)反行变换反S盒置换反行变换反列混淆反列混淆与原始密钥K1异或(XK1)解密分组数据XAES加解密算法流程图void aes:jiemi(unsigned char ming44,unsigned char me44)input(me);int i=Nr;AddRoundKey(i);for(i=Nr-1;i=1;i-)InvShiftRows();InvSubBytes();AddRoundKey(i);InvMixColumns();InvShiftRows();InvSubBytes();AddRoundKey(i);output(ming);3.2 程序中各变换表的说明3.2.1 S-盒和逆S-盒变换表将用于字节替换变换的S-盒计算出来并存储到一个二维数组中,当在进行字节替换变换时直接从这个数组中查找到相应的字节数据来替换原来状态矩阵中的字节数据。同理可将逆S-盒也计算出来存储在数组里。用于加密的S-盒的定义如下:用于解密的逆S-盒的定义如下:3.3 密钥扩展模块的实现void aes:KeyExpansion(unsigned char keyNk_max) unsigned char t4;int i=0,j=0;for( i=0;i4;i+)for( j=0;jNk;j+)Keyij=keyij;i=0;j=0;while(iNk)KeyExp0i=Key0i;KeyExp1i=Key1i;KeyExp2i=Key2i;KeyExp3i=Key3i;i+;while(iNb*(Nr+1)int row=0;t0=KeyExp0i-1;t1=KeyExp1i-1;t2=KeyExp2i-1;t3=KeyExp3i-1;if(i%Nk=0)RotWord(t);for(row=0;row6 & i%Nk=4)for(row=0;row4;row+)trow=SboxHIGH4(trow)LOW4(trow);for(row=0;row4;row+)KeyExprowi=KeyExprowi-Nktrow;i+;5.3 加密模块的实现void aes:jiami(unsigned char ming44,unsigned char me44)input(ming);int i=0;AddRoundKey(i);for(i=1;i0 ; -i) InvRound(i); AddRoundKey(0); InitialplainText();六、算法测试及分析:6.1 正确性测试本程序采用动态加密,要求输入加密明文(16位)和加密密钥(16位)后即可得到加密后的密文。程序启动界面如图:6.1.1字符串加解密测试输入1后,输入16位的待加密明文,然后再输入不超过16位的加密密钥,按下回车,即可得到加密结果如下:解密后的结果如图所示:关于对话框:帮助对话框:七总结 通过本次课程设计,对AES加密解密算法有了更深的主任认识,同时也提高了自己的动手能力,对MFC编程有了一定的了解,在做课程设计的过程中也遇到了一些问题,在老师的帮助下得到了解决,很欣慰。不足之处由于初次写MFC所以界面等设计的不是很好,以后会加强这方面的学习。源代码如下:/ AES.h: interface for the AES class./#if !defined(AFX_AES_H_E7A55E4B_8EAF_4FAE_B547_3829CB5B5130_INCLUDED_)#define AFX_AES_H_E7A55E4B_8EAF_4FAE_B547_3829CB5B5130_INCLUDED_#define N_ROUND 11#define KEY_SIZE 16#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include#include#include using namespace std;class AES public: typedef unsigned char byte; /static const int KEY_SIZE;/; = 16; / 密钥长度为位/ static const int N_ROUND ;/= 11; byte plainText16; / 明文 byte state16; / 当前分组。 byte cipherKey16; / 密钥 byte roundKeyN_ROUND16; /轮密钥 byte cipherText16; /密文 byte SBox1616; / S盒 byte InvSBox1616; / 逆S盒 void EncryptionProcess() / 加密过程 InitialState(plainText); KeyExpansion(); / 密钥扩展 AddRoundKey(0); / 轮密钥加 for(int i = 1; i 0 ; -i) InvRound(i); AddRoundKey(0); InitialplainText();void Round(const int& round) / 正常轮 SubBytes(); ShiftRows(); MixColumns(); AddRoundKey(round); void InvRound(const int& round) / 正常轮的逆 AddRoundKey(round); InvMixColumns(); InvShiftRows(); InvSubBytes(); void FinalRound() / 最后轮 SubBytes(); ShiftRows(); AddRoundKey(N_ROUND - 1);void InvFinalRound() / 最后轮的逆 AddRoundKey(N_ROUND - 1); InvShiftRows(); InvSubBytes(); void KeyExpansion() / 密钥扩展 const byte rconN_ROUND4 = 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00 ; for(int ii = 0; ii 16; +ii) roundKey0ii = cipherKeyii; for(int i = 0; i 4; +i) / roundKey016为cipherKey的转置矩阵 for(int j = 0; j 4; +j) roundKey04*i + j = cipherKey4*j + i; for(int roundIndex = 1; roundIndex N_ROUND; +roundIndex) byte rotWord4 = 0x00; rotWord0 = roundKeyroundIndex - 13; rotWord1 = roundKeyroundIndex - 17; rotWord2 = roundKeyroundIndex - 111; rotWord3 = roundKeyroundIndex - 115; std:swap(rotWord0, rotWord1); std:swap(rotWord1, rotWord2); std:swap(rotWord2, rotWord3); for(int i = 0; i 4 rotWordi & 0x0f ; roundKeyroundIndex4*i = roundKeyroundIndex - 14*i rotWordi rconroundIndexi; for(int j = 1; j 4; +j) for(int i = 0; i 4; +i) roundKeyroundIndex4*i + j = roundKeyroundIndex - 14*i + j roundKeyroundIndex4*i + j - 1; void AddRoundKey(const int& round) / 轮密钥加 for(int i = 0; i 16; +i) / 利用当前分组state和第round组扩展密钥进行按位异或 statei = roundKeyroundi; void SubBytes() / 字节代换 for(int i = 0; i 4 statei & 0x0f ; void InvSubBytes() / 逆字节代换 for(int i = 0; i 4 statei & 0x0f ; void ShiftRows() / 行变换 /state第一行保持不变 / Do nothing. /state第二行循环左移一个字节 std:swap(state4, state5); std:swap(state5, state6); std:swap(state6, state7); /state第三行循环左移两个字节 std:swap(state8, state10); std:swap(state9, state11); /state第三行循环左移三个字节 std:swap(state14, state15); std:swap(state13, state14); std:swap(state12, state13); void InvShiftRows() / 行变换反演 /state第一行保持不变 / Do nothing. /state第二行循环右移一个字节 std:swap(state6, state7); std:swap(state5, state6); std:swap(state4, state5); /state第三行循环右移两个字节 std:swap(state9, state11); std:swap(state8, state10); /state第三行循环右移三个字节 std:swap(state12, state13); std:swap(state13, state14); std:swap(state14, state15); void MixColumns() / 列混淆 byte matrix44 = 0x02, 0x03, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02; const byte* temp = GFMultplyBytesMatrix(byte*)matrix, state); for(int i = 0; i 16; +i) statei = tempi; / delete temp;void InvMixColumns() / 列混淆反演 byte matrix44 = 0x0e, 0x0b, 0x0d, 0x09, 0x09, 0x0e, 0x0b, 0x0d, 0x0d, 0x09, 0x0e, 0x0b, 0x0b, 0x0d, 0x09, 0x0e ; const byte* temp = GFMultplyBytesMatrix(byte*)matrix, state); for(int i = 0; i 16; +i) statei = tempi; / delete temp;void BuildSBox() / 构建S盒 byte box1616 = /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ; for(int i = 0; i 16; +i) for(int j = 0; j 16; +j) SBoxij = boxij; void BuildInvSBox() / 构建逆S盒 byte box1616 = /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /*7*/ 0xd0, 0x2c, 0x1e,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论