在這篇文章中,我們将了解同态加密的基本概念,介紹常用的同态加密開發庫,學習同态加密應用開發的一般步驟,了解如何在Web應用中添加同态加密支援。
區塊鍊開發教程連結: 以太坊 | 比特币 EOS Tendermint Hyperledger Fabric Omni/USDT Ripple
1、同态加密概述
同态加密改變了隐私保護的遊戲規則,它允許直接操作加密資料而無需先進行解密。這一概念可以追溯到RSA加密 —— RSA也具備有限的同态加密功能。不過同态加密很長時間都局限在學術界,直到2009年Craig Gentry的論文發表後,才湧現了大量的同态加密庫。
現在已經有很多可用的同态加密庫了。下面列出了一些比較流行的同态加密開發包以及它們支援的方案類型,當然這個清單是不完整的:
- Microsoft SEAL: BFV, CKKS (C++)
- HElib: BGV (with GHS), CKKS (C++)
- PALISADE: BFV, BGV, CKKS, FHEW (C++)
- TFHE: Ring-variant of GSW (C++)
- HEAAN: CKKS (with bootstrapping) (C++)
為你的web'應用找到合适的同态加密開發包以及方案類型需要進行大量的研究工作:
- 這些不同的同态加密實作代碼有什麼差別?
- 安裝這些同态加密開發包需要什麼依賴?
- 我如何在自己的web應用中使用同态加密庫?
- 一個加密方案對性能有什麼影響?
- 這個加密方案對資料有什麼特殊的要求?
- 什麼是自舉?為什麼我需要這個環節?
在你開始設計一個隐私保護的應用之前,有些問題就需要先找出答案。
在這個教程裡,讓我們從微軟的SEAL開始介紹,因為SEAL的文檔非常好。
2、使用Microsfot SEAL同态加密庫
讓我們先看看如何加密資料。首先你可以将一個數組(或者c++裡的vector)編碼為特定格式的平文本,然後再将平文本加密成密文。同态處理是在密文上進行的。為了讀取處理結果,你需要解密然後再解碼。
上述過程的僞代碼如下:
const arr = [1,2,3...]
const plain = encode(arr)
const cipher = encrypt(plain)
// Add the cipher to itself - element wise
evaluate.add(cipher, cipher)
const decrypted = decrypt(cipher)
const decoded = decode(decrypted)
// `decoded` contains [2,4,6, ...]
上面的代碼我進行了簡化,實際上這之前還有一些必要的步驟。
下面是SEAL同态加密庫的一些基本資訊。
第三方依賴
SEAL沒有必須的第三方依賴。可選的依賴包括:
zlib和
Microsoft GSL支援的方案
- BFV:操作有符号/無符号整數
- CKKS:操作浮點數
基本的差别和限制
- BFV:密文的資料容量由加密參數決定,數組中每個元素的上下界也是參數決定的
- CKKS:數組中的每個成員的取值範圍更大,但是密文容量相比BFV減半。而且CKKS 隻能進行近似計算
自舉(Bootstrapping)允許在加密資料上進行無限的同态處理。沒有自舉的話,隻能執行有限次數的
同态處理(例如乘法等)。目前SEAL同态加密庫還不支援自舉,但是已經有計劃為CKKS方案添加自舉支援。自舉會對性能有很大的影響,在很多情況下你在使用同态算法時都不需要自舉。
沒有自舉的同态算法被稱為層級化算法。分層的數量(也就是可以執行多少次同态處理)是由你選擇的加密參數來決定的。
3、選擇同态加密方案
第一步是為你的應用選擇一個合适的同态加密方案。你是需要整數還是可以容忍一定的誤差?當你需要絕對精度時應該使用BFV方案。CKKS有它的優勢,但是會在解密時引入一定的誤差 —— 雖然通過調整參數可以讓誤差減小到可以接受的範圍,但是對于新手來說這是有難度的。
4、選擇合适的同态加密參數
一旦你選好了同态加密方案,下面就需要确定算法的參數了。這個問題應該是最難回答的,因為它取決于很多因素。此外還有更多的問題,例如:
- 如何測試那些參數有效?
- 是否還有優化的空間?
- 是否需要為每一組參數都建構一個新的測試應用?
下面是我們的同态加密實用方法學:
- 選擇同态加密方案:我認為BFV要比CKKS更容易商收。至少當解密結果不正确時 你可以立刻判斷有問題
- 從128位加密層級開始:雖然有更高的可選項,但是代價是縮減的同态加密操作- 能工作就好:從一個中等層級的PolyModulusDegree (4096)開始,然後逐漸增加 直到不能成功解密。再反向逐漸減小至不能成功解密。用這樣的辦法得到上下界。
- 細調:修改CoeffModulus的位數,使用模數轉換或CKKS的重縮放。
5、使用Node-Seal為web應用增加同态加密支援
作為替代的方案,我建議你通過快速實驗來找出适合你的應用的參數。為此我開發了一個開源軟體
node-seal,以便在JavaScript中實用SEAL同态加密庫。你可以利用這個軟體快速編寫一個JavaScript測試應用來進行參數實驗。node-seal的核心采用webassembly,可以運作在Node.js或現代浏覽器中,已經包含了zlib支援,不需要進行本地編譯。
原文連結:
同态加密應用開發入門 — 彙智網