




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
键入公司名称密码学课程设计 目录密码学课程设计报告21.des21.1原理21.2des的实现51.3相关函数62.弱密钥的检测82.1定义82.2检测方法82.3检测弱密钥实现82.4相关函数103.三圈des的差分攻击103.1差分表构造103.2差分攻击103.3差分攻击实现113.4相关函数134.程序设计不足145.总结146.相关源码15密码学课程设计报告1. des 1.1原理1.1.1加密过程des是一个分组密码,使用长度为56比特的密钥加密长度为64比特的明文,获得长度为64比特的密文,其加密过程:(1) 给定一个明文x,通过一个固定的初始置换ip置换x的比特,获得x0,x0=ip(x)=l0r0,l0r0分别是x0的前32比特和后32比特。(2) 然后进行16轮完全相同的运算,有如下规则,其中0i17,k1, k2,k16都是密钥k的函数,长度均为48比特:其中函数f(a,j)的a是一个长度为32的比特串,第二个变量j是一个长度为48的比特串,输出的是一个长度为32的比特串,其过程:a、将f的第一个变量a根据一个固定的扩展函数e扩展成为一个长度为48的比特串b、计算,并将所得结果分成8个长度为6的比特串,记为b=b1b2b3b4b5b6b7b8c、使用8个s盒,每个si是一个固定的4x16阶矩阵,它的元素来自0到15这16个整数。给定一个长度为6的比特串,用首位两个比特作行号,用中间四个比特作为列号,则sj(bj)的取值就是sj的行号列号的整数所对应的二进制表示。记cj=sj(bj),0j9d、将长度为32的比特串c=c1c2c3c4c5c6c7c8通过一个固定的置换p置换,将所得结果p(c)记为f(a,j)。(3) 对比特串r16l16应用初始置换ip的逆置换ip-1,获得密文y,即y=ip-1(r16l16)。1.1.2子密钥生成过程密钥方案计算:每一轮都是用不同的、从初始密钥或称种子密钥k导出的48比特密钥ki。k是一个长度为64的比特串,实际上除去校验比特只有56比特有效:(1)给定一个64比特的密钥k,删掉8个校验比特并利用一个固定的置换pc-1置换k的剩下的56比特,记pc-1(k) = c0d0,这里c0d0是pc-1(k)的前28比特、后28比特。(2)对每一个i,0i17,计算: 其中lsi表示一个或两个位置的左循环移位,当i=1,2,9,4,16时,一个位置,当i=3,4,5,6,7,8,10,11,12,13,14,15时,移动两个位置。pc-2是另一个固定置换。1.1.3加密算法流程图1.1.3.1 加密算法输入64比特明文x,经过16轮变换,输出64比特密文y 1.1.3.2 f函数ri-1经过e扩展与k(i)异或,通过s盒变换后进行p置换得到32比特的输出 1.1.3.3 子密钥生成过程种子密钥通过pc-1变换后,cidi左移并经过pc-2变换得到ki 1.1.4 解密过程与加密的过程相同,区别在于加密输入明文输出密文而脱密输入密文输出明文,16个内部密钥加密的顺序和解密的顺序相反。1.2 des的实现1.2.1开发环境主机:microsoft windows xp professional 版本2002 servicepack2amd athlon(tm) 64 x2 dual core processor 4800+ 2.50ghz 1.75g的内存物理地址扩展编程工具:visual c+ 6.0 mfc1.2.2功能介绍左端“明文”编辑框:输入(加密)或输出(解密)明文左端“密文”编辑框:输入(解密)或输出(加密)明文右端“des圈数”选择框:选择为3圈或16圈des右端密钥编辑框:输入16个16进制数加密、解密、打开、保存按钮:实现所述功能1.2.3功能测试输入明文文件,加密得到乱码,解密还原为明文1.3相关函数1.void setkey(const char* key, int len);/功能:设定密钥/key:密钥/len:密钥长度2.void setsubkey(psubkey psubkey, const char key8);/功能:设置子密钥/psubkey:存放16个子密钥空间的指针/key8:密钥3.void rotatel(bool *in, int len, int loop);/ 循环左移/ in:输入兼输出/ len:长度/ loop:循环位数4.void f_func(bool in32, const bool ki48);/ f 函数/ in:输入兼输出/ ki:子密钥5.void s_func(bool out32, const bool in48);/ s盒代替/out:输出/ in:输入6.void sdes(char out8, char in8, const psubkey psubkey, bool type, bool is3des); /标准des或3圈des 加/解密/out8:加密或解密的输出/in8:加密或解密的输入/psubkey:16个子密钥/type:判断加密还是解密/is3des:是3圈加密还是16圈加密7.void transform(bool *out, bool *in, const char *table, int len);/ 各种table变换/ out:输出/in:输入/table:变换表/len:长度8.void xor(bool *ina, const bool *inb, int len);/ 异或9.void bytetobit(bool *out, const char *in, int bits);/ 字节组转换成位组10.void bittobyte(char *out, const bool *in, int bits);/ 位组转换成字节组2. 弱密钥的检测2.1定义对于一个外部密钥,若产生的16个内部密钥都相同,则称此外部密钥为弱密钥2.2检测方法检测16个内部密钥是否完全相同,若完全相同则判断为弱密钥,否则为正常密钥2.3检测弱密钥实现2.3.1开发环境略2.3.2功能介绍右侧检测弱密钥按钮,单击检测弱密钥,弹出对话框显示判断结果2.3.3功能测试输入密码为012456789abcdef,检测为非弱密钥,可用输入密码为0000000000000000,检测为弱密钥,不可用2.4相关函数bool checkkey(const char* key, int len);/检测是否为弱密钥/key:输入密钥/len:密钥长度3. 三圈des的差分攻击3.1差分表构造设(bj,bj)是一对长度为6bit的串,则对于每个(bj,bj)都可以计算出sj盒的一个输出异或。当确定(bjbj)的值时,则对于bj的64种取值,它与bj的输出异或分布在16个可能的值上,将这些值分布列成表,构成对于每个sj盒可以得到一个差分表。3.2差分攻击设3轮des加密中,r2 经e扩展后为e= e1e 2e 3e 4e 5e 6e 7e 8,第3轮子密钥为j=j1j 2j 3j4e 5j6j 7j8。l0r0和l0r0是两对明文,且选择明文使得r0=r0,对应得密文分别为l3r3和l3r3。则根据计算可得又f(r2,k3)=p(c), f(r2,k3)=p(c),其中c、c分别为s盒的两个输出,则有p(c)p(c)=(r3r3)(l0l0),故可得cc =p-1(r3l0),这是3轮des的s盒输出异或。另外由于r2= l3, r2= l3,则由扩展函数e计算得e(l3)和e(l3),也即e(r2)和e(r2)。3轮des的第三轮,已知e(r2),e(r2)和cc,则可构造testj,0j8?8:len);setsubkey(&subkey, &deskey0);/设置子密钥/psubkey:存放16个子密钥空间的指针/key8:密钥void setsubkey(psubkey psubkey, const char key8) bool k64, *kl=&k0, *kr=&k28; bytetobit(k, key, 64); transform(k, k, pc1_table, 56); for(int i=0; i16; +i) rotatel(kl, 28, loop_tablei); rotatel(kr, 28, loop_tablei); transform(*psubkey)i, k, pc2_table, 48); /标准加解密/out8:加密或解密的输出/in8:加密或解密的输入/psubkey:16个子密钥/type:判断加密还是解密/is3des:是3圈加密还是16圈加密void sdes(char out8, char in8, const psubkey psubkey, bool type, bool is3des)bool m64, tmp32, *li=&m0, *ri=&m32;int count = is3des?3:16;/判断是3圈加密还是16圈加密 bytetobit(m, in, 64); transform(m, m, ip_table, 64); if( type = encrypt )/加密 for(int i=0; i=0; -i) memcpy(tmp, li, 32); f_func(li, (*psubkey)i); xor(li, ri, 32); memcpy(ri, tmp, 32); transform(m, m, ipr_table, 64); bittobyte(out, m, 64);/f函数void f_func(bool in32, const bool ki48) bool mr48; transform(mr, in, e_table, 48); xor(mr, ki, 48); s_func(in, mr);/s变换 transform(in, in, p_table, 32);/s变换void s_func(bool out32, const bool in48) for(char i=0,j,k; i8; +i,in+=6,out+=4) j = (in01) + in5; k = (in13) + (in22) + (in33)&1;out1 = (s_boxijk2)&1;out2 = (s_boxijk1)&1;out3 = s_boxijk&1; /变换void transform(bool *out, bool *in, const char *table, int len) for(int i=0; ilen; +i) tmpi = in tablei-1 ; memcpy(out, tmp, len);/异或void xor(bool *ina, const bool *inb, int len) for(int i=0; ilen; +i) inai = inbi;/循环移位void rotatel(bool *in, int len, int loop) memcpy(tmp, in, loop); memcpy(in, in+loop, len-loop); memcpy(in+len-loop, tmp, loop);/字节转比特void bytetobit(bool *out, const char *in, int bits) for(int i=0; i3(i&7) & 1;/比特转字节void bittobyte(char *out, const bool *in, int bits) memset(out, 0, bits3); for(int i=0; i3 |= ini3; ij; +i,out+=8,in+=8)sdes(out, in, &subkey, type, is3des);return true;/检测密钥是否为弱密钥bool checkkey(const char* key, int len)setkey(key,len);char a6,b6;bittobyte(a,subkey0,48);for(int i=1;i16;i+)bittobyte(b,subkeyi,48);/若16个子密钥完全相同,则为弱密钥if ( 0 != memcmp(void*)a,(void*)b,6) )return true;elsememcpy(void*)a,(void*)b,6);return false;/初始化差分表void intsa()memset(void*)sa,-1,8*64*16*64);bool a8,b8,c8;bool sb8,sc8;int count16 = 0;int i=0;char j=0,k=0;char rowb,columnb,rowc,columnc,n;for(i=0;i8;i+)/遍历8个s盒for(j=0;j64;j+)/遍历所有可能的64个输入异或bytetobit(a,&j,8);memset(void*)count,0,16*sizeof(int);for(k=0;k64;k+)/遍历确定输入异或所有可能的输入bytetobit(b,&k,8);bytetobit(c,&k,8);xor(c,a,8);rowb = (b51) + b0;columnb = (b43) + (b32) +(b21) +b1;bytetobit(sb, &s_boxirowbcolumnb, 8);rowc = (c51) + c0;columnc = (c43) + (c32) +(c21) +c1;bytetobit(sc, &s_boxirowccolumnc, 8);xor(sb,sc,8);/sb:输出异或n = sb0 + (sb11) + (sb22) + (sb33);saijncountn+ = k;/求si盒输入为ea、eb时,输出异或为c时,所有可能的子密钥/ea、eb、c:输入/i:第i个s盒/pjm:所有可能子密钥的矩阵void test(bool *ea, bool *eb, bool *c, int i, int (*pjm)864)bool a6=0;char j,k,n,eachar,s;xor(a,ea,6);eachar = (a05) + (a14) + (a23) + (a32) + (a41) + a5;xor(a,eb,6);j = (a05) + (a14) + (a23) + (a32) + (a41) + a5;k = (c03) + (c12) + (c2 mount-1)first+;if(first = mount-1)return false;/明文密文分析完后仍未得到结果elsesecond = first+1;if(!memcmp(&mtextfirst*8+4,&mtextsecond*8+4,4)bytetobit(l0,&mtextfirst*8,32);bytetobit(l0_,&mtextsecond*8,32);bytetobit(r3,&ctextfirst*8+4,32);bytetobit(r3_,&ctextsecond*8+4,32);bytetobit(l3,&ctextfirst*8,32);bytetobit(l3_,&ctextsecond*8,32);xor(l0,l0_,32);xor(r3,r3_,32);xor(l0,r3,32);transformr(c, l0, p_table, 32);transform(ext,l3,e_table,48);transform(ext_,l3_,e_table,48);for(i=0;i8;i+)test(&exti*6,&ext_i*6,&ci*4,i,pjm);second+;return true;/判断pjm所指8个矩阵是否都存在唯一最大值/对每个矩阵,分别从前往后、从后往前寻找最大值,若最后这两个最大值的下标相等,则返回truebool umax(pjm pjm,char* presult)int i,j,k;int recordh,recordt;char maxh,maxt;for(i=0; i8; i+)recordh = 0;recordt = 63;maxh=maxt=0;for(j=0,k=63;(j=0);j+,k-)if( maxh(*pjm)ij )maxh = (*pjm)ij;recordh = j;if( maxt(*pjm)ik)maxt = (*pjm)ik;recordt = k;if(recordh != recordt)return false;elsepresulti = recordh;return true;/逆置换,对pc1_table、pc2_table等不对称的不起作用void transformr(bool *out, bool *in, const char *table, int len)for(int i=0; ilen; +i)tmp tablei-1 = ini; memcpy(out, tmp, len);/通过差分分析,得到子密钥k3后,根据k3遍历所有的密钥,以确定加密密钥/mtext、ctext:明文密文/len:长度/presult:通过差分分析,得到的k3/key:输出,计算得出的密钥bool traver(char *mtext,char *ctext,int len,char *presult,char *key)bool k56,*kl=&k0, *kr=&k28;bool m64, *li=&m0, *ri=&m32, tmp56;bool mcom64;bool keybit64;bool k348;char mchar8,cchar8;int i,j;int tra;for(i=0;i8;i+)for(j=0;j(5-j) & 1;for(i=0;i48;i+)/pc2逆置换tmp pc2_tablei-1 = k3i;memcpy(k,tmp,56);memcpy(&tmp0,&k24,4);memcpy(&tmp4,&k0 ,24);memcpy(&tmp28,&k52,4);memcpy(&tmp32,&k28,24);memcpy(k,tmp,56);for(tra=0; tra7)&1;k12 = (tra6)&1;k21 = (tra5)&1;k25 = (tra4)&1;k29 = (tra3)&1;k38
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025工程类劳动合同模板
- 2025年阆中市公开引进高层次医疗卫生人才(10人)模拟试卷及一套参考答案详解
- 2025江苏盐城市射阳县商务局等单位招聘政府购买服务人员招聘计划核销考前自测高频考点模拟试题有完整答案详解
- 2025年四川绵阳市经开区考核招聘卫生专业技术人员9人模拟试卷(含答案详解)
- 骨干人员考试题库及答案
- 欧姆龙plc考试题库及答案
- 李宁羽毛球考试题库及答案
- 安徽地理学考试卷及答案
- 会计分录考试试题及答案
- 大名初一月考试卷及答案
- 成人床旁心电监护护理规程
- 食用菌种植项目可行性研究报告立项申请报告范文
- 2025版技术服务合同协议
- 焦炉机械伤害事故及其预防
- GB 5768.1-2025道路交通标志和标线第1部分:总则
- 江西红色文化考试试题及答案
- 苏州市施工图无障碍设计专篇参考样式(试行)2025
- 哮喘的诊疗和规范化治疗
- 2025年中国文创产品行业市场发展现状及投资前景展望报告
- 2025年新高考“八省联考”语文试题及参考答案解析版
- 2024年巴中市市属事业单位考试真题
评论
0/150
提交评论