
lightphe 的 paillier 实现默认将浮点数转为整数处理,导致解密结果失真;需通过列表封装浮点数或启用张量模式保留小数精度,才能获得准确的解密总和。
lightphe 的 paillier 实现默认将浮点数转为整数处理,导致解密结果失真;需通过列表封装浮点数或启用张量模式保留小数精度,才能获得准确的解密总和。
在使用 LightPHE 进行同态加法(如银行交易总额计算)时,一个常见误区是直接对 float 类型金额调用 cs.encrypt(plaintext=float_value)。Paillier 方案本身仅支持整数运算,LightPHE 会自动将浮点数截断为整数(如 42.99 → 42),造成精度丢失——这正是你观察到“总和始终加密且解密后数值错误”的根本原因。
✅ 正确做法:用列表包装浮点数,启用浮点语义
LightPHE 提供了简洁的绕过机制:将浮点数放入单元素列表中加密,系统会将其视为标量张量(scalar tensor),跳过整数转换,完整保留小数位:
from lightphe import LightPHE cs = LightPHE(algorithm_name="Paillier") # ✅ 正确:以列表形式传入浮点数 amount = 123.45 ciphertext = cs.encrypt(plaintext=[amount]) # 注意:[amount],不是 amount decrypted = cs.decrypt(ciphertext) # 返回 [123.45] total = decrypted[0] # 提取浮点值
应用到你的交易汇总逻辑中,只需修改两处关键代码:
- 加密阶段:将 float(row[1]) 包裹为 [float(row[1])]
- 解密阶段:从返回的列表中提取首个元素(cs.decrypt(…)[0])
修正后的 compute_total_amount_homomorphic() 核心片段如下:
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) # skip header
for row in reader:
if row[0] == 'Deposit':
# ✅ 关键修改:用列表包装浮点数
plain_float = float(row[1])
encrypted_amount = cs.encrypt(plaintext=[plain_float])
encrypted_values.append(encrypted_amount)
# 同态累加(支持列表形式的浮点密文)
total_encrypted_sum = encrypted_values[0]
for enc in encrypted_values[1:]:
total_encrypted_sum += enc
# ✅ 关键修改:解密后取 [0] 获取原始浮点值
total_decrypted = cs.decrypt(total_encrypted_sum)[0] # ← 注意此处
end_time = time.time()
result_label.config(
text=f"Total amount (homomorphic): ${total_decrypted:.2f}\n"
f"Time taken: {end_time - start_time:.6f} seconds"
)
except Exception as e:
result_label.config(text="Error: " + str(e))
⚠️ 注意事项与最佳实践
- 不要依赖自动浮点转换:cs.encrypt(12.34) 等价于 cs.encrypt(12),永远丢失小数部分。
- 精度控制建议:若需更高精度(如分币级),可先将金额乘以 100 转为整数 cents 加密,解密后再除以 100.0 —— 这种整数方案更稳健,适合金融场景。
- 性能权衡:列表包装方式虽方便,但底层仍基于整数模幂运算;大量交易时建议批量加密或预生成密钥提升效率。
- 验证必要性:每次部署前,务必用已知数据(如 [10.5, 20.75])手动验证加密→同态加→解密全流程输出是否等于 31.25。
通过这一调整,你的同态加密总和不仅能成功解密,还能精确还原至原始浮点精度,真正满足银行级数据处理需求。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/124109.html