現在數據安全問題已經成為全領域全民關注的問題,國家層面也出臺了重量級的《數據安全法》向全行業表達國家對數據安全的重視。這其中個人信息保護領域逐步開始興起以隱私計算為核心的技術發展分支。包括同態加密技術,安全多方計算,差分隱私計算,聯邦學習等具體方向。它們都在不同場景下想達到不交換數據或者不交換明文數據的情況下依然進行業務計算。
這種模式是前沿創新的,試想,當一方擁有數據,但沒有可用算力,需要依賴另一方算力作業務支撐的情況下,如果有一種模式可以在只提供加密數據的情況下,對方依然可以處理通用計算得到正確結果,這是一件多么令人激動的事情。今天要分享的主題便是這里面的主角,同態加密。
這個方向的前沿研究者谷歌對這個體制用了一句話描述。
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,卻對過程封裝的比較厲害,沒有辦法讓人們感受整個翻譯轉換的過程。而這個過程對于同態加密的推廣和工程化又特別重要。作為上海觀安信息無限實驗的一員,我們就用這篇文章嘗試分析一下整體過程,給對同態加密感興趣的小伙伴以指導,大家一起為隱私計算作貢獻。
準備環境
下載工程構建工具 Bazel
最新版 gcc 編譯器 9.3
python 環境 3.7.3
以下就是實操過程。
下載源碼
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 的同態加密實現,它可以接收兩個加密后的數據,并且計算得到正常的結果。那么這中間都干了什么呢?可以繼續往下看。
核心步驟
如果上面構建成功,應該會生成三個工具(不同環境下中間臨時目錄不同),如下
transpiler (位置在bazel-out/k8-opt-exec-2B5CBBC6/bin/transpiler/transpiler,),這就是這個開源項目的核心,翻譯器。
xlscc (位置在 bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/contrib/xlscc/xlscc),xls 開源工程的核心工具
booleanify_main (位置在 bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/tools/booleanify_main)
opt_main (位置在 bazel-out/k8-opt-exec-2B5CBBC6/bin/external/com_google_xls/xls/tools/opt_main), 優化器
1.創建自己的代碼
在工程根目錄下創建 test 目錄, 在里面添加 test.cc 文件內容如下:
#pragma hls_top
int add2(int input) {
return input + 7;
}
2.生成中間文件
生成中間文件和元文件。
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
3.生同態加密代碼
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: 觀安信息無限實驗室
來源:FreeBuf.COM