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

同态加密计算银行交易总和时解密失败问题求助

问题根源

你遇到的解密失败问题,核心原因是Paillier同态加密算法(LightPHE实现的版本)原生仅支持整数运算,而你直接加密了浮点数类型的交易金额,导致加密和解密过程中数据被异常处理,无法正确还原总和。

解决方案

将浮点数金额转换为整数(比如把美元金额乘以100,转为以“分”为单位的整数),完成加密、同态加法、解密后,再转换回浮点数即可。以下是修改后的完整代码:

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)  # 跳过表头
            for row in reader:
                if row[0] == 'Deposit':
                    total_amount += float(row[1])
        
        end_time = time.time()
        result_label.config(text=f"传统计算总金额: ${total_amount:.2f}\n耗时: {end_time - start_time:.6f} 秒")
    except Exception as e:
        result_label.config(text="错误: " + str(e))

def compute_total_amount_homomorphic():
    try:
        start_time = time.time()
        filename = "transaction_history.csv"

        cs = LightPHE(algorithm_name="Paillier")
        
        encrypted_values = []  

        with open(filename, 'r') as file:
            reader = csv.reader(file)
            next(reader)  
            for row in reader:
                if row[0] == 'Deposit':
                    # 将浮点数金额转为整数(乘以100,转为分)
                    amount_int = int(round(float(row[1]) * 100))
                    encrypted_amount = cs.encrypt(plaintext=amount_int)
                    encrypted_values.append(encrypted_amount)
        
        # 同态累加所有加密值
        total_encrypted_sum = encrypted_values[0]
        for encrypted_amount in encrypted_values[1:]:
            total_encrypted_sum += encrypted_amount
        
        # 解密总和并转换回浮点数
        total_sum_decrypted = cs.decrypt(total_encrypted_sum)
        total_amount = total_sum_decrypted / 100.0
        
        end_time = time.time()
        
        result_text = f"同态加密计算总金额: ${total_amount:.2f}\n耗时: {end_time - start_time:.6f} 秒"
        result_label.config(text=result_text)
    except Exception as e:
        result_label.config(text="错误: " + str(e))

generate_and_write_transactions("transaction_history.csv", 10)

root = tk.Tk()
root.title("银行账户测试")

root.geometry("400x300") 

compute_button = tk.Button(root, text="传统方式计算总金额", command=compute_total_amount)
compute_button.pack(pady=5)

compute_homomorphic_button = tk.Button(root, text="同态加密方式计算总金额", command=compute_total_amount_homomorphic)
compute_homomorphic_button.pack(pady=5)

result_label = tk.Label(root, text="")
result_label.pack()

root.mainloop()
关键修改说明
  • 加密前转换:将交易金额float(row[1])乘以100并转为整数,确保输入Paillier加密的是整数类型
  • 解密后还原:解密得到整数总和后,除以100.0恢复为原金额格式,并用round处理精度问题
  • 这样修改后,同态加密的计算结果会和传统计算结果一致,且能正常解密显示

内容的提问来源于stack exchange,提问作者Marian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:53:13