现在数据安全问题已经成为全领域全民关注的问题,国家层面也出台了重量级的《数据安全法》向全行业表达国家对数据安全的重视。这其中个人信息保护领域逐步开始兴起以隐私计算为核心的技术发展分支。包括同态加密技术,安全多方计算,差分隐私计算,联邦学习等具体方向。它们都在不同场景下想达到不交换数据或者不交换明文数据的情况下依然进行业务计算。这种模式是前沿创新的,试想,当一方拥有数据,但没有可用算力,需要依赖另一方算力作业务支撑的情况下,如果有一种模式可以在只提供加密数据的情况下,对方依然可以处理通用计算得到正确结果,这是一件多么令人激动的事情。今天要分享的主题便是这里面的主角,同态加密。
这个方向的前沿研究者谷歌对这个体制用了一句话描述。
Fully homomorphic encryption (FHE) is an encryption scheme which enables computation on en-
crypted data without revealing the underlying data.
含义同上文,FHE 就是一种让我们可以在加密数据上计算,而不用关心具体原始数据是什么的加密体制。这篇文章不会从同态加密的原理上去剖析同态加密算法的基本原理以及发展,因为这需要广泛的密码学,高等代数,布尔代数,门电路等领域知识。并且我认为做技术阶段性快速的成果反馈也有利于技术从业者能够保持不断探索的乐趣。所以本文旨在尝试从谷歌不久前开源的 FHE 源码工程,并通过实际可运行的操作来让大家体验一下,同态加密是怎么工作的。注意这种方式可能会给大家把同态加密引入自己的技术框架中提供非常好的指导。
谷歌在 2021 年 6 月 15 号开源了一个项目 “Fully Homomorphic Encryption”,很多人误以为它是一个同态加密的开源实现。也应该有一部分个人或者团队尝试编译探索。但其实它是一个可以把 C++ 代码转换为同态加密算法的翻译器。它是基于谷哥 XLS 项目以及 TFHE 项目的,而后者才是核心。后面有机会可以逐步对这两个工程作分享。这个项目的文档非常少,虽然有可供演示的样例和 DEMO,却对过程封装的比较厉害,没有办法让人们感受整个翻译转换的过程。而这个过程对于同态加密的推广和工程化又特别重要。作为上海观安信息无限实验的一员,我们就用这篇文章尝试分析一下整体过程,给对同态加密感兴趣的小伙伴以指导,大家一起为隐私计算作贡献。
以下就是实操过程。
git clone https://github.com/google/fully-homomorphic-encryption.git
# 进入主目录
cd fully-homomorphic-encryption
# 使用 bazel 构建一个示例,这个示例演示了简单的加法计算
bazel run //transpiler/examples/simple_sum:simple_sum_tfhe_testbench
此时应该会有如下输出
inputs are 4052 and 913, sum: 4965
Encryption done
Initial state check by decryption:
4052 913
Server side computation:
Computation done
Decrypted result: 4965
Decryption done
上面就演示了一个简单的加法的同态加密算法实现,如果看源码可以发现,原来的 simple_sum.cc 就是一个普通的加法函数。
#include "simple_sum.h"
#pragma hls_top
int simple_sum(int a, int b) { return a + b; }
这个示例生成了一个新的代码文件 simple_sum ,新的实现文件就是 simple_sum 的同态加密实现,它可以接收两个加密后的数据,并且计算得到正常的结果。那么这中间都干了什么呢?可以继续往下看。
如果上面构建成功,应该会生成三个工具(不同环境下中间临时目录不同),如下
在工程根目录下创建 test 目录, 在里面添加 test.cc 文件内容如下:
#pragma hls_top
int add2(int input) {
return input + 7;
}
生成中间文件和元文件。
bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/contrib/xlscc/xlscc test/test.cc > test/test.ir --meta_out test/test_meta.proto
bazel-out/k8-opt-exec-2B5CBBC6/bin/transpiler/transpiler -ir_path ./test/test.ir -metadata_path ./test/test_meta.proto -cc_path ./test/test_tfhe.cc -header_path ./test/test_tfhe.h -opt_main_path bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/tools/opt_main -booleanify_main_path bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/tools/booleanify_main
此时 test 目录下就有了如下文件:
-rw-r--r--. 1 root root 60 Jun 22 08:40 test.cc
-rw-r--r--. 1 root root 337 Jun 22 08:45 test.ir
-rw-r--r--. 1 root root 53 Jun 22 08:45 test_meta.proto
-rw-r--r--. 1 root root 79488 Jun 22 08:49 test_tfhe.cc
-rw-r--r--. 1 root root 251 Jun 22 08:49 test_tfhe.h
其中 test_tfhe.h 和 test_tfhe.cc 就是 test.cc 中的加法运算生成的对应的同态加密算法。我们可以把这两个文件当作源文件调用到我们工程中实现同态加密实现。当然它会依赖 tfhe 库。
做到这一步,我们就应该知道谷歌开源的这个工程是什么了,它其实是一个翻译器,依赖于 xlscc 生成的中间文件,然后利用优化器等其它工具集,以及自身实现的代码翻译,把它转换成一个同态加密算法。虽然感觉只是做了一个转义,但对工程上的意义是非凡的,它让我们可以在没有深厚密码学背景的情况下可以把同态加密工程化进我们的产品,提供隐私计算能力。
有人可能会觉得,这只是实现了简单的算法,但如何利用呢。其实有了这些,我们就可以编写自己的原始 C++ 算法,这些算法可以被嵌入到更加复杂的业务计算中或者分布式计算引擎中提供原始的算子能力,而这些算子由于实现了同态加密算法,就便利整体体系有了同态加密的计算能力。至于利于的能力有多大,完全依赖于技术人员自己对技术的理解。
From: 观安信息无限实验室