如何用pi-heaan库在Python中加密自定义向量(含NumPy数组)
解决pi-heaan中自定义向量/NumPy数组的加密问题
问题背景
使用pi-heaan库时,现有示例通过循环赋值i+1生成向量并加密正常,但尝试直接传入普通列表触发TypeError,错误的循环赋值方式得到不符合预期的输出,需要实现对自定义向量(如[2,5,4,3])及NumPy数组的加密。
错误原因分析
- TypeError原因:
Encryptor.encrypt()仅接受piheaan.Message或piheaan.Plaintext类型作为明文输入,普通Python列表无法直接传入。 - 错误赋值的问题:错误写法
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
相关产品推荐
相关产品推荐

