密码学--Diffie-Hellman密钥交换

文章介绍了Diffie-Hellman密钥交换算法,这是一种基于离散对数难题的安全协议,用于在两个用户间安全交换密钥。文中包含算法的步骤解释,以及一个简单的Python代码实现,展示了如何生成和交换计算数以获取共享密钥。
摘要由CSDN通过智能技术生成

1.W.Diffie与M.Hellman在1976年提出一个称为Diffie-Hellman密钥交换的公钥密码算法。该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该算法只能用于交换密钥,不能用于加/解密。

2.Diffie-Hellman密钥交换的安全性基于求解有限域上离散对数的困难性。首先,双方需要约定一个大素数p和它的一个本原根g,然后整个密钥交换的过程分两步完成:

3.Diffie-Hellman密钥交换算法的目的是使两个用户能安全交换密钥,以便在后续的通信中用该密钥对消息加密算法的有效性建立在离散对数上,在计算离散对数是困难的才能确保秘密交换。其中在这次实验中了解到计算素数模的运算相对容易,计算离散对数却非常困难对大素数,求离散对数被认为是困难的从而保证了Diffie-Hellman密钥交换的保密性。

 4.代码实现

import math
import random

def judge_prime(p):
#素数的判断
	if p <= 1:
		return False
	i = 2
	while i * i <= p:
		if p % i == 0:
			return False
		i += 1
	return True

def get_generator(p):
#得到所有的原根
	a = 2
	list = []
	while a < p:
		flag = 1
		while flag != p:
			if (a ** flag) % p == 1:
				break
			flag += 1
		if flag == (p - 1):
			list.append(a)
		a += 1
	return list

#A,B得到各自的计算数
def get_calculation(p, a, X):
	Y = (a ** X) % p
	return Y

#A,B得到交换计算数后的密钥
def get_key(X, Y, p):
	key = (Y ** X) % p
	return key

if __name__ == "__main__":

	#得到规定的素数
	flag = False
	while flag == False:
		print('Please input your number(It must be a prime!): ', end = '')
		p = input()
		p = int(p)
		flag = judge_prime(p)
	print(str(p) + ' is a prime! ')

	#得到素数的一个原根
	list = get_generator(p)
	print(str(p) + ' 的一个原根为:', end = '')
	print(list[-1])
	print('------------------------------------------------------------------------------')

	#得到A的私钥
	XA = random.randint(0, p-1)
	print('A随机生成的私钥为:%d' % XA)

	#得到B的私钥
	XB = 43
	print('B的私钥为:%d' % XB)
	print('------------------------------------------------------------------------------')

	#得待A的计算数
	YA = get_calculation(p, int(list[-1]), XA)
	print('A的计算数为:%d' % YA)

	#得到B的计算数
	YB = get_calculation(p, int(list[-1]), XB)
	print('B的计算数为:%d' % YB)
	print('------------------------------------------------------------------------------')

	#交换后A的密钥
	key_A = get_key(XA, YB, p)
	print('A的生成密钥为:%d' % key_A)

	#交换后B的密钥
	key_B = get_key(XB, YA, p)
	print('B的生成密钥为:%d' % key_B)
	print('---------------------------True or False------------------------------------')

	print(key_A == key_B)

实验结果

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值