TenSEAL库介绍:如何开始同态加密

TenSEAL库:

TensSEAL是一个python的第三方库,是一个方便的同态加密库。他并不是一个原生库,而是Microsoft SEAL(一个C++库)的python接口。实现了BFV和CKKS两种同态加密算法,可以直接对tensor进行加密,隐藏了很多具体细节,可以很容易上手编写同态加密的代码。是一款新手友好性的同态加密库。

库的安装是比较简单的,可以用以下命令简单安装:

pip install tenseal

这是他的github上的地址github官网

公钥与私钥

由于TenSEAL库实现的是公钥加密算法,所以这一小节简单介绍以下公钥加密的思想。

加密呢,就是对一个消息也叫明文,比如m=1,进行某种变换,成为一个无法识别的随机数c,我们把这个随机数c叫做密文。可以用一个函数表示加密过程,其中表示密钥。将密文还原为明文的操作叫做解密,可以用表示。

时,也就是加密和解密使用的密钥是相同的,这种加密方案是对称加密,也叫做私钥密码体制。这个密钥只能由加密方和解密方知道,为了保证明文不被泄露,密钥不能透露给其他人。

然而这种方法在很多时候使用起来并不是特别方便,尤其是加密的双方需要协商一个共同的私钥。而且,有时候,有很多人都是加密者,但是解密的只能是特定的人。比如要收集员工的一些个人信息,这些个人信息只希望被老板知道,而不愿让其他员工也知道。这时公钥密码体制就可以发挥作用了。

公钥密码体制有两个不同的密钥,公钥pk和私钥sk,其中公钥pk用来进行加密,sk用来解密。加密的公钥可以公开,使得每个人都可以加密,但是只有拥有私钥的人才能解密。

这就是公钥和私钥密码的简单的理解。

下面我们来看如何用TenSEAL生成公私钥(以BFV的为例)。

import tenseal as ts

ctx=ts.context(ts.SCHEME_TYPE.BFV,poly_modulus_degree=4096,plain_modulus=1032193)
if ctx.is_private():
    print("This context is private!")
if ctx.is_public():
    print("This context is public!")

TenSEAL中定义了一个context的对象用于封装加解密所需要的参数,里面包含了密钥。在导入tenseal包之后,就可以实例化一个context对象,输入需要的参数来生成公钥和私钥了。

但是,值得注意的是,在context的初始化时,公钥和私钥都是放在context对象里面的。也就是这时的context是私有的。

如果我们需要将这个产生的公钥发布出去,那么,要做的第一件事情就是将私钥分离。下面这段代码展示了如何提取私钥并将私钥从context对象中删掉。

sk=ctx.secret_key()
ctx.make_context_public()
if ctx.is_private():
    print("This context is private!")
if ctx.is_public():
    print("This context is public!")

这时候的context就是public的,可以将他公开了。这样子,别人就可以通过这个context来加密。

BFV加解密的简单演示

在得到了context之后,就可以进行加密了。

m1=[1,2,3,4,5]
m2=[5,4,3,2,1]

c1=ts.bfv_vector(ctx,m1)
c2=ts.bfv_vector(ctx,m2)

print("m1 is ",c1.decrypt(sk))
print("m2 is ",c2.decrypt(sk))

在TenSEAL中的加密,并不是直接提供加密函数,而是使用bfv_vector这样含有加密方案名称的方法。他将编码和加密结合到了一起,我只需要传入需要加密的明文就可以了。同时加密是需要提供公钥的,也就是我们生成的那个context对象。

在加密完成后,得到的是一个密文对象,里面包含了公钥等信息。需要解密的话,可以调用密文对象的decrypt方法。解密时,需要传入私钥sk。

当然,如果你在加密时使用的context中含有私钥,那么解密的时候可以不用传入私钥。当加密时使用的公钥和解密传入的私钥不一致的时候,显然就会失败。我想这也是密文对象里面包含公钥的原因之一。

我们加密了两个明文向量,接下来展示一下BFV支持的同态运算。

#homomorphic addition
c3=c1+c2
print("The sum is ",c3.decrypt(sk))

#homomorphic scale
c4=2*c1
print("2 times of m1 is ",c4.decrypt(sk))

#homomorphic multiplication
c5=c1*c2
print("The product is ",c5.decrypt(sk))

接下来就可以开始你的愉快的同态探索之旅啦!

下面是演示的完整代码:

import tenseal as ts

ctx=ts.context(ts.SCHEME_TYPE.BFV,poly_modulus_degree=4096,plain_modulus=1032193)
if ctx.is_private():
    print("This context is private!")
if ctx.is_public():
    print("This context is public!")
    
sk=ctx.secret_key()
ctx.make_context_public()
if ctx.is_private():
    print("This context is private!")
if ctx.is_public():
    print("This context is public!")

m1=[1,2,3,4,5]
m2=[5,4,3,2,1]

c1=ts.bfv_vector(ctx,m1)
c2=ts.bfv_vector(ctx,m2)

print("m1 is ",c1.decrypt(sk))
print("m2 is ",c2.decrypt(sk))

#homomorphic addition
c3=c1+c2
print("The sum is ",c3.decrypt(sk))

#homomorphic scale
c4=2*c1
print("2 times of m1 is ",c4.decrypt(sk))

#homomorphic multiplication
c5=c1*c2
print("The product is ",c5.decrypt(sk))
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TensSEAL是一个方便的同态加密,它是Microsoft SEAL的Python接口。它实现了BFV和CKKS两种同态加密算法,并提供了对张量进行加密的功能。使用TensSEAL,你可以隐藏很多具体细节,轻松编写同态加密的代码。它是一款适合新手的同态加密。\[1\] 在TensSEAL中,加密不是直接提供加密函数,而是使用包含加密方案名称的方法,例如bfv_vector。你只需要传入需要加密的明文即可。同时,加密需要提供公钥,也就是生成的上下文对象。\[2\] 上下文对象在TensSEAL中相当于对CKKS的密钥和其他参数进行了封装。在编码、加密、加法、乘法和解密的过程中,只需要将上下文作为参数传入即可。\[3\] 以下是一个使用TensSEAL进行同态加密的Python代码示例: ```python import tenseal as ts import numpy as np def gencontext(): context = ts.context(ts.SCHEME_TYPE.CKKS, 8192, coeff_mod_bit_sizes=\[22, 21, 21, 21, 21, 21, 21, 21, 21, 21\]) context.global_scale = pow(2, 21) context.generate_galois_keys() return context def encrypt(context, np_tensor): return ts.ckks_tensor(context, np_tensor) def decrypt(enc_tensor): return np.array(enc_tensor.decrypt().tolist()) def bootstrap(context, tensor): # 刷新已经用尽深度的张量 # 这里 bootstrap = enc(dec()) tmp = decrypt(tensor) return encrypt(context, tmp) if __name__ == "__main__": a = np.array(\[\[1., 2., 3., 4.\], \[1., 2., 5., 4.\]\]) context = gencontext() enc_a = encrypt(context, a) enc_at = encrypt(context, a.T) enc_b = encrypt(context, a) res = enc_a + enc_b # res = enc_a - enc_b # res = enc_a * enc_b # res = enc_a @ enc_at print(decrypt(res)) ``` 这段代码演示了如何使用TensSEAL进行同态加密。首先,我们生成一个上下文对象,然后使用该上下文对象对张量进行加密。最后,我们可以进行加法、减法、乘法和矩阵乘法等操作,并通过解密函数将结果解密。\[1\] #### 引用[.reference_title] - *1* *2* [TenSEAL介绍:如何开始同态加密](https://blog.csdn.net/watqw/article/details/129539757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [同态加密:CKKS方案详解及一个python实现:TenSEAL](https://blog.csdn.net/weixin_43466027/article/details/118792866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值