1、密码学课程设计实验报告密码学课程设计实验报告院 系 计算机科学与技术 学院 专 业 信息安全 班 级 0703 学 号 xxxxxxxxxx 姓 名 xxxxxx 指导教师 xxxxxxxx 2010 年 3 月 18 日目录第一部分一、实验目的 二、实验环境及工具 三、实验内容 四、实验原理 五、实验过程 65.1设计思路 65.2程序的实现部分 11六、程序测试 126.1制定测试方案 126.2测试效果 12七、源代码 13第二部分一、实验目的 14二、实验环境及工具 14三、实验内容 14四、实验原理 14五、实验过程 145.1设计思路 145.2程序的流程图 17六、程序测试 19
2、6.1制定测试方案 196.2测试效果 20七、源代码 20第三部分实验总结 21第一部分三圈DES的差分攻击一、实验目的通过课程设计,使学生进一步熟悉密码算法以及算法安全性的基本概念和原理;培养学生将密码理论和技术应用于实际的能力,使学生具备实施数据加/脱密和基本的密码分析的能力。二、实验环境及工具 操作系统 Microsoft windows XP Home Edition 版本2002 Service Pack3 IDE环境 Microsoft Visual C+ 6.0 (SP6) 硬件环境 Intel(R)Atom CPU N270 1.60GHz,0.99GB的内存物理地址扩展三、
3、实验内容题目:三圈DES的差分攻击;要求:设计必需的界面环境,(1) 输入明文及其对应的密文,产生相应的密钥(2) 设计有好的窗口显示实验结果四、实验原理DES加密算法中的各种置换和扩展对差分没有影响,只有S盒可以阻挡差分;设 X=X1X2,Y=Y1Y2,其中X1和X2是S盒的六位输入,Y1和Y2是相应的四位输出即X1-S=Y1,X2-S=Y2;那么我们就可以以X为行索引,以Y为列索引建立一个64*16的二维矩阵,矩阵中的元素为可能的X值,我们把这个矩阵称作S盒的差分表,如下表所示:011415016263我们一共可以构造八个差分表,下面我们给出三圈DES的加密过程(省略了IP置换):在选择明
4、文攻击的情况下我们很容易保证R0=0,那么我们就可以得到下列式子:1) -1 A=E(L3);2) B=P(R3L0)由于L3、R3、L0在选择明文攻击时都是可求的,所以A、B也是可求的。由于A是S盒的输入B是S盒的输出,我们又能求得A、B所以我们通过查差分表就可以把A局限在一个较小的范围内(在这个范围内穷举是可行的),又由于K3=AC= AE(L3),所以子密钥K3也被局限到了一个较小的范围内而DES的主密钥K的穷举时间是K3的256倍,所以穷举K也是可行的。五、实验过程 5.1设计思路 其实具体的算法已经在实验原理中给出了,我就是按照此原理设计了一个CAttack类用来进行差分攻击,下面是
5、它的头文件:/ Attack.h: interface for the CAttack class./#if !defined(AFX_ATTACK_H_5C3E3C22_41EC_4D03_8249_6A9D80ECFA07_INCLUDED_)#define AFX_ATTACK_H_5C3E3C22_41EC_4D03_8249_6A9D80ECFA07_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include DES.h#define PLAINTEXT0 0#define PLAINTEXT1 1#def
6、ine ENCRYPTOGRAPH0 2#define ENCRYPTOGRAPH1 3#define PLAINTEXT2 4#define PLAINTEXT3 5#define ENCRYPTOGRAPH2 6#define ENCRYPTOGRAPH3 7class CAttack : public CDESpublic: CAttack(); virtual CAttack(); /* / 名称:InitAttack / 功能:初始化8个S盒的差分表 / 参数: / 返回: / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* void InitAttack(); /*
7、/ 名称:TryAttack / 功能:进行差分攻击 / 参数:key:out 返回破解出来的密钥 / 返回:成功为TURE,否则为FALSE / 备注:成功为TURE,否则为FALSE / 更新:2010/3/10 / 作者:王凤伟 /* BOOL TryAttack(CString &key); /* / 名称:SetData / 功能:设置破解参数 / 参数:nFlag:in 参数标志 / str: in 参数值 / 返回:成功为TURE,否则为FALSE / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* BOOL SetData(UINT nFlag,CString&
8、str);protected: /* / 名称:CalcDelta / 功能:计算各个差分值 / 参数:byPlaintext0:in 明文串0 / byEncryptograph0: in 密文串0 / byPlaintext1:in 明文串1 / byEncryptograph1: in 密文串1 / 返回: / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* void CalcDelta(BYTE byPlaintext0,BYTE byEncryptograph0,BYTE byPlaintext1,BYTE byEncryptograph1); /* / 名称:BitT
9、oUint / 功能:二进制位串到整型数据的转换 / 参数:byt:in 二进制串 / len: in 二进制串的长度 / 返回:转换结果 / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* UINT BitToUint(BYTE byt,UINT len); /* / 名称:UintToBit / 功能:整型数据到二进制位串的转换 / 参数:byt:out 二进制串 / len: in 二进制串的长度 / n: in 整数 / 返回: / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* void UintToBit(BYTE byt,UINT len,UINT n
10、); /* / 名称:CalcSubkey / 功能:计算所有可能的子密钥K3 / 参数:R:in 密文的右半部分 / delX: in x的差分 / delY: in y的差分 / subkey:out可能的子密钥 / 返回: / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* void CalcSubkey(BYTE R,BYTE delX,BYTE delY,CList subkey); /* / 名称:CalcSubkey / 功能:穷举56位主密钥 / 参数: / 返回:成功为TURE,否则为FALSE / 备注: / 更新:2010/3/10 / 作者:王凤伟 /*
11、BOOL CalcMainKey(); /* / 名称:Conjoin / 功能:求子密钥交集的函数key2=key2交key1 / 参数:key2in/out:子密钥key2集合 / key1in:子密钥key1集合 / 返回: / 备注: / 更新:2010/3/10 / 作者:王凤伟 /* void Conjoin(CList key2,CList key1);protected: CList m_s86416;/ 用于保存差分表 CList m_Key18; / 用于保存可能子密钥集合的链表 CList m_Key28; / 用于保存可能子密钥集合的链表 BYTE m_byAttack
12、edSubKeyROUND48; / 3圈子密钥 BYTE m_byAttackedDesKey56; / 密钥 CString m_strAttackedDesKey; / 密钥串 BYTE m_byEncryptograph064; / 密文0 BYTE m_byPlaintext064; / 明文0 CString m_strPlaintext0; / 明文串0 CString m_strEncryptograph0; / 密文串0 BYTE m_byEncryptograph164; / 密文1 BYTE m_byPlaintext164; / 明文 1 CString m_strPl
13、aintext1; / 明文串1 CString m_strEncryptograph1; / 密文串1 BYTE m_byEncryptograph264; / 密文2 BYTE m_byPlaintext264; / 明文2 CString m_strPlaintext2; / 明文串2 CString m_strEncryptograph2; / 密文串2 BYTE m_byEncryptograph364; / 密文3 BYTE m_byPlaintext364; / 明文3 CString m_strPlaintext3; / 明文串3 CString m_strEncryptogr
14、aph3; / 密文串3 BYTE m_byDeltaL032; / L0的差分 BYTE m_byDeltaL332; / L3的差分 BYTE m_byDeltaR3_L032; / R3的差分异或L0的差分 BYTE m_byDeltaA48; / A的差分(S盒的输入) BYTE m_byDeltaB32; / B的差分(S盒的输出);#endif / !defined(AFX_ATTACK_H_5C3E3C22_41EC_4D03_8249_6A9D80ECFA07_INCLUDED_)5.2程序的实现部分既然原理已经很清楚了,那么设计算法就不在困难了,这里我进一步给出算法的流程图,
15、算法的详细内容请参照文件夹DES Attacker中的源程序。 说明:保存subkey时并不是真正的保存subkey的完整部分,而是将subkey每6位分为一组保存,这样可以大大地减少存储空间(乘法原理)。六、程序测试6.1制定测试方案为了便于测试,我编写了一个简单的三圈DES加密程序(DES 3 Rounds.exe),可以在DES 3 Rounds文件夹中找到,由用户自主选择密钥和满足条件的明密文对,然后把相应的参数输入到三圈DES差分攻击主程序(DES Attacker.exe)中,进行破译,最后与用户的密钥进行比较。6.2测试效果6.2.1生成破解参数运行程序DES 3 Rounds.
16、exe,输入相应的明文和密钥,生成参数图6.2.1生成破解参数6.2.1进行破译运行DES Attacker.exe,并把刚才生成的破解参数复制到相应的编辑框中。图6.2.1 进行破译七、源代码由于该程序的主框架是由MFC的AppWizard生成的,代码量很大,所以就不把源代码放到实验报告里了,若要看源代码请打开当前目录下的DES Attacker文件夹。一、实验目的通过课程设计,使学生进一步熟悉密码算法以及算法安全性的基本概念和原理;培养学生将密码理论和技术应用于实际的能力,使学生具备实施数据加/脱密和基本的密码分析的能力。二、实验环境及工具 操作系统 Microsoft windows X
17、P Home Edition 版本2002 Service Pack3 IDE环境 Microsoft Visual C+ 6.0 (SP6) 硬件环境 Intel(R)Atom CPU N270 1.60GHz,0.99GB的内存物理地址扩展三、实验内容题目:RSA解密密钥攻击;要求:设计必需的界面环境,(1) 加密密钥和解密密钥,求p、q,使n=p*q(2) 设计有好的窗口显示实验结果四、实验原理 定理:已知k1,k2求p和q,k1*k2=m*(n)+1,若能求x*x=1(mod n)的非平凡根,则可求p和q且p=(x+1,n),q=(x-1,n); 算法:(1)k1*K2-1-r;0-s
18、; (2)i+1-s,n=r/2; (3)若2|r,则转(2),否则转(4);(2)-(3)步骤目的是求K1*K2=r*2s) (4)任取w,1wV;若V=1,则转(4);否则转(6) (6)r/2-r;Vr-tem;若tem=1则转(6); 若tem=-1,则转(4)否则p=(tem+1,n),q=(tem-1,n),成功说明:算法的关键是第6步,在判断tem的值时,没有简单的判断tem=1或tem=-1时直接重新计算随机数W,而是对tem=1的情况进行了优化,即在tem=1时,把V的指数除二然后得到新的tem,这种优化是必要的,也是有效的。因为V(2s)是收敛于1的,也就是说在随着s的增大
19、V(2s)=1的概率将越来越接近1,而若不把指数缩小很难找到tem!=1的W值,这与利用穷举法分解N的效率相当。我曾经在没有优化的情况下做过实验,当时分解一个20位(16进制)的N,大约需要30分钟,而且都是在(w,n)!=1的条件下返回的(这正是穷举的结果),而经过优化后分解的时间只有几百毫秒的时间,而且都是在第六步返回的。五、实验过程 5.1设计思路 具体的算法已经在实验原理中给出了,我就是按照此原理设计了一个CAttack类用来进行大数分解,而其中最关键的就是CAttack:Attack()函数,下面给出了源代码:#define CHECK(x) if( !(x) ) return fa
20、lse;bool CAttack:Attack() static BigInt r,tem,tem1,v,sem,m,rands,rands1; UINT i=0; / 利用简单的加解密判断用户输入的参数是否正确 CHECK(m_OBigInt.PowMod(tem,m_OBigInt.Two,m_k1,m_n) CHECK(m_OBigInt.PowMod(tem1,tem,m_k2,m_n) CHECK(!m_OBigInt.Cmp(tem1,m_OBigInt.Two) CHECK(m_OBigInt.Mul(tem,m_k1,m_k2) CHECK(m_OBigInt.Sub(sem,
21、tem,m_OBigInt.One) tem=sem; / 计算k1*k2-1=r*2s do r=tem; CHECK(m_OBigInt.Div(tem,rands,r,m_OBigInt.Two) while (!m_OBigInt.Cmp(rands,m_OBigInt.Zero); / 2s-m CHECK(m_OBigInt.Div(m,tem1,sem,r) / 生成随机数rands1 CHECK(m_OBigInt.RandVal(rands1,m_n.len+1) do do B: if (iCYCLE) i=0; CHECK(m_OBigInt.RandVal(rands1
22、,m_n.len+1) i+; / 生成满足条件1randsv CHECK(m_OBigInt.PowMod(v,rands,r,m_n) CHECK(m_OBigInt.Add(tem,v,m_OBigInt.One) / 若v=1或v=-1,则重新生成随机数 if (!m_OBigInt.Cmp(v,m_OBigInt.One)|!m_OBigInt.Cmp(tem,m_n) goto B; tem1=m; / 2s-tem loop: CHECK(m_OBigInt.Div(tem1,tem,tem1,m_OBigInt.Two) / 计算tem1/2-tem1 CHECK(m_OBigInt.PowMod(tem,v,tem1,m_n) / 计算vtem1-tem / 如果vtem1=1,则计算v(tem1/2) if(!m_OBigInt.Cmp(tem,m_OBigInt.One)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1