∴$L(g^λpmod{n^2}) = k_g$
且有
- $1+kn equiv 1+kn pmod{m^2}$
- $(1+kn)^2 equiv 1+2kn+(kn)^2 equiv 1+2kn pmod{m^2}$
- $(1+kn)^3 equiv 1+3(kn)^2+3kn+(kn)^3 equiv 1+3kn pmod{m^2}$这里我们就不用数学分析法了,就直接易得了=> $(1+kn)^{m} equiv knm+1 pmod{n^2}$
∴$g^{mλ} = (1+k_gn)^{m} equiv k_gnm+1 pmod{n^2}$
∴$r^{nλ} = (1+k_nn)^{n} equiv k_nn^2+1 equiv 1pmod{n^2}$
∴$L(g^{mλ}*r^{nλ}pmod{n^2}) = L(k_gnm+1)=mk_g$
又∴$L(g^λpmod{n^2}) = k_g$
∴②式: $L(g^{mλ}r^{nλ} pmod{n^2})L(g^λ pmod{n^2})^{-1} pmod{n}$ => $mk_g*k_g^{-1} equiv m pmod n$
证毕
截图:
![](https://img8.php1.cn/3cdc5/127d4/5a0/78dfe513c400d5f6.png)
The second pattern
由 $L(c^λ pmod{n^2}*μ) pmod{n}$
有 $L(g^{mλ}r^{nλ} pmod{n^2}μ) pmod{n}$ ①
其中$λ = (p-1)*(q-1), μ = φ(n)^{-1} pmod{n}$
∵$r^{nλ} = r^{n(p-1)*(q-1)} = r^{φ(n^2)}$
由欧拉定理:$r^{φ(n^2)} equiv 1 pmod{n^2}$
①式 => $L(g^{mλ} pmod{n^2}*μ) pmod{n}$ ②
∵$g = n+1$
∴$g^{mλ} = (1+n)^{mλ} equiv nmλ+1 pmod{n^2}$
②式=> $L((nmλ+1)*μ) pmod{n}$
=> $ frac{(nmλ+1)-1}{n}*μ pmod{n}$
=>$(mλ*μ) pmod{n}$ ③
∵$λ = φ(n),μ = φ(n)^{-1} pmod{n}$
∴③式: $(mλ*μ) equiv mpmod{n}$
证毕
截图:
![](https://img8.php1.cn/3cdc5/127d4/5a0/9bda1dd4a3a903e1.png)
DASCTF四月月赛 not RSA
from Crypto.Util.number import getPrime as bytes_to_long
from secret import flag,p,q
from sympy import isprime,nextprime
import random
m=bytes_to_long(flag)
n=p*q
g=n+1
r=random.randint(1,n)
c=(pow(g,m,n*n)*pow(r,n,n*n))%(n*n)
print "c=%d"%(c)
print "n=%d"%(n)
可以看到,这一题就是用的paillier cryptosystem,且参数用的是上文中的The second pattern
但是我们计算λ = φ(n) = (p-1)*(q-1) ,需要用到p和q
这里我们直接上yafu分解n发现可以成功分解,原因是p与q其实非常接近,所以其实直接对n开根然后再在附近寻找素数就能找到p、q了。
所以构造解密脚本
# -*- coding: utf-8 -*-
from Crypto.Util.number import long_to_bytes,inverse
from sympy import nextprime
from gmpy2 import iroot
def L(x,n):
return (x-1)/n
c=
n=
#factor(n)
a = iroot(n,2)[0]
p = nextprime(a)
q = n//p
assert p*q == n
#根据解密公式,计算所需私钥对(λ,μ)
Lambda=(p-1)*(q-1)
miu=inverse(Lambda,n*n)
m=(L(pow(c,Lambda,n**2),n)*miu)%n
print long_to_bytes(m)
Homomorphic properties
Homomorphic addition of plaintexts
设D为解密函数,E为加密函数
即:D(E(m1, r1)*E(m2,r2) mod n^2)≡ m1+m2 (mod n)
proof
C = (g^m1) * (r1^n) * (g^m2) *(r2^n) mod n^2
= g^(m1+m2)*(r1r2)^n mod n^2
首先我们可以将m1+m2看作一个整体M,然后由于r1、r2是随机选的,所以r1*r2可以看作一个整体R,
故C = g^M * R^n mod n^2
由于gcd(r1,n) = 1; gcd(r2,n) = 1; => gcd(r1*r2, n) = 1,故R符合要求
所以D(C) = M ≡ m1 + m2 (mod n)
Homomorphic multiplication of plaintexts
设D为解密函数,E为加密函数
即:D(E(m1, r1)^k mod n^2)≡ km1 (mod n)
proof
C = (g^m1) * (r1^n)^k (mod n^2 )
=(g^km1)*(r1^(kn) ) (mod n^2)
首先我们可以将km1看作一个整体M,然后由于r1是随机选的,所以r1^k可以看作一个整体R,
故C = g^M * R^n mod n^2
由于gcd(r1,n) = 1 => gcd(r1^k, n) = 1,故R符合要求
所以D(C) = M ≡ km1 (mod n)
Reference
https://en.wikipedia.org/wiki/Paillier_cryptosystem