我在 Paillier 加密中獲得了一個非整數(浮點)私鑰
我正在嘗試使用此處提供的密鑰生成指南在 Matlab 中實現 Paillier 密碼系統:https ://en.wikipedia.org/wiki/Paillier_cryptosystem#Key_generation ,但問題是我嘗試使用任何素數組合,我獲取
mu
私鑰所需的浮點數。第一步是:
選擇兩個大素數 p 和 q
我選擇的只是一個起點
p = 17 and q = 19
。計算 $ {\displaystyle n=pq} $ 和 $ {\displaystyle \lambda =\operatorname {lcm} (p-1,q-1)} $ .
我在 Matlab 中使用:
n = p*q; lambda = lcm((p - 1), (q - 1));
這給了我
n = 323
和lambda = 144
第三步:
選擇隨機整數 $ {\displaystyle g} $ 在哪裡 $ g\in {\mathbb Z}_{{n^{{2}}}}^{{*}} $
我讀到它
g = n + 1
滿足所有要求的條件,所以我選擇了它,這給了我一個g = 324
.第四步,計算 $ {\displaystyle \mu} $ 使用:
$ {\displaystyle \mu =(L(g^{\lambda }{\bmod {n}}^{2}))^{-1}{\bmod {n}}} $
在哪裡, $ {\displaystyle L} $ 定義為 $ {\displaystyle L(x)={\frac {x-1}{n}}} $
我使用以下方法實現了這一點:
a = (powermod(g, lambda, n*n) - 1) / n; gMu = mod(inv(a),n);
所以在這個階段,公鑰應該是
(n,g) = (323,324)
,而私鑰應該是(lambda,mu)
我的情況(144,0.0069)
。為什麼我得到一個浮點值,
gMu
而我在網上看到的所有實現都提供了一個整數值的私鑰。我在哪裡弄錯了?
看起來你錯過了維基百科上的註釋:
請注意,符號 $ {\frac {a}{b}} $ 不表示模乘 $ a $ 乘以的模乘逆 $ b $ 而是商 $ a $ 除以 $ b $ ,即最大整數值 $ v\geq 0 $ 滿足關係 $ a\geq vb $ .
作為旁注,為了使密鑰生成更加簡單,您可能對 wikipedia 上的另一個註釋感興趣:
如果使用 $ p,q $ 等長,上述密鑰生成步驟的一個更簡單的變體是設置 $ g=n+1,\lambda =\varphi (n) $ , 和 $ \mu =\varphi (n)^{{-1}}{\bmod n} $ , 在哪裡 $ \varphi (n)=(p-1)(q-1) $ .