パラメータを決め打つかどうかなどで復号処理が一般化されていたりされていなかったりで難しい
鍵生成
秘密鍵
公開鍵
- where
暗号化
- 乱数 を持ってきて、
復号
- まず、
途中で
の拡張
(ただし
と
を用いている
これを利用して、復号は
paillier暗号は加法準同型性を持つ。すなわち以下が成り立つ
from Crypto.Util.number import getPrime, getRandomRange, inverse def encrypt_paillier(m: int, g: int, n: int): r = getRandomRange(2, n) return pow(g, m, n**2) * pow(r, n, n**2) % (n**2) def decrypt_paillier(c, p, q, g): phi = (p-1)*(q-1) mu = inverse(phi, n) k = (g - 1) // n return ((pow(c, phi, n**2) - 1) // n) * inverse(k, n) * mu % n p = getPrime(512) q = getPrime(512) n = p * q g = 2*n + 1 m = getRandomRange(2, n) c2 = encrypt_paillier(m, g, n) assert decrypt_paillier(c2, p, q, g) == m