夸切·乌陶斯 2024-01-15 08:40 采纳率: 100%
浏览 36
已结题

密码学pycharm代码实现

基于配对的BLS短签名系统实现,对任意长度的消息进行Boneh-Lynn-Shacham(BLS)签名算法和验证算法的实现;对BLS系统中的密钥生成、签名和验证算法的运行时间开销进行分析;对BLS系统中的相关公钥、私钥和签名长度的存储开销进行分析;界面简洁、交互操作性强,有偿完成

  • 写回答

11条回答 默认 最新

  • @晓码自在 2024-01-15 10:18
    关注

    问题的答案是由GPT-4Plus模型生成,并经过@晓码自在博主的编辑修改:

    用Python的tkinter模块和matplotlib模块来实现一个基于配对的BLS短签名系统的图形用户界面:

    # 导入模块
    import tkinter as tk
    import matplotlib.pyplot as plt
    import nacl
    import nacl.signing
    import nacl.encoding
    import nacl.hash
    import time
    import sys
    
    # 定义一个素数p
    p = 52435875175126190479447740508185965837690552500527637822603658699938581184513
    
    # 定义一个双线性映射e:G1xG1->G2,这里使用PyNaCl提供的curve25519算法
    def e(P, Q):
        return nacl.bindings.crypto_scalarmult_curve25519(P, Q)
    
    # 定义一个生成元g∈G1,这里使用PyNaCl提供的basepoint
    g = nacl.bindings.crypto_scalarmult_curve25519_base()
    
    # 定义一个哈希函数H:{0,1}*->G1,这里使用PyNaCl提供的sha512算法,并将结果转换为G1中的点
    def H(m):
        h = nacl.hash.sha512(m, encoder=nacl.encoding.RawEncoder)
        return nacl.bindings.crypto_scalarmult_curve25519_base(h)
    
    # 定义一个密钥生成函数,返回一个私钥x和一个公钥y
    def keygen():
        # 随机选择一个私钥x∈Zp
        x = nacl.utils.random(nacl.bindings.crypto_core_ed25519_SCALARBYTES)
        # 计算公钥y=g^x∈G1
        y = e(g, x)
        return x, y
    
    # 定义一个签名生成函数,输入一个消息m和一个私钥x,返回一个签名s
    def sign(m, x):
        # 计算h=H(m)∈G1
        h = H(m)
        # 计算签名s=h^x∈G1
        s = e(h, x)
        return s
    
    # 定义一个签名验证函数,输入一个消息m,一个公钥y,和一个签名s,返回一个布尔值
    def verify(m, y, s):
        # 计算h=H(m)∈G1
        h = H(m)
        # 验证e(s,g)=e(h,y)是否成立
        return e(s, g) == e(h, y)
    
    # 定义一个绘制图表的函数,输入一个素数p,一个消息m,一个私钥x,一个公钥y,和一个签名s,绘制密钥生成,签名,验证的时间和空间开销的柱状图
    def plot(p, m, x, y, s):
        # 计算密钥生成的时间和空间开销
        start = time.time()
        x, y = keygen()
        end = time.time()
        keygen_time = end - start
        keygen_space = sys.getsizeof(x) + sys.getsizeof(y)
        # 计算签名的时间和空间开销
        start = time.time()
        s = sign(m, x)
        end = time.time()
        sign_time = end - start
        sign_space = sys.getsizeof(s)
        # 计算验证的时间和空间开销
        start = time.time()
        result = verify(m, y, s)
        end = time.time()
        verify_time = end - start
        verify_space = sys.getsizeof(result)
        # 创建一个新的窗口
        window = tk.Toplevel()
        window.title("图表")
        # 创建一个画布
        canvas = tk.Canvas(window, width=800, height=600)
        canvas.pack()
        # 创建一个图形对象
        fig = plt.figure(figsize=(8, 6))
        # 创建一个子图,绘制时间开销的柱状图
        ax1 = fig.add_subplot(121)
        ax1.bar(["keygen", "sign", "verify"], [keygen_time, sign_time, verify_time], color="blue")
        ax1.set_xlabel("Operation")
        ax1.set_ylabel("Time (s)")
        ax1.set_title("Time Cost")
        # 创建一个子图,绘制空间开销的柱状图
        ax2 = fig.add_subplot(122)
        ax2.bar(["keygen", "sign", "verify"], [keygen_space, sign_space, verify_space], color="green")
        ax2.set_xlabel("Operation")
        ax2.set_ylabel("Space (bytes)")
        ax2.set_title("Space Cost")
        # 将图形对象转换为画布对象
        canvas = plt.FigureCanvasTkAgg(fig, master=window)
        canvas.draw()
        canvas.get_tk_widget().pack()
        # 显示图表
        plt.show()
    
    # 创建一个主窗口对象
    root = tk.Tk()
    # 设置主窗口的标题
    root.title("基于配对的BLS短签名系统")
    # 设置主窗口的大小和位置
    root.geometry("800x600+100+100")
    # 创建一个输入框,用于输入消息
    message_entry = tk.Entry(root, font=("Arial", 16))
    message_entry.place(x=100, y=100, width=600, height=50)
    # 创建一个标签,用于显示消息
    message_label = tk.Label(root, text="消息", font=("Arial", 16))
    message_label.place(x=10, y=100, width=80, height=50)
    # 创建一个输出框,用于显示结果
    result_text = tk.Text(root, font=("Arial", 16))
    result_text.place(x=100, y=200, width=600, height=300)
    # 创建一个标签,用于显示结果
    result_label = tk.Label(root, text="结果", font=("Arial", 16))
    result_label.place(x=10, y=200, width=80, height=50)
    # 创建一个按钮,用于生成密钥
    keygen_button = tk.Button(root, text="生成密钥", font=("Arial", 16), command=lambda: keygen_button_click())
    keygen_button.place(x=100, y=500, width=100, height=50)
    # 创建一个按钮,用于签名消息
    sign_button = tk.Button(root, text="签名消息", font=("Arial", 16), command=lambda: sign_button_click())
    sign_button.place(x=300, y=500, width=100, height=50)
    # 创建一个按钮,用于验证签名
    verify_button = tk.Button(root, text="验证签名", font=("Arial", 16), command=lambda: verify_button_click())
    verify_button.place(x=500, y=500, width=100, height=50)
    # 创建一个按钮,用于绘制图表
    plot_button = tk.Button(root, text="绘制图表", font=("Arial", 16), command=lambda: plot_button_click())
    plot_button.place(x=700, y=500, width=100, height=50)
    
    
    

    以上方法希望对你有所帮助。如果还有疑问,欢迎随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 1月15日