同态加密计算银行交易总和时解密失败问题求助
问题根源
你遇到的解密失败问题,核心原因是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
相关产品推荐
相关产品推荐

