Diffie-Hellman秘钥交换 Python + Pyqt 实现(密码学大作业)

本文介绍了密码学的基础知识,详细讲解了Diffie-Hellman算法的原理和步骤,包括如何生成原根。通过实例展示了算法的实现过程,最后给出了代码实现和运行效果。读者将理解如何使用Python进行密钥交换,为安全通信提供保障。
摘要由CSDN通过智能技术生成

基于Python实现的Diffie-Hellman加密算法(密码学大作业)

1 密码学介绍

密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。它与语言学、数学、电子学、声学、信息论、计算机科学等有着广泛而密切的联系。它的现实研究成果,特别是各国政府现用的密码编制及破译手段都具有高度的机密性。密码学(Cryptography)包括密码编码学和密码分析学。密码体制设计是密码编码学的主要内容,密码体制的破译是密码分析学的主要内容,密码编码技术和密码分析技术是相互依相互支持、密不可分的两个方面。密码体制有对称密钥密码体制和非对称密钥密码体制。对称密钥密码体制要求加密解密双方拥有相同的密钥。而非对称密钥密码体制是加密解密双方拥有不相同的密钥,在不知道陷门信息的情况下,加密密钥和解密密钥是不能相互算出的。

2 Diffie-Hellman算法结构介绍

diffe-hellman

2.1 Diffie-Hellman算法结构图

(1)有两个全局公开的参数,一个素数p和一个整数a,a是p的一个原根(对于正整数gcd(a,m)=1,如果a是模m的原根,那么a是整数模m乘法群的一个生产元);
(2)假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA<p,并计算公开密钥YA = a^XA mod p,A对XA的值保密存放而使YA能被B公开获得。类似地,用户B选择一个私有的随机数XB<p,并计算公开密钥YB = a^XB mod p。B对XB的值保密存放而使YB能被A公开获得。
(3)用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod p。同样,用户B产生共享秘密密钥的计算是K = (YA)^XB mod p。这两个计算产生相同的结果.

2.2 关于原根的生成

在求解原根的时候采用的是暴力求解的方法,按照的规定就是a是p的原根,就是a^(p - 1) = 1(mod p)当且仅当指数为p-1的时候成立,所以我使用的办法就是取a在[2, p-1]之间进行取值,若是其中有满足上述式子的a则放到列表中,最后在自动生成原根的时候是人为的取得最大的那个数值作为原根。
例如:当p = 7时,a从2开始取值,因为2^3 = 1(mod 7),3!=6,所以2不是p的原根;
当a = 3时,3^1 = 3(mod 7),3^2 = 3(mod 7),3^3 = 6(mod 7),3^4 = 4(mod 7),3^5 = 5(mod 7),3^6 = 1(mod 7)

所以p = 7的一个原根就是3,同样的道理可以求出p的所有的原根。

2.3 密钥交换协议小例子

假设密钥交换基于素数p = 97和97的一个原根a = 5。A和B分别选择私有密钥XA = 36和XB = 58。每人计算其公开密钥
YA = 536 = 50 mod 97
YB = 558 = 44 mod 97
在他们相互获取了公开密钥之后,各自通过计算得到双方共享的秘密密钥如下:
K = 75 mod 97

2.4算法实现流程

(1)提示用户输入一个素数p,判断用户输入是否为素数,若是则生成其生成元a,若不是则提示用户继续输入,直到输入符合要求为止;
(2)定义函数judge_prime判断用户输入是否为素数;
(3)定义函数get_generator来得到p的生成元a;
(4)A,B各自选择小于p随机数作为自己的私钥XA,XB,并根据Diffie-Hellman算法得到各自的计算数;
(5)交换彼此的计算数;
(6)对对方交换的数进行计算,若是得到的结果相同则是公共密钥。

2.5算法的设计流程图

算法流程图

3 实现效果

运行代码,弹出Diffie-Hellman加密解密测试程序,如图3.1可以看到,Alice与Bob两个不同的人在准备进行消息交流:
请添加图片描述
为了实现Alice与Bob的信息加密交流,首先需要确定公共秘钥,对于Diffie-Hellman加密算法而言,公钥必须为一个大于2的素数,本次实验我们将公钥设置为97,单击确定,Alice与Bob即可得到两个人的公钥。

请添加图片描述
随后Alice与Bob都已经知道了双方的公钥为77切没有通过中间人的传输。随后Alice即可通过加密算法向Bob发送通过base64转码后的偏移加密信息,然后Bob接收到加密信息,通过反偏移与Base64解密即可得到Alice发送的信息。
请添加图片描述

最后附上代码地址 :

https://github.com/Mask0913/Diffie-Hellman-crypto 欢迎点小星星
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值