网上对这个 TenSEAL 的介绍很多,但我居然没找到一个比较有用的密文传输的方法,最后没办法只能去官网看英文教程,现在整理出来给有需要的小伙伴(当然,最好还是去看官网的教程,虽然是英文,但全面一点)。
官网链接:
GitHub - OpenMined/TenSEAL: A library for doing homomorphic encryption operations on tensors
Context 序列化和反序列化
import tenseal as ts
# Context 生成与分发(密钥都在 Context 里面)
# 分发过程需要序列化操作
class TensealKeyManage:
def __init__(self):
self.ckks_context = ts.context(ts.SCHEME_TYPE.CKKS, 8192, coeff_mod_bit_sizes=[22, 21, 21, 21, 21, 21, 21, 21, 21, 21])
self.ckks_context.global_scale = pow(2, 21)
self.ckks_context.generate_galois_keys()
self.ckks_context.generate_relin_keys()
self.bfv_context = ts.context(ts.SCHEME_TYPE.BFV, 4096, plain_modulus=1032193)
# 分发 CKKS 公钥
def get_ckks_publicKey(self) -> bytes:
return self.ckks_context.serialize(save_public_key=True,
save_secret_key=False,
save_relin_keys=True,
save_galois_keys=True)
# 分发 CKKS 所有密钥
def get_ckks_secretKey(self) -> bytes:
return self.ckks_context.serialize(save_public_key=True,
save_secret_key=True,
save_relin_keys=True,
save_galois_keys=True)
# 分发 BFV 公钥
def get_bfv_publicKey(self) -> bytes:
return self.bfv_context.serialize(save_public_key=True,
save_secret_key=False,
save_relin_keys=True,
save_galois_keys=True)
# 分发 BFV 所有密钥
def get_bfv_secretKey(self) -> bytes:
return self.bfv_context.serialize(save_public_key=True,
save_secret_key=True,
save_relin_keys=True,
save_galois_keys=True)
if __name__ == '__main__':
# 密钥管理器
keyManage = TensealKeyManage()
# 获取公钥 Context 并反序列化
ckks_context_public = ts.context_from(keyManage.get_ckks_publicKey())
bfv_context_public = ts.context_from(keyManage.get_bfv_publicKey())
CipherText 序列化和反序列化
import tenseal as ts
import numpy as np
class TensealCryptor:
def __init__(self, ckks_context_ser):
# CKKS 加密设置
self.ckks_context = ts.context_from(ckks_context_ser)
# 加密并序列化
def CkksEncrypt(self, np_vector) -> bytes:
return ts.ckks_tensor(self.ckks_context, np_vector).serialize()
# 反序列化并解密
def CkksDecrypt(self, enc_ser: bytes):
ckks_enc = ts.ckks_tensor_from(self.ckks_context, enc_ser)
return np.array(ckks_enc.decrypt().tolist())
if __name__ == '__main__':
keyManage = TensealKeyManage()
cryptor = TensealCryptor(keyManage.get_ckks_secretKey())
b = np.array([0, 0, 0])
enc_b_ser = cryptor.CkksEncrypt(b)
print(enc_b_ser)
print(cryptor.CkksDecrypt(enc_b_ser))