RSA安全原理:基于大整数N分解难。一般N>2048 bits。
1.算法原理
msg:明文
cipher:密文
公钥:N, e, 1< e < φ(N),且e与φ(N) 互质
私钥: p, q, d (p, q为素数)
欧拉函数:
求私钥d:
加密过程:
解密过程:
算法正确性证明:
也就是要证明
分情况讨论:
gcd(msg, N) = 1
由欧拉定理得
由同余的乘法性质可知
所以
解密得到的就是明文。
gcd(msg, N) ≠1
设,msg为p或者q的倍数。
且易知1 < k < q,q为素数,所以gcd(k, q) = 1
由费马小定理可知:
由同余的乘法性质可知
又因为
那么
也就是说
转化形式后
由此可知,t*q是能整除k*p的,又因为q是素数,那么t就能整除p
令
则
所以
即
2.简单RSA加解密
题目描述
2^16+1
p = 1619457011962613889034092691100138481201392787160018861588882624360276930879984504721332613
q = 1930644580807360024179365101463872960800671765127817730222044332809690977077925368011467259
c = 591746946043509417154408651370020140882201187961060440894988228260125420535482616849793702495189458033191552493861512032310747532849126740960428065188251472016781567743780417376053
已知p,q,c,是没法求出msg的,推测2^16+1应该是e的值。e常设置为65537,0x10001(十六进制),和题目给的是一样的。
phi = (p - 1)*(q - 1)
d = invert(e, phi)
m = pow(c, d, p * q)
print(n2s(m))
将m转换为string就可以得到flag。