Public-Key

在 Paillier 同態中,你如何減法?

  • May 22, 2018

我正在嘗試學習同態,所以問題也可能在我的程式碼中(我將包括在內)。

我要計算 $ 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 主機上發現它很有趣。

引用自:https://crypto.stackexchange.com/questions/37324