在 Paillier 同態中,你如何減法?
我正在嘗試學習同態,所以問題也可能在我的程式碼中(我將包括在內)。
我要計算 $ a - b $ 在哪裡 $ a $ 然後更大 $ b $ . 為了做到這一點,我試圖計算 $ \frac{a}{b} $ . 但是,當我解密時,我得到了垃圾。或密文 $ c $ 不在 $ \mathbb{Z}^{*}_{n^2} $ .
現在因為問題也可能在我的程式碼中,所以它是:
import java.math.BigInteger; public class Main { public static void main(String[] args) throws Exception{ Paillier pp = new Paillier (2048); BigInteger a=pp.encrypt(BigInteger.valueOf(100000)); BigInteger b=pp.encrypt(BigInteger.valueOf(10000)); BigInteger c=a.divide(b); c=c.remainder(pp.getNsquare()); BigInteger res=pp.decrypt(c); System.out.println("res = "+ res); } }
我使用了這個庫
我也試著看看如果你相乘會發生什麼 $ b $ 和 $ -1 $ 但這只是給了我垃圾。有人知道怎麼做嗎?
到目前為止我試過
- $ c = \frac{a}{b} $ 這往往會導致 $ c=0 $ 並且無法檢索 $ c $
- $ c+2^{2047}=\frac{a \times 2^{2047}}{b} $ 這導致 $ c $ 是一個大數並且 $ c $ 是負數更大的數
- $ c+2^{2047}=\frac{a \times 2^{2047}}{b} $ 逆模 $ N^2 $ 這導致 $ c $ 是一個大數並且 $ c $ 是負數更大的數
- $ c+2^{2047}=\frac{a \times 2^{2047}}{b} $ 餘 $ N^2 $ 沒有解密。
這是我的程式碼中的問題還是我對加密的理解中的問題?
讓 $ c_a $ 是加密的版本 $ a $ , 和 $ c_b $ 是加密的版本 $ b $ . 你要計算的是 $ c_c $ 這是加密版本 $ a-b $ ,這樣當你解密時 $ c_c $ 你得到 $ c=a-b $ .
Paillier 支持密文的同態加法以獲得總和的加密版本。得到這個的實際數學運算是模乘法。換句話說,密文域中的乘法導致明文域中的加法。
Paillier 還支持密文值和明文值的乘法。這是通過模冪運算來實現的。
要在這裡實現你想要的,你需要否定 $ c_b $ 乘以 $ -1 $ 在密文域中。為了實現這個操作(一個加密的否定 $ b $ , 只給定加密 $ b $ , $ c_b $ ),你會做 $ c_b^{-1}\bmod{n^2} $ . 這會給你一個加密 $ -b $ . 您將該值同態地添加到 $ c_a $ (這是通過密文上的模乘來實現的)得到 $ c_c $ .
在我編寫的庫中,我有一個 Paillier 減法範例。我還在 Paillier 中寫了一篇關於負數的文章,你可能會在舊的 Google Code 主機上發現它很有趣。