密码学课设报告--哈工大
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
密码学应用与实践课程设计报告
专业:信息安全
班级:
学号:
姓名:
Diffie-Hellman密码交换协议实现
1.密码算法原理
Diffie和Hellman在其具有里程碑意义的文“密码学新方向”[1]中提出
Diffie2Hellman密钥交换算法,时至今日该算法仍然是最为有效和安全的密钥交换算法。这个算法基于有限域中计算离散对数的困难性问题,能够实现在公共信道中按如下方法进行密钥的分配。
a).随机选取大素数p和在GF(p)上的本原根g,并将p和g作为公开信息;
b).用户Alice想和用户Bob建立保密通信时,就要交换共享的密钥KAB,Alice随机选取整数XA(1≤XA≤p-1),并且计算出YA=gXA mod p经共用信道传给Bob,将XA保密;
c).用户Bob也随机选取1个整数XB(1≤XB≤p-1),并计算出Y=gX
B mod p,也经共用信道传给Alice,将XB保密;
d).用户Alice与Bob各自计算KAB=Y XB A mod p=Y XAB mod p,这样Alice,Bob 成功的交换了秘密密钥KAB。
用上述方法实现密钥的分配,攻击者虽能知道p,g,YA,YB,但无法知道XA,XB,所以也无法知道秘密密钥KAB。要想知道XA,XB,攻击者必须在有限域GF(p)上求离散对数方程α=b mod p,而在已知a、b和p的情况下求x是相当困难的。其运算复杂度为
L(p)=e((ln p)1/3ln(ln p))2/3
,这对大素数p来说是不可行的。可见,用该方法通信双方通过非安全的共用信道建立了共享密钥协议。应当注意到,Diffie2Hellman密钥交换协议不支持对所建立的密钥的认证。处于2个通信参与者Alice和Bob之间的1个恶意攻击者Mallary可以操纵协议运行过程的信息并成功实施所谓的中间人攻击。因此为能真正在Alice和Bob之
间协商1个密钥就必须确保他们在协议运行过程中收到的信息的确是来自真实的对方。
随机选取大素数的问题,涉及到随机大数的素性检测问题。
Miller-Rabin算法的一般步骤:
0、先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数
1、随机取一个b,2<=b
2、计算v=b^m mod n
3、如果v==1,通过测试,返回
4、令i=1
5、如果v=n-1,通过测试,返回
6、如果i==j,非素数,结束
7、v=v^2mod n,i=i+1
8、循环到5
说明:
Miller-Rabin是随机算法
得到的结果的正确率为75%,所以应该多次调用该函数,使正确概率提高为1-(1/4)^p 2.设计思想
(1).产生随机大数
利用数组成为大数的不同位,模拟大数的生成
(2).利用Miller-Rabin算法判断所生成的大数是否为素数
(3).利用生成或者有用户个人输入的素数以及随机数,进行密钥交换
(4).Diffie-Hellman的实现步骤、
a).设置公共参数素数模P,底数g
b).利用Alice和Bob个的保密数Xa,Xb,计算Ya,Yb
c).通信双方交换Ya,Yb
d).计算共享密钥Xab,若两者计算结构相同责,密钥交换成功
3.设计流程图No Yes
4.功能实现
//算法实现主界面设置公共参数p 和g
开始
用户输入?系统生成生成Alice 和Bob 的保密数计算Ya 和Yb 交换数据计算公共密钥结束
//有Alice和Bob产生各自的随机数Xa和Xb。(此后演示均为有系统自动生成随机数),Xa和Xb,均为各自私有保密
//由程序计算Ya,Yb
//交换数据,以使下步生成公共密钥Xab
//计算结果相同,表示密钥交换成功
5.总结
本次课程设计是对密钥交换系统的一次尝试。实验中的主要问题既为随机大素数的问题。随机数的产生以及随机数的素性检测问题,以及Diffie-Hellman的实现。在随机大数的生成问题需要较多的数学问题,起初设计时较为吃力,经查找相关资料以及网络上的代码,最终确定利用数据表示的大数的不同位以实现对大数的产生,为避免溢出问题,将大数均已string字符串型显示。随机数的素性检测责利用到的
Miller-Rabin的算法,以判断所生成的随机数是否为素数,该算法基于概率的随机数素性检测,所以有一定的检错概率,所以针对此的解决方法则是多次进行检测。对于Diffie-Hellman的分析有了进一步的了解。
中间人攻击分析
Diffie2Hellman密钥交换算法最大的缺点是容易遭受中间人的攻击。假设第3方
Mallary在和Alice通信时扮演Bob;和Bob通信时扮演Alice。Alice和Bob都与Mallary协商了1个密钥,然后Mallary就可以监听和传递通信量。中间人的攻击按如下进行:a1Bob在给Alice的报文中发送其公开密钥。b1Mallary截获并解析该报文。Mallary将Bob的公开密钥保存下来并给Alice发送自己的报文,该报文具有Bob的用户ID但使用Mallary的公开密钥YM,仍按照好像是来自Bob的样子被发送出去。Alice收到Mallary的报文后,将YM和Bob的用户ID存储在一起。类似
地,Mallary使用YM向Bob发送好像来自Alice的报文。c1Bob基于私有密钥XB和YM计算秘密密钥K1。Alice基于私有密钥XA和YM计算秘密密钥K2。Mallary使用私有密钥XM和YB计算K1,并使用XM和YA计算K2。中间人攻击
(man2in2the2middle attack)是可行的,因为Alice和Bob无法验证他们的互相交谈。假设中间人Mallary没有导致任何的网络延迟,他
们2人就无法知道有中间人阅读他们自以为是秘密的消息数字签名或下面的加密的密钥交换协议。利用CA解决中间人攻击需要依赖于所有用户
都能信任的第3方所创建的公开密钥基础设施(Public Key Inf rast ructure PKI),通信的各方都要为得到签名证书而支付很高的服务费,这将大大增加运行成本,且安全性受制于第3方,因此这种方案的适用性就受到很大的制约。
6.源代码
BOOL CDiffie_HellmanDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!=NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX, strAboutMenu);
}
}
this automatically