☰
CTF学习/crypto/同态加密攻击面(Paillier/FHE 噪声)
2026/11/6 5:13:33 网站建设 项目流程

同态加密攻击面(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. 二项式展开给 (1+n)^m ≡ 1+mn(mod n²),故 g=n+1 时 L(g^λ) = λ、μ = λ^(−1) mod n,这是密钥自洽的根源。

  2. 密文相乘(模 n²)即明文相加:E(m1)·E(m2) ≡ g^(m1+m2)·(r1·r2)^n ≡ E(m1+m2)。

  3. 密文自乘 k 次得 E(k·m),密文乘 g^t 得 E(m+t);随机数 r 必须与 n 互素且不可重用,否则同态性与语义安全性破坏。

  4. 同态只到加法(与标量乘法):对明文的乘法运算没有对应的密文操作,这是判定题目考点的主要信号。

演算(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}")

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询