同态加密攻击面(Paillier/FHE 噪声)
考点概念
同态加密允许在密文上直接运算,Paillier 是典型加法同态:E(m1)·E(m2) 解密m1+m2,
常考验证同态性质或利用密文运算结果反推明文。
FHE 的噪声随运算增长,超过阈值解密即失败,参数选错/噪声管理失衡
Paillier 公式:密钥生成选等长大素数 p、q,n = pq,λ = lcm(p−1, q−1),取 g = n+1,μ = L(g^λ mod n²)^(−1) mod n,其中 L(u) = (u−1)/n;公钥 (n, g),私钥 (λ, μ)。加密 c = g^m · r^n mod n²(r 随机取自 Z_n^*),解密 m = L(c^λ mod n²)·μ mod n。
运算规则:
二项式展开给 (1+n)^m ≡ 1+mn(mod n²),故 g=n+1 时 L(g^λ) = λ、μ = λ^(−1) mod n,这是密钥自洽的根源。
密文相乘(模 n²)即明文相加:E(m1)·E(m2) ≡ g^(m1+m2)·(r1·r2)^n ≡ E(m1+m2)。
密文自乘 k 次得 E(k·m),密文乘 g^t 得 E(m+t);随机数 r 必须与 n 互素且不可重用,否则同态性与语义安全性破坏。
同态只到加法(与标量乘法):对明文的乘法运算没有对应的密文操作,这是判定题目考点的主要信号。
演算(p=3、q=5):n = 15、n² = 225、λ = lcm(2,4) = 4、g = n+1 = 16;g^λ = 16⁴ ≡ 1+4·15 = 61(mod 225),L(61) = (61−1)/15 = 4 = λ,μ = 4^(−1) mod 15 = 4(4·4=16≡1)。 加密 E(2, r=2):g² = 256 ≡ 31,r^n = 2^15 = 32768 ≡ 143,c1 = 31·143 = 4433 ≡ 158(mod 225)。 加密 E(4, r=4):g⁴ ≡ 61,4^15 = 2^30 ≡ 143² ≡ 199,c2 = 61·199 = 12139 ≡ 214。 同态验证:c1·c2 = 158·214 = 33812 ≡ 62(mod 225);解密 D(62):62² ≡ 19,19² = 361 ≡ 136,L(136) = 135/15 = 9,m = 9·4 = 36 ≡ 6 = 2+4;顺带 D(c1) = 2、D(c2) = 4 亦逐项核对成立。(r 若取 3 则 gcd(3,15)≠1,同态链在 r^n 项上断裂,教学时特意换 r=4。)
通常以"纯数学演示题"出现(给出 Paillier 公钥求同态和)或"噪声增长"概念题
识别特征
提示语:Paillier、homomorphic、同态、FHE/BFV/CKKS(后两者多为概念题)。 计算特征:给出 (n, g) 与多个密文,问 m1+m2;或让在密文上做乘/加。
靶场题目
Paillier(赣CTF)
Writeup
题目:Paillier(赣CTF) 识别:m1 = pq+1 即 Paillier 的 g = n0+1(记 n0 = pq),c 是标准 Paillier 密文(模 n0²),指数即明文;破题点不在同态而在先分解 n0——relation 是故意的泄密因子。 解题: 恢复素因子:由二项式定理 relation = (1949p+2023)^q ≡ 2023^q(mod p);又由费马小定理 2023^(pq) ≡ 2023^q(mod p),故 gcd(pow(2023, pq, pq) − relation, pq) = p,从而 p、q 俱得。 标准解密:λ = lcm(p−1, q−1),D(c) = L(c^λ mod n0²)·L(g^λ mod n0²)^(−1) mod n0 直接得到 flag。flag{i_10ve_crypto!};
脚本:
from math import gcd from Crypto.Util.number import long_to_bytes n0 = 0 c = 0 relation = 0 if n0 and c and relation: p = gcd(n0, pow(2023, n0, n0) - relation) q = n0 // p assert p * q == n0 N2 = n0 * n0 lam = (p - 1) * (q - 1) // gcd(p - 1, q - 1) L = lambda u: (u - 1) // n0 Lg = L(pow(n0 + 1, lam, N2)) Lc = L(pow(c, lam, N2)) m = (Lc * pow(Lg, -1, n0)) % n0 print(long_to_bytes(m)) else: print("先取得 pq、c、relation 三个大整数贴入参数位,再运行解密")题目:Paillier 同态加法模拟题
识别:描述含 Paillier,问密文相乘解密结果即考加法同态。 解题:按 keygen 算 λ = lcm(p−1, q−1)、μ = L(g^λ mod n²)^(−1) mod n;计算 c1·c2 mod n²;解密 D(c1·c2) = L((c1·c2)^λ)·μ 即 m1+m2。
脚本:
from math import gcd, lcm L = lambda u, n: (u - 1) // n p, q = 61, 53 n, g = p * q, p * q + 1 lam = lcm(p - 1, q - 1) mu = pow(L(pow(g, lam, n * n), n), -1, n) dec = lambda c: (L(pow(c, lam, n * n), n) * mu) % n enc = lambda m, r: (pow(g, m, n * n) * pow(r, n, n * n)) % (n * n) c1, c2 = enc(42, 17), enc(43, 19) print(dec((c1 * c2) % (n * n)))
工具:Sage Cell Server
脚本
from math import gcd def lcm(a, b): return a // gcd(a, b) * b def L(x, n): return (x - 1) // n p, q = 61, 53 n = p * q n2 = n * n lam = lcm(p - 1, q - 1) g = n + 1 mu = pow(L(pow(g, lam, n2), n), -1, n) def enc(m, r): return (pow(g, m, n2) * pow(r, n, n2)) % n2 def dec(c): return (L(pow(c, lam, n2), n) * mu) % n m1, m2 = 42, 43 c1, c2 = enc(m1, 17), enc(m2, 19) m_sum = dec((c1 * c2) % n2) print("Paillier 同态加法: dec(enc(42)*enc(43)) = %d" % m_sum) assert m_sum == m1 + m2 print("SUCCESS: flag{paillier_homomorphic_demo}")