密码学实验_11_DH密钥交换算法(基于椭圆曲线 python 实现)

该博客介绍了如何利用椭圆曲线加密算法(ECC)来实现Diffie-Hellman密钥交换。通过定义ECC类,包括普通加法和数量乘法的方法,文章展示了如何生成公钥并计算共享密钥。在示例中,两个用户分别使用自己的私钥和对方的公钥进行计算,最后得出相同的共享密钥,验证了算法的正确性。
摘要由CSDN通过智能技术生成

文章目录

效果

代码

from encryption_algorithm import Euclid
import random

class ECC:
    def __init__(self, coe: list, p: int, G: list):
        self.coe = coe
        self.p = p
        self.G = G

    # 普通加法
    def add(self, a: list ,b: list)-> list:
        euc = Euclid.euclid()
        a_x, a_y = a[0], a[1]
        b_x, b_y = b[0], b[1]

        # 两横坐标不等
        if(a_x!=b_x):
            #print(p, b_x-a_x)
            c = (b_y - a_y) * euc.get_valid_X_Y(self.p, (b_x-a_x)%self.p, ret_String=False)[1]
            c %= p

        # 两横坐标相等,但纵坐标不为相反数
        elif((a_y+b_y)%p!=0):
            c = (3 * a_x**2 + self.coe[0]) * euc.get_valid_X_Y(self.p, (2*a_y)%self.p, ret_String=False)[1]
            c %= self.p
        # 横坐标相等,纵坐标为相反数时,不能计算
        else:
            return None
        x = (c**2 - a_x - b_x) % self.p
        y = (c*(a_x - x) - a_y) % self.p
        return [x, y]
    
    # 数量乘法
    def mul(self, n: int, T: list)-> list:
        res = T
        while(n>1):
            res = self.add(res, T)
            if(res==None):
                print("横坐标相等, 纵坐标为相反数, 不可计算!!!")
                return None
            n -= 1
        return res

if __name__=='__main__':
    # 椭圆曲线参数
    coe = [1, 1]
    p = 23
    # 循环群选择
    n = 27
    G = [0, 1]
    # 密钥生成
    dh_ecc = ECC(coe, p, G)
    n_a = 5
    n_b = 11
    # 公钥生成
    mul_a = dh_ecc.mul(n_a,G)
    mul_b = dh_ecc.mul(n_b,G)
    # 共享密钥计算
    Share_a = dh_ecc.mul(n_a,mul_b)
    Share_b = dh_ecc.mul(n_b,mul_a)
    print('用户a计算出的共享密钥: {}'.format(Share_a))
    print('用户b计算出的共享密钥: {}'.format(Share_b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值