如何在 LightPHE 中正确解密同态加密后的浮点数总和

如何在 LightPHE 中正确解密同态加密后的浮点数总和

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]                         # 提取浮点值

应用到你的交易汇总逻辑中,只需修改两处关键代码:

  1. 加密阶段:将 float(row[1]) 包裹为 [float(row[1])]
  2. 解密阶段:从返回的列表中提取首个元素(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

上一篇 2026-07-01 17:26
怎样在ThinkPHP中实现用户会话Token自动续期【安全】
下一篇 2026-07-01 17:39

相关推荐