首页 > 编程语言 >Python使用ecdh算法交换共享秘钥

Python使用ecdh算法交换共享秘钥

时间:2023-07-22 16:25:18浏览次数:41  
标签:__ socket Python ecdh private 秘钥 key server public

dh_server.py:

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization
import socket

def ecdh_generater(received_public_key):
    # Generate private key
    private_key = ec.generate_private_key(ec.SECP256R1())

    # Get public key
    public_key = private_key.public_key()

    # Deserialize public key received from other party
    received_public_key = serialization.load_pem_public_key(received_public_key)

    # Perform key exchange
    shared_key = private_key.exchange(ec.ECDH(), received_public_key)

    # Serialize public key to send to other party
    serialized_public_key = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )

    return serialized_public_key, private_key, shared_key

if __name__ == '__main__':
    # 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connect_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 监听端口
    server_socket.bind(("127.0.0.1", 11221))
    server_socket.listen()

    while True:
        # 等待连接
        client_socket, addr = server_socket.accept()

        # 打印对端地址
        print(f"Connection from {addr[0]}:{addr[1]}")

        # 接收对端消息
        data = client_socket.recv(1024)

        # 生成对称秘钥
        serialized_public_key, _, shared_key = ecdh_generater(data)
        print(shared_key.hex())

        # 连接对端
        connect_socket.connect(("127.0.0.1", 11220))

        # 发送公钥
        connect_socket.sendall(serialized_public_key)
        
        # 关闭socket连接
        client_socket.close()
        break

dh_client.py:

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization
import socket

def ecdh_generater():
    # Generate private key
    private_key = ec.generate_private_key(ec.SECP256R1())

    # Get public key
    public_key = private_key.public_key()

    # Serialize public key to send to other party
    serialized_public_key = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    return serialized_public_key, private_key

if __name__ == '__main__':
    # 创建 socket 对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connect_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 监听端口
    server_socket.bind(("127.0.0.1", 11220))
    server_socket.listen()

    # 连接服务端
    connect_socket.connect(("127.0.0.1", 11221))

    # 生成公私钥
    serialized_public_key, private_key = ecdh_generater()

    # 发送公钥
    connect_socket.sendall(serialized_public_key)

    while True:
        # 等待连接
        client_socket, addr = server_socket.accept()

        # 打印对端地址
        print(f"Connection from {addr[0]}:{addr[1]}")

        # 接收对端消息
        data = client_socket.recv(1024)
        
        # 公钥解码
        received_public_key = serialization.load_pem_public_key(data)

        # 共享秘钥
        shared_key = private_key.exchange(ec.ECDH(), received_public_key)
        print(shared_key.hex())

        # 关闭连接
        client_socket.close()
        break

标签:__,socket,Python,ecdh,private,秘钥,key,server,public
From: https://www.cnblogs.com/desireroot7/p/17573550.html

相关文章

  • python虚拟环境搬迁到另外一台电脑(目标机不能联网)
    工作中会遇到开发机做了限制,并不能直接访问外网,此时可能需要迁移一套开发环境过来,完成需求。一、源机上执行命令1、源机上已安装好各种python库、包,可通过命令piplist查看;如安装pandas命令:pipinstallpandas2、把包名和版本号存入一个txt文件,如下命令行自动存入;pipfreeze>......
  • python开发桌面应用
    python开发桌面应用的原理主要是利用Python的GUI库来实现图形界面。Python的GUI库有很多种,例如Tkinter、PyQt、wxPython等等。其中,Tkinter是Python自带的GUI库,使用比较简单,适合初学者入门。PyQt是一种基于Qt框架的PythonGUI库,功能非常强大,适合开发大型项目。wxPython是基于C+......
  • update ClosedSurfaceRepresentation python
    如何实现"updateClosedSurfaceRepresentationpython"流程概述要实现"updateClosedSurfaceRepresentationpython",需要按照以下步骤进行操作:步骤描述1导入所需的模块2加载或创建3D模型3获取闭合曲面的表示4执行更新操作5保存或显示更新后的结果......
  • unity与python通信
    Unity与Python通信Unity是一款功能强大的游戏开发引擎,而Python是一种简单易学的编程语言。将这两者结合起来可以实现更多有趣的功能。本文将介绍如何在Unity中与Python进行通信,并提供代码示例。Unity端设置首先,在Unity中需要安装Python插件。可从UnityAssetStore中下载并导入"......
  • 4.C++和Python
    C++是编译性语言,Python是解释性语言C++编译链接的全过程分为:预编译预编译会执行以下内容:宏替换执行条件编译:#ifdef,#ifndef,#endif#include后面文件内容插入并替换当前行删除注释编译编译会执行以下内容:检查有没有语法错误,没有的话转换为汇编语言,汇编过程再将汇编语言转......
  • Python之Rich库-打印彩色字体,表单,进度条与状态动画
      https://rich.readthedocs.io/en/latest/introduction.html Introduction¶RichisaPythonlibraryforwritingrichtext(withcolorandstyle)totheterminal,andfordisplayingadvancedcontentsuchastables,markdown,andsyntaxhighlightedcode.U......
  • 在ubuntu上用python的好处
    在Ubuntu上使用Python的好处引言Python是一种简单易学、功能强大的编程语言,它在Ubuntu操作系统上广泛应用于各个行业和领域。本文将指导刚入行的开发者如何在Ubuntu上使用Python,并介绍使用Python的好处。整体流程下面的表格展示了在Ubuntu上使用Python的整体流程:步骤描述......
  • 在python中utc时间毫秒格式化保留3位
    在Python中UTC时间毫秒格式化保留3位在计算机编程中,时间的处理是非常重要的。在Python中,有时我们需要将时间格式化为特定的字符串形式,以便于存储、传输或显示。本文将介绍如何在Python中将UTC时间的毫秒部分格式化并保留3位。UTC时间和时区在介绍如何格式化UTC时间之前,我们先了......
  • 在python中,while满足的条件是什么
    在Python中,while循环是一种迭代结构,它会根据一定的条件重复执行一段代码。在每次循环中,都会检查循环条件是否满足,如果满足则执行循环体内的代码,然后再次检查循环条件。只要条件仍然满足,循环就会一直执行下去,直到条件不满足时终止循环。在Python中,while循环的语法如下所示:whileco......
  • python设计一个跨模块全局变量
    python中有时候需要用到全局变量,并且这个全局变量需要跨文件,跨模块共享.为此,我设计了一个全局对象,它有以下特点:如果为不存在的属性赋值,则会自动生成这个属性,后续就可以正常引用这个属性,就像对象本身具有此属性一样整个对象可以序列化,后续可以从文件中恢复对......