You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:25:46