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

如何用pi-heaan库在Python中加密自定义向量(含NumPy数组)

解决pi-heaan中自定义向量/NumPy数组的加密问题

问题背景

使用pi-heaan库时,现有示例通过循环赋值i+1生成向量并加密正常,但尝试直接传入普通列表触发TypeError,错误的循环赋值方式得到不符合预期的输出,需要实现对自定义向量(如[2,5,4,3])及NumPy数组的加密。

错误原因分析

  1. TypeError原因:Encryptor.encrypt()仅接受piheaan.Message或piheaan.Plaintext类型作为明文输入,普通Python列表无法直接传入。
  2. 错误赋值的问题:错误写法for i in [2,5,4,3]: msg[i] = i中,循环变量i是向量的值而非索引,导致给错误的索引位置赋值(如i=2时给索引2赋值2,i=5超出当前4个槽的索引范围,赋值无效),最终解密结果不符合预期。

正确实现方法

方法1:将普通自定义向量转为piheaan.Message

先创建对应槽数的Message对象,通过索引遍历自定义向量完成赋值:

import piheaan as heaan

# 初始化上下文、密钥等(和原示例一致)
params = heaan.ParameterPreset.SS7
context = heaan.make_context(params)

key_dir_path = "./keys"
sk = heaan.SecretKey(context)
keygen = heaan.KeyGenerator(context, sk)
keygen.gen_common_keys()
pack = keygen.keypack

enc = heaan.Encryptor(context)
eval = heaan.HomEvaluator(context, pack)
dec = heaan.Decryptor(context)

# 自定义向量处理
custom_vector = [2,5,4,3]
log_slots = 2  # 槽数为2^2=4,需和向量长度一致
msg = heaan.Message(log_slots)

# 按索引赋值
for idx, val in enumerate(custom_vector):
    msg[idx] = val

# 加密、运算、解密
ctxt = heaan.Ciphertext(context)
enc.encrypt(msg, pack, ctxt)

ctxt_out = heaan.Ciphertext(context)
eval.mult(ctxt, ctxt, ctxt_out)

msg_out = heaan.Message()
dec.decrypt(ctxt_out, sk, msg_out)

print(msg_out)
# 预期输出:[ (4.000000+0.000000j), (25.000000+0.000000j), (16.000000+0.000000j), (9.000000+0.000000j) ]

方法2:加密NumPy数组形式的向量

只需遍历NumPy数组的索引和值,完成Message对象的赋值即可:

import piheaan as heaan
import numpy as np

# 初始化上下文、密钥等(同上)
params = heaan.ParameterPreset.SS7
context = heaan.make_context(params)

key_dir_path = "./keys"
sk = heaan.SecretKey(context)
keygen = heaan.KeyGenerator(context, sk)
keygen.gen_common_keys()
pack = keygen.keypack

enc = heaan.Encryptor(context)
eval = heaan.HomEvaluator(context, pack)
dec = heaan.Decryptor(context)

# NumPy向量处理
np_vector = np.array([2,5,4,3], dtype=np.float64)
log_slots = 2
msg = heaan.Message(log_slots)

# 遍历数组赋值
for idx in range(len(np_vector)):
    msg[idx] = np_vector[idx]

# 加密、运算、解密
ctxt = heaan.Ciphertext(context)
enc.encrypt(msg, pack, ctxt)

ctxt_out = heaan.Ciphertext(context)
eval.mult(ctxt, ctxt, ctxt_out)

msg_out = heaan.Message()
dec.decrypt(ctxt_out, sk, msg_out)

print(msg_out)
# 预期输出:[ (4.000000+0.000000j), (25.000000+0.000000j), (16.000000+0.000000j), (9.000000+0.000000j) ]

关键注意事项

  • 自定义向量/NumPy数组的长度必须等于2^log_slots,否则会出现索引越界或数据丢失的问题。
  • 若向量长度不足,可根据需求补零至最近的2^n长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:22:50