Python中使用LightPHE无法解密,GUI无法显示正确同态计算总额
问题分析与代码修正
核心问题
你的代码没有正确实现同态加密的计算逻辑:当前的同态计算函数是先解密每个加密值,再对明文求和,这和传统计算完全一致,没有利用Paillier算法的密文加法特性,相当于白做了加密解密的步骤。你提到的“GUI显示信息未解密”其实是误解——当前代码里total_sum是解密后的明文,所以GUI显示的是正确数值,但你的实现逻辑完全偏离了同态加密的核心用法。
修正后的代码
import tkinter as tk import csv import random import time from lightphe import LightPHE def generate_and_write_transactions(filename, num_transactions): transactions = [] for _ in range(num_transactions): amount_received = round(random.uniform(10, 500), 2) transactions.append(("Deposit", amount_received)) with open(filename, "w", newline="") as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(["Transaction Type", "Amount"]) csvwriter.writerows(transactions) def compute_total_amount(): try: start_time = time.time() filename = "transaction_history.csv" total_amount = 0 with open(filename, 'r') as file: reader = csv.reader(file) next(reader) # Skip header row for row in reader: if row[0] == 'Deposit': total_amount += float(row[1]) end_time = time.time() result_label.config(text=f"Total amount (traditional computation): ${total_amount:.2f}\nTime taken: {end_time - start_time:.6f} seconds") except Exception as e: result_label.config(text="Error: " + str(e)) def compute_total_amount_homomorphic(): try: start_time = time.time() filename = "transaction_history.csv" cs = LightPHE(algorithm_name="Paillier") # 初始化密文总和为0的加密值 total_encrypted_sum = cs.encrypt(plaintext=0) with open(filename, 'r') as file: reader = csv.reader(file) next(reader) for row in reader: if row[0] == 'Deposit': encrypted_amount = cs.encrypt(plaintext=float(row[1])) # 直接在密文状态下累加,这才是同态加密的核心 total_encrypted_sum += encrypted_amount # 最后解密密文总和得到实际总额 total_sum = cs.decrypt(total_encrypted_sum) end_time = time.time() result_text = f"Total amount (homomorphic encryption): ${total_sum:.2f}\nTime taken: {end_time - start_time:.6f} seconds" result_label.config(text=result_text) except Exception as e: result_label.config(text="Error: " + str(e)) generate_and_write_transactions("transaction_history.csv", 10) root = tk.Tk() root.title("Bank Account testing") root.geometry("400x300") compute_button = tk.Button(root, text="Compute Total Amount (Traditional)", command=compute_total_amount) compute_button.pack(pady=5) compute_homomorphic_button = tk.Button(root, text="Compute Total Amount (Homomorphic)", command=compute_total_amount_homomorphic) compute_homomorphic_button.pack(pady=5) result_label = tk.Label(root, text="") result_label.pack() root.mainloop()
关键修改说明
- 初始化
total_encrypted_sum为0的加密值,作为密文累加的初始值 - 遍历过程中,直接将每个加密后的金额与密文总和相加(
total_encrypted_sum += encrypted_amount),这一步完全在密文状态下完成,不需要解密任何中间值 - 最后只解密一次密文总和,得到最终的明文总额
这样修改后,才是真正的同态加密计算流程,你可以对比传统计算和同态计算的结果,确认两者一致,同时验证同态加密的正确性。
内容的提问来源于stack exchange,提问作者Marian
相关产品推荐
相关产品推荐

