TenSEAL 同态加密(密文传输)

网上对这个 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))

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值