




免费预览已结束,剩余15页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络安全课 程 设 计 报 告学 院:计算机与电子信息学院专业名称: 学 号:姓 名:指导教师:时 间:2015年1月DES源代码分析一、DES对称加密算法简介最著名的保密密钥或对称密钥加密算法DES(Data Encryption Standard)是由IBM公司在70年代发展起来的,并经过政府的加密标准筛选后,于1976年11月被美国政府采用,DES随后被美国国家标准局和美国国家标准协会(American National Standard Institute, ANSI) 承认。DES使用56位密钥对64位的数据块进行加密,并对64位的数据块进行16轮编码。与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。DES用软件进行解码需要用很长时间,而用硬件解码速度非常快,但幸运的是当时大多数黑客并没有足够的设备制造出这种硬件设备。在1977年,人们估计要耗资两千万美元才能建成一个专门计算机用于DES的解密,而且需要12个小时的破解才能得到结果。所以,当时DES被认为是一种十分强壮的加密方法。二、DES对称加密算法分析(1)DES算法原理在DES算法中有Data、Key、Mode三个参数。其中Data代表需要加密或解密的数据,由8字节64位组成;Key代表加密或解密的密钥,也由8字节64位组成;Mode代表加密或解密的状态。在DES算法中加密和解密的原理是一样的,只是因为Mode的状态不同,适用密钥的顺序不同而已。(2)DES算法的加密过程 DES算法的加密过程如图6.2所示。初始置换(Initial Permutation,IP)是对输入的64位数据按照规定的矩阵改变数据位的排列顺序的换位变换,此过程与密钥无关。子密钥生成是由64位外部输入密钥通过置换和移位操作生成加密和解密所需的16组(每组56位)子密钥的过程。乘积变换过程非常复杂,是加密过程的关键。该过程通过16轮重复的替代、移位、异或和置换操作打乱原输入数据。逆初始置换(IP-1)与初始置换过程相同,只是置换矩阵是初始置换的逆矩阵。 初始置换(IP)将64位明文按照初始置换表(如表6.1)的规则进行置换。其置换过程为:将输入明文的第58位置换到第1位,第50位置换到第2位,第12位置换到第3位,依此类推,最后第7位置换到第64位。 子密钥生成输入的密钥K是64位数据,但其中第8、16、24、32、40、48、56、64位用于奇偶校验,实际使用的密钥位只有56位。子密钥Ki的生成流程如图6.3所示。第1步:PC1变换。将56位密钥按置换选择1(PC-1)的规律(见表6.2)进行置换,变换后分为左右两路(C0、D0)各28位。第2步:数据左移。将两个28位的C0和D0按表6.3的规则进行循环左移。表6.3中第1行表示迭代轮次,第2行表示左移的位数。左移的规律是将C0和D0所有的位按表中规定的位数循环左移。第3步:PC2变换和子密钥生成。C0和D0左移1位后得到C1和D1 ,再将C1和D1数据组合后(56位)按照PC2变换的要求变换得到48位的子密钥K1,在进行第1轮迭代时使用K1;同理,将C1和D1左移1位得到C2和D2,再将C2和D2数据组合后按照PC2变换的要求变换得到48位的子密钥K2;依此类推,就可以得到K3、K4.K16。PC2变换如表6.4所示。PC2变换是将输入的56位数据变换为48位输出,该变换是一种压缩变换。根据不同轮数分别进行左移和压缩变换,分别得到16个48位的子密钥K1, K2, K16。 乘积变换初始置换后的数据分为各32位的两部分,左部分为L0,右部分为R0,这样,L0 = D58D50D12.D8,R0 = D57D49D41D7。乘积变换过程就是将L0和R0按照乘积变换运算公式进行迭代运算,最后得出L16和R16。如图6.4所示。第1步:E变换。E变换是一个扩展变换,其过程是将32位的数据Ri-1变换成48位,变换规则如表6.5所示。第2步:异或变换。将E变换输出的48位数据与48位的子密钥Ki进行异或运算,得到48位的S盒数据。第3步:S盒变换。将48位的S盒数据均分为8部分,每部分为6位,用8个S盒S1S8表示。每个S盒的输入为6位,变换后输出为4位,即经过8个S盒S1S8变换后输出为32位,如图6.5所示。S盒的变换规则:以S1盒为例,将6位输入数据(a1a2a3a4a5a6)的中间4位(a2a3a4a5)对应的数值作为列,两端的2位(a1a6) 对应的数值作为行,找到如表6.6所示的S1转换表中相应的位,得到的数值再转换成二进制形式的4位数据,此即为S1盒的输出。第4步:P变换。P变换的过程是将S盒输出的32位数据进行位置变换得到一个新的32数据组,因此P变换为线性变换,其变换规则如表6.14所示。第5步:异或变换。P变换输出的32位数据与32位的Li-1异或后输出32位数据,此数据就是Ri。当i15时,Ri与Li各32位数据将被用来进行下一轮迭代变换。 逆初始置换(IP-1)将第16轮迭代变换的输出R16与L16组合在一起构成64位数据组,作为逆初始置换(IP-1)的输入。逆初始置换的变换规则如表6.15所示,置换完成后的数据即为64位密文。(3) DES算法的解密过程DES的解密算法与加密算法相同,解密密钥也与加密密钥相同,区别仅在于进行16轮迭代运算时使用的子密钥顺序与加密时是相反的,即第1轮用子密钥K16、第2轮用K15、,最后一轮用子密钥K1。(4)DES算法的安全性DES是世界上使用最为广泛和流行的一种分组密码算法,被公认为世界上第一个实用的密码算法标准。DES的缺点是密钥位数太短(56位),而且算法是对称的,使得这些密钥中还存在一些弱密钥和半弱密钥,因此容易被采用穷尽密钥方法解密由于DES算法完全公开,其安全性完全依赖于对密钥的保护,必须有可靠的信道来分发密钥。三、DES对称加密算法的实现1、C语言实现DES对称加密算法过程分析(1)初始置换/根据表格改变顺序void ChangeOrder (bit *origbin, bit *newbin, int *table, int num)int i;bit temp64;for (i = 0; i num; i+)tempi = origbintablei - 1;CopyBin(temp, newbin, num);(2)子密钥生成void SetKeys(bit *origkey, bit keys48)int i;bit key6464, key4848, key5656, lkey28, rkey28;CopyBin(origkey, key64, 64);ChangeOrder (key64, key56, PC1, 56);/printf(PC1变换后的key:n); PrintBin (key56, 56, 7);for (i = 0; i 16; i+)/PrintBin (key56, 56, 14);SplitData(key56, lkey, rkey, 56);LoopMove (lkey, MOVEi);LoopMove (rkey, MOVEi);/printf(C%d:n, i); PrintBin (lkey, 28, 7);/printf(D%d:n, i); PrintBin (rkey, 28, 7);MergeData(key56, lkey, rkey, 56);/printf(C%d D%d:n, i, i); PrintBin (key56, 56, 14);ChangeOrder (key56, key48, PC2, 48);CopyBin(key48, keysi, 48);/printf(%d个密钥:n, i + 1); PrintBin (keysi, 48, 12);(3)异或运算void Xor(bit *date1, bit *data2, int num)int i;for (i = 0; i num; i+)data2i = date1i;(4)密钥左移及S盒变换void LoopMove (bit *key, int num)bit temp28;CopyBin(&keynum, temp, 28-num);CopyBin(key, &temp28-num, num);CopyBin(temp, key, 28);void SChange(bit *data48, bit *data32)int i;bit r2, c4;char er, ec;for (i = 0; i = 8; i+, j -= 8)StrToBin (&origdatai * 8, data, 64);DESBlock(keys, data, type);BinToDec(data, &newdatai * 8, 64);/不满8字节用0填充if (j)memset(data, 0, 64);StrToBin (&origdatai * 8, data, j * 8);DESBlock(keys, data, type);BinToDec(data, &newdatai * 8, 64);memset(&newdatalen % 8 = 0 ? len : (len + 8 - len % 8), 0, 1);(4)运行截图加密解密2、手工计算DES对称加密算法过程分析明文:1107300420林志祥密钥:19920324(1)初始置换(IP)原数据:丨 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 0 丨丨 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 丨丨 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 丨丨 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 丨IP置换后的数据:丨 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 丨丨 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 丨丨 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 丨丨 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 丨(2)子密钥生成1)根据PC1变换原密钥:丨 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 丨丨 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 丨丨 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 丨丨 0 0 1 1 0 1 1 1 0 0 1 1 1 0 0 0 丨PC1变换后的密钥:丨 0 0 0 0 0 0 0 0 0 0 0 0 0 0 丨丨 0 0 1 1 1 1 1 1 1 1 1 1 1 1 丨丨 0 1 1 0 0 1 1 0 0 1 1 1 1 0 丨丨 0 0 1 0 0 0 0 0 0 0 1 1 1 1 丨2)PC2变换和子密钥生成C1和D1:丨 0 0 0 0 0 0 0 丨丨 1 1 0 0 1 1 0 丨丨 0 0 0 0 0 0 0 丨丨 0 1 1 1 1 0 0 丨丨 0 1 1 1 1 1 1 丨丨 0 1 0 0 0 0 0 丨丨 1 1 1 1 1 1 0 丨丨 0 0 1 1 1 1 0 丨K1:丨 0 1 0 1 0 0 0 0 0 0 1 0 丨丨 1 1 0 0 1 0 1 0 1 1 0 0 丨丨 0 1 0 1 0 1 1 1 0 0 1 0 丨丨 1 0 1 0 1 1 0 0 0 0 1 0 丨C2和D2:丨 0 0 0 0 0 0 0 丨丨 1 0 0 1 1 0 0 丨丨 0 0 0 0 0 0 0 丨丨 1 1 1 1 0 0 0 丨丨 1 1 1 1 1 1 1 丨丨 1 0 0 0 0 0 0 丨丨 1 1 1 1 1 0 0 丨丨 0 1 1 1 1 0 1 丨K15:丨 0 0 0 1 1 0 0 1 0 0 1 0 丨丨 1 1 0 0 1 0 0 0 1 1 0 0 丨丨 1 0 1 0 0 1 0 1 0 0 0 0 丨丨 0 0 1 1 0 0 1 1 0 1 1 1 丨C16和D16:丨 0 0 0 0 0 0 0 丨丨 0 1 1 0 0 1 1 丨丨 0 0 0 0 0 0 0 丨丨 0 0 1 1 1 1 0 丨丨 0 0 1 1 1 1 1 丨丨 0 0 1 0 0 0 0 丨丨 1 1 1 1 1 1 1 丨丨 0 0 0 1 1 1 1 丨K16:丨 0 1 0 1 0 0 0 1 0 0 1 0 丨丨 1 1 0 0 1 0 0 0 1 1 0 0 丨丨 1 0 1 0 0 1 1 1 0 1 0 0 丨丨 0 0 1 1 1 1 0 0 0 0 0 0 丨(3)乘积变换1)E变换L0和R0:丨 0 0 1 1 1 1 1 0 丨丨 0 0 1 1 1 1 1 1 丨丨 1 1 1 1 0 1 0 1 丨丨 1 1 1 0 0 0 0 1 丨丨 0 0 0 1 0 1 0 0 丨丨 0 0 0 0 1 1 0 0 丨丨 1 1 0 1 0 0 0 1 丨丨 0 0 1 0 0 1 1 1 丨E变换后的右半部分数据和密钥K1:丨 1 0 0 1 1 1 1 1 1 1 1 1 丨丨 0 1 0 1 0 0 0 0 0 0 1 0 丨丨 1 1 1 1 0 0 0 0 0 0 1 0 丨丨 1 1 0 0 1 0 1 0 1 1 0 0 丨丨 1 0 0 0 0 1 0 1 1 0 0 0 丨丨 0 1 0 1 0 1 1 1 0 0 1 0 丨丨 0 0 0 1 0 0 0 0 1 1 1 0 丨丨 1 0 1 0 1 1 0 0 0 0 1 0 丨2)异或变换1及S盒变换两者进行异或运算得:丨 1 1 0 0 1 1 1 1 1 1 0 1 丨丨 0 0 1 1 1 0 1 0 1 1 1 0 丨丨 1 1 0 1 0 0 1 0 1 0 1 0 丨丨 1 0 1 1 1 1 0 0 1 1 0 0 丨S盒获得的数值:11 14 5 13 12 8 7 11 S盒变换后的右半部分数据:丨 1 0 1 1 1 1 1 0 丨丨 0 1 0 1 1 1 0 1 丨丨 1 1 0 0 1 0 0 0 丨丨 0 1 1 1 1 0 1 1 丨3)P变换P变换后的右半部分数据和左半部分的数据:丨 1 1 0 1 1 1 1 1 丨丨 0 0 1 1 1 1 1 0 丨丨 1 0 0 1 1 1 1 1 丨丨 1 1 1 1 0 1 0 1 丨丨 0 0 0 1 1 1 1 0 丨丨 0 0 0 1 0 1 0 0 丨丨 0 1 0 1 0 0 1 0 丨丨 1 1 0 1 0 0 0 1 丨4)异或变换2两者异或运算得:丨 1 1 1 0 0 0 0 1 丨丨 0 1 1 0 1 0 1 0 丨丨 0 0 0 0 1 0 1 0 丨丨 1 0 0 0 0 0 1 1 丨L1和R1:丨 0 0 1 1 1 1 1 1 丨丨 1 1 1 0 0 0 0 1 丨丨 1 1 1 0 0 0 0 1 丨丨 0 1 1 0 1 0 1 0 丨丨 0 0 0 0 1 1 0 0 丨丨 0 0 0 0 1 0 1 0 丨丨 0 0 1 0 0 1 1 1 丨丨 1 0 0 0 0 0 1 1 丨两者异或运算得:丨 1 1 0 0 1 0 0 1 丨丨 1 0 0 0 0 0 0 0 丨丨 1 0 0 1 0 1 0 1 丨丨 0 1 1 0 1 1 1 0 丨L16和R16:丨 1 1 0 1 1 1 1 1 丨丨 1 1 0 0 1 0 0 1 丨丨 1 1 1 0 1 0 1 1 丨丨 1 0 0 0 0 0 0 0 丨丨 1 0 1 0 0 1 0 0 丨丨 1 0 0 1 0 1 0 1 丨丨 1 1 1 0 0 1 0 0 丨丨 0 1 1 0 1 1 1 0 丨乘积变换后的数据:丨 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 丨丨 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 丨丨 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 丨丨 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 丨(4)初始置换逆初始置换表后的数据:丨 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 丨丨 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 丨丨 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 丨丨 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 0 丨DES对称加密算法解密算法与加密算法相同,同上可解密。三、总结DES算法是明文分组为64位,有效密钥56位,输出密文64位的,具有16轮迭代的分组对称密码算法。通过学习此算法,了解到了许多函数,其中有密钥生成函数,加密函数,解密函数,测试函数以及密钥长度检验函数等。四、源代码附:#include#include#include#include table.h#define bitbool#define MAX_SIZE1000#define ENCRYPT0#define DECODE1void StrToBin(char *str, bit *bin, int num)int i;for (i = 0; i (7 - i % 8) & 1;void DecToBin(int dec, bit *bin, int num)int i;for (i = 0; num 0; i+, num-)bini = dec (num - 1) & 1;void BinToDec(bit *bin, char *dec, int num)int count, res, i;for(count = 0; num 0; count+, num -= 8)deccount = 0;res = num 0 ; i-)deccount |= bincount * 8 + res - i (i - 1);void CopyBin(bit *origbin, bit *newbin, int num)int i;for (i = 0; i num; i+)newbini = origbini;void PrintBin (bit *bin, int num, int count)int i;for (i = 0; i num; i+)if(i % count = 0) printf(丨 );printf(%-2d, bini);if(i + 1) % count = 0) printf(丨n);printf(n);void PrintInfo (int num ,bit *ldata, bit *rdata, bit *subkey)int i, j;printf( L%d:ttt R%d:ttt K%d:n, num, num, num);for (i = 0; i 4; i+)printf (丨 );for (j = 0; j 8; j+)printf(%-2d, ldatai * 8 + j);printf(丨t丨 );for (j = 0; j 8; j+)printf(%-2d, rdatai * 8 + j);printf(丨t丨 );for (j = 0; j 12; j+)printf(%-2d, subkeyi * 12 + j);printf(丨n);printf(n);void ChangeOrder (bit *origbin, bit *newbin, int *table, int num)int i;bit temp64;for (i = 0; i num; i+)tempi = origbintablei - 1;CopyBin(temp, newbin, num);void SplitData (bit *data, bit *ldata, bit *rdata, int num)CopyBin(data, ldata, num / 2);CopyBin(&datanum / 2, rdata, num / 2);void MergeData(bit *data, bit *ldata, bit *rdata, int num)CopyBin(ldata, data, num / 2);CopyBin(rdata, &datanum / 2, num / 2);void Xor(bit *date1, bit *data2, int num)int i;for (i = 0; i num; i+)data2i = date1i;void LoopMove (bit *key, int num)bit temp28;CopyBin(&keynum, temp, 28-num);CopyBin(key, &temp28-num, num);CopyBin(temp, key, 28);void SChange(bit *data48, bit *data32)int i;bit r2, c4;char er, ec;for (i = 0; i 8; i+)int j = i * 6;CopyBin(&data48j, r, 1);CopyBin(&data48j + 5, &r1, 1);CopyBin(&data48j + 1, c, 4);BinToDec(r, &er, 2);BinToDec(c, &ec, 4);DecToBin(Sierec, &data32i * 4, 4);void SetKeys(bit *origkey, bit keys48)int i;bit key6464, key4848, key5656, lkey28, rkey28;CopyBin(origkey, key64, 64);ChangeOrder (key64, key56, PC1, 56);for (i = 0; i 16; i+)SplitData(key56, lkey, rkey, 56);LoopMove (lkey, MOVEi);LoopMove (rkey, MOVEi);MergeData(key56, lkey, rkey, 56);ChangeOrder (key56, key4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论