Schmidt-Samoa密码系统
Schmidt-Samoa 密码系统,像 Rabin 加密一样,其安全性基于整数因式分解的难度。但 Rabin 解密时会得到四个解,而 Schmidt-Samoa 得到的是唯一解。
加密过程
密钥生成
- 选取两个大的质数p和q并进行计算 N=p2∗q
- 计算 d=invert(N,φ(pq))
- 公钥取数对(N,d)
加密
对消息 m ,计算密文 C=mN(modN)
解密
计算明文 m=Cd(modpq)
正确性证明就不写了。摸了摸了
关于pq的获取问题
我们有N=p2q,d⋅N≡1(mod(p−1)(q−1)),有欧拉定理:
a(p−1)(q−1)≡1(modpq)
所以:
a(p−1)(q−1)⋅a≡1(modpq)
a≡a(p−1)(q−1)(modpq)
由此,我们有:
k⋅pq=aNd−a
pq=gcd(aNd−a,N)
我们只要随便取个a就行能拿到pq了。
例题
from Crypto.Util.number import *
flag = b'NSSCTF{******}'
p = getPrime(512)
q = getPrime(512)
n = p*p*q
e = n
c = pow(bytes_to_long(flag), e, n)
d = inverse(e, (p-1)*(q-1))
xnd≡xnd−1⋅x≡x(modpq)
显然有 pq∣(xnd−x) 。然后题目有n=p2q ,GCD一下就有pq了。
exp:
from Crypto.Util.number import *
n =
d =
c =
pq = GCD(n, pow(2, n*d, n)-2)
m = pow(c, d, pq)
print(long_to_bytes(m))