TenSEAL: 一个使用同态加密的加密张量运算库
1 介绍
在本文中,我们介绍 TenSEAL,这是一个支持同态加密隐私保护机器学习的python开源库,该库可以很容易地集成到现在流行的机器学习框架中。TenSEAL用于使用同态加密进行加密张量计算。该库可以直接将来自流行机器学习框架(如 PyTorch 或 Tensorflow)的张量转换为其加密版本。本文首先介绍了TenSEAL的核心组件,然后简要介绍其支持的运算操作及其实现方法,最后介绍该库的安装及其代码样例。
2 核心组件
TenSEAL 底层通过 Microsoft SEAL 中的 CKKS来实现同态加密的计算。它隐藏了对加密数据实现张量操作的复杂过程。用户可以使用C++或者python来处理纯张量或加密张量。TenSEAL的实现包括三个核心组件:context、明文张量以及密文张量。
context: 这是TenSEAL库的核心组件,它存储了同态加密的密钥。context组件中包括用于加密的公钥、用于解密的私钥、用于密文态矩阵旋转的伽罗瓦密钥以及用于密文重线性化的重线性化密钥。 PlainTensor: PlainTensor 是一个明文张量,同时也是将流行机器学习框架的张量转换为加密张量的桥梁。下图描述了张量转换的过程。
EncryptedTensor: 接口EncryptedTensor下有两个派生类:CKKSVector 以及 CKKSTensor。下图展现了密文张量之间的关系。
CKKSVector派生自EncryptedVector 接口,其存储的是明文向量加密成的单个密文。 CKKSTensor存储的是将N维明文张量加密成的N维密文张量。
3 运算操作
在机器学习与深度学习中,点积、矩阵相乘、卷积等是常用的计算操作。TenSEAL库也实现了对这些操作的支持。加密张量支持的计算操作如下表所示。下面主要针对点积以及2维卷积操作的实现进行介绍。
3.1 点积运算
TenSEAL使用Halevi 和 Shoup (2014)提出的方案实现了加密向量和明文矩阵之间的点积运算。因此,它也可以拓展为支持加密矩阵与明文矩阵之间的点积运算,也就是矩阵乘法运算。下图展示了如何实现加密向量与明文矩阵之间的点积运算。
3.2 二维卷积操作
TenSEAL与目前流行的机器学习框架一样,支持卷积操作。二维卷积操作的实现分为三步,首先是矩阵重组转为列表示,第二步是加密矩阵编码并与卷积核相乘,第三步是列旋转并累加求和。
矩阵重组转为列表示:TenSEAL使用Johnson等提出的方法将图像块转换成列(img2col方法)。TenSEAL首先将输入矩阵重新组织,转换为卷积窗口行的表示形式。然后与展平的卷积核执行点积(如下图四所示)。需要注意的是,这个重组矩阵操作是在数据加密之前进行的。
加密矩阵编码并与卷积核相乘:本文方案会将矩阵元素按列编排,同时会重复堆叠卷积核的元素,然后进行内积运算。
列旋转并累加:编排后的加密矩阵会通过左移到对应的位置进行逐元素求和。如下图所示,左移动后A1和A3求和,B1和B31求和。继续左移,迭代这个过程,最终得到求和后的A、B、C、D的值。
4 安装使用
下面介绍TenSEAL的安装与使用,更详细的教程可以参考TenSEAL的github仓库(链接:[https://github.com/OpenMined/TenSEAL#tutorials])
4.1 安装pip 安装
使用包管理工具pip可以快速安装TenSEAL。
$ pip install tenseal
最低平台要求:
Linux: A modern version of GNU G++ (>= 6.0) or Clang++ (>= 5.0). MacOS: Xcode toolchain (>= 9.3) Windows: Microsoft Visual Studio (>= 10.0.40219.1, Visual Studio 2010 SP1 or later).
从github导入源码并进行模块设置
$ git clone https://github.com/OpenMined/TenSEAL.git
$ git submodule init
$ git submodule update
在根目录执行安装
$ pip install .
4.2 使用
以下展示了TenSEAL对加密数据的基本运算操作,更多进阶的计算操作可以查看官方使用教程[https://github.com/OpenMined/TenSEAL/blob/main/tutorials%2FTutorial%200%20-%20Getting%20Started.ipynb]
import tenseal as ts
# Setup TenSEAL context
context = ts.context(
ts.SCHEME_TYPE.CKKS,
poly_modulus_degree=8192,
coeff_mod_bit_sizes=[60, 40, 40, 60]
)
context.generate_galois_keys()
context.global_scale = 2**40
v1 = [0, 1, 2, 3, 4]
v2 = [4, 3, 2, 1, 0]
# encrypted vectors
enc_v1 = ts.ckks_vector(context, v1)
enc_v2 = ts.ckks_vector(context, v2)
result = enc_v1 + enc_v2
result.decrypt() # ~ [4, 4, 4, 4, 4]
result = enc_v1.dot(enc_v2)
result.decrypt() # ~ [10]
matrix = [
[73, 0.5, 8],
[81, -5, 66],
[-100, -78, -2],
[0, 9, 17],
[69, 11 , 10],
]
result = enc_v1.matmul(matrix)
result.decrypt() # ~ [157, -90, 153
5 参考文献
[1] TenSEAL: A Library for Encrypted Tensor Operations Using Homomorphic Encryption
[2] Homomorphic encryption for arithmetic of approximate numbers. In International Conference on the Theory and Application of Cryptology and Information Security
[3] Shai Halevi and Victor Shoup. Algorithms in helib.
[4] Justin Johnson, Fei-Fei Li, and Andrej Karpathy. Cnns in practice. convolutional neural networks for visual recognitio. 2016.
译者简介:
庄智廉:重庆大学大数据与软件学院一年级研究生。主要研究兴趣包括隐私保护机器学习、联邦学习。语雀:阿柴 。知乎:acai
往期内容推荐:
一个好用的多方隐私求交算法库MultipartyPSI-Pro
Secret-shared Shuffle—秘密共享下的洗牌协议
欢迎投稿
邮箱:pet@openmpc.com
参与更多讨论,请添加小编微信加入交流群