RSA101
p, q为大素数
n=p∗q
phi=(p−1)∗(q−1)
e为小于phi的素数
e∗d≡1modphi
e, n为公钥; d, n为私钥
c≡memodn
m≡cdmodn
dp & dq
m≡cdmodn
n=p∗q
dp≡dmod(p−1)
dq=dmod(q−1)
通过p, q, dp, dq, c运算得出m
m≡cdmodn
m≡cdmod(p∗q)
mp≡cdmodp
mq≡cdmodq
cd=mp+kp∗p
cd=mq+kq∗p
结合两者可得
mq+kq∗q=mp+kp∗p
mq≡mp+kp∗pmodq
kp∗p≡mq−mpmodq
kp≡(mq−mp)∗p−1modq
其中
p−1∗p≡1modq
代入下式
cd=mp+kp∗p
可得
cd=(((mq−mp)∗p−1)%q)∗p+mp
m≡cdmodn≡(((mq−mp)∗p−1)%q)∗p+mpmodn
对于mp, mq
mp≡cdmodp
mp≡cdp+k∗(p−1)modp
mp≡cdp∗ck∗(p−1)modp
费马小定理(p为素数):
ap−1≡1modp
则
ck∗(p−1)≡1modp
mp≡cdpmodp
同理
mq≡cdqmodq
m≡cdmodn≡((((cdq%q)−(cdp%p))∗p−1)%q)∗p+(cdp%p)modn
可能存在的非预期
m<p
m≡cdmodn
m≡cdmod(p∗q)
m+k∗p∗q=cd
m+k∗p∗q=cdmodp
m≡cdmodp
m≡cdp+k∗(p−1)modp
m≡cdp∗ck∗(p−1)modp
m≡cdpmodp
dp & dq & dr
在三素数(n=p∗q∗r)的情况下,给出p, q, r, dp, dq, dr, n, c来求解m
其中
dp≡dmod(p−1)
dq≡dmod(q−1)
dr≡dmod(r−1)
公式不变
m≡cdmodn≡(((mq−mp)∗p−1)%q)∗p+mpmodn
m≡cdmodn≡((((cdq%q)−(cdp%p))∗p−1)%q)∗p+(cdp%p)modn
joker
在三素数(n=p∗q∗r)的情况下,给出p, q, r, dp, dq, dr, n, c来求解m
其中
dp=d%((q−1)∗(r−1))
dq=d%((p−1)∗(r−1))
dr=d%((p−1)∗(q−1))
d=dp+k∗(q−1)∗(r−1)
mp≡cdmod(q∗r)
mp≡cdp+k∗(q−1)∗(r−1)mod(q∗r)
mp≡cdp∗ck∗(q−1)∗(r−1)mod(q∗r)
mp≡cdpmod(q∗r)
同理可得
mq≡cdqmod(p∗r)
cd≡mp+kp∗q∗r
cd≡mq+kq∗p∗r
mp+kp∗q∗r=mq+kq∗p∗r
mq−mp=(kp∗q−kq∗p)∗r
kp∗q∗r≡mq−mpmodp
kp≡(mq−mp)∗q−1∗r−1modp
cd=mp+kp∗q∗r
cd=mp+(((mq−mp)∗q−1∗r−1)%p)∗q∗r+mp
m≡cdmodn≡(((mq−mp)∗q−1∗r−1)%p)∗q∗r+mpmodn
m≡cdmodn≡((((cdq%(p∗r))−(cdp%(q∗r)))∗q−1∗r−1)%p)∗q∗r+(cdp%(q∗r))modn
dp
通过e, dp, n, c来求解m
e∗d≡1mod(p−1)∗(q−1)
e∗d=1+k1∗(p−1)∗(q−1)
e∗(dp+k2∗(p−1))=1+k1∗(p−1)∗(q−1)
e∗dp+e∗k2∗(p−1)=1+k1∗(p−1)∗(q−1)
e∗dp≡1mod(p−1)
e∗dp−1=k∗(p−1)
k=p−1e∗dp−1<p−1e∗dp<p−1e∗(p−1)=e
则可以遍历(2,e)
1 2 3
| for i in range(2, e): if (e * d_p - 1) % i == 0: k = i
|
p=ke∗dp−1+1
q=pn
phi=(p−1)∗(q−1)
d≡e−1modphi
m≡cdmodn
共模
{c1≡me1modnc2≡me2modn
给出c1, c2, e1, e2来求解m
gce(e1,e2)=1
使用EEA可得
s1∗e1+s2∗e2=1
c1s1∗c2s2≡me1∗s1∗me2∗s2≡me1∗s1+e2∗s2≡mmodn
但是s1, s2中有一个为负数
模运算的负数次幂运算如下(假设s1为负数)
c1s1≡(c1−1)−s1modn
1 2 3 4 5 6 7 8 9 10 11
| s = gmpy2.gcdext(e1, e2) if s[1] < 0: s1 = -s[1] s2 = s[2] c1_ = gmpy2.invert(c1, n) m = (pow(c1_, s1, n) * pow(c2, s2, n)) % n elif s[2] < 0: s1 = s[1] s2 = -s[2] c2_ = gmpy2.invert(c2, n) m = (pow(c1, s1, n) * pow(c2_, s2, n)) % n
|
低指数
e很小,存在两种情况
1 2 3 4
| for i in range(0, 100): k = gmpy2.iroot(i * n + c, e) if k[1] == True: m = k[0]
|
低解密指数 – wiener
理论推导部分省略
结论为当 d<31N41 成立时
∣ne−dk∣<2d21 成立
其中 e∗d=k∗ϕ(n)+1
则 dk 的值在 ne的连分数渐进值中存在
以e = 17993, n = 90581为例
欧几里得算法流程如下
17993=0∗90851+17993
90581=5∗17993+616
17993=29∗616+129
616=4∗129+100
129=1∗100+29
100=3∗29+13
29=2∗13+3
13=4∗3+1
3=3∗1+0
得到的商数集为 [0,5,29,4,1,3,2,4,3]
则 ne 的连分数形式为
9058117993=0+5+29+4+1+3+2+4+311111111
可求得连分数渐进值为 [0,51,14629,589117,735146,2794555,63231256,280865579,9058117993]
则遍历收敛即可得到(k,d)的值
通过韦达定理可以进行进一步的判别
n=p∗q
ϕ(n)=ke∗d−1=(p−1)∗(q−1)
n−ϕ(n)=p+q−1
设立方程式
x2+(n−ϕ(n)+1)∗x+n=0
x2+(p+q)∗x+p∗q=0
如果 (p+q)2−4∗p∗q=y>0成立
且 y 的结果为正整数
则d为正确值
且可以求出p, q
补充
∣ba−dc∣<2d21
∣ba−dc∣<2b21
区别在于前者在ba的趋近值中求dc的值,后者在dc的趋近值中求ba的值
费马因式分解
对于任意一个奇数n,有n=a∗b=x2−y2=(x+y)∗(x−y)
而在n的分解出的因数接近时,可以从 x=n+i,i∈Z 开始进行递增遍历
如果x2−n的结果可以被完全开方,则x正确,且开方结果为y
即可得出a,b
若n为有四个因子,则存在两组a,b的值
低指数广播
⎩⎪⎨⎪⎧c1≡memodn1c2≡memodn2c3≡memodn3
且满足 me<n1∗n2∗n3
则可以使用中国剩余定理
⎩⎪⎨⎪⎧k1≡(n2∗n3)−1modn1k2≡(n1∗n3)−1modn2k3≡(n1∗n2)−1modn3
me=(n2∗n3∗k1∗c1+n1∗n3∗k2∗c2+n1∗n2∗k3∗c3)%(n1∗n2∗n3)
m=e(n2∗n3∗k1∗c1+n1∗n3∗k2∗c2+n1∗n2∗k3∗c3)%(n1∗n2∗n3)
smooth number
若p-1的素因子均不大于b
那么p-1为 b-smooth number
遍历不大于b的素数ai
B=∏iai
则 B=k∗(p−1)
aB≡ak∗(p−1)≡1modp
aB≡ak∗(p−1)≡xmodn
wiki中给出模除的计算方法如下
dmod(abc)=(dmoda)+a[(d/a)modb]+ab[(d/a/b)modc]
aB≡ak∗(p−1)≡xmod(p∗q)
aB≡ak∗(p−1)≡xmodp+p∗(pxmodq)
aB=ak∗(p−1)=1+k∗p
gcd(aB−1,n)=gcd(k∗p,q∗p)=p
p(非预期)
m<p
c≡memodn
c≡memod(p∗q)
cp≡me≡cmodp
e∗d≡1mod(p−1)
e∗d=k∗(p−1)+1
cpd≡me∗d≡mk∗(p−1)+1≡mmodp
d
q=nextprime(p)
e∗d≡1modphi
e∗d−1=k∗phi
ke∗d−1=phi
根据e∗d−1和phi的位数之差可以得到k的大概范围
在范围中遍历k
得到可能的phi值
nextprime(phi) 即为q
p=q−1phi+1
计算 e∗d % (p−1)∗(q−1) 的结果若为1
则 p,q 值正确,即所得 phi 值正确
n & ed
e∗d=k∗phi+1
k=phie∗d−1=(p−1)∗(q−1)e∗d−1>p∗qe∗d−1=ne∗d−1
n略大于phi
则k略大于ne∗d−1
爆破即可得到k
phi=ke∗d−1=(p−1)∗(q−1)
n−phi+1=p∗q−(p−1)∗(q−1)+1=p+q
p−q=(p+q)2−4∗p∗q=(p+q)2−4∗n
p=2(p+q)+(p−q)
q=2(p+q)−(p−q)
Rabin
n=p∗q
c≡m2modn
这种情况下即使已知phi和e,也不能通过正常的方法去解出m
p, q为素数,即为奇数
则 (p−1) 和 (q−1) 为均为偶数
则phi为偶数
gcd(phi,e)=2
e在模phi的情况下逆元则不存在
这里需要使用Rabin算法来进行计算
其核心为二次剩余以及中国剩余定理
c≡m2modn
这里可以分解为两个式子
{cp≡m2≡cmodpcq≡m2≡cmodq
对于第一个式子
cp≡m2modp
则c是模p的二次剩余
根据欧拉判别法可以得到
c2p−1≡1modp
m2≡c≡c∗c2p−1≡c2p+1modp
开根号得到以下结果
{c1≡c4p+1modpc2≡−c4p+1≡p−c4p+1modp
对于c模q的情况同理
{c3≡c4q+1modqc4≡−c4q+1≡q−c4q+1modq
对于以下组合分别进行CRT
⎩⎪⎪⎪⎨⎪⎪⎪⎧c1&c3c1&c4c2&c3c2&c4
kp≡q−1modp
kq≡p−1modq
⎩⎪⎪⎪⎨⎪⎪⎪⎧m1=q∗kp∗c1+p∗kq∗c3modnm2=q∗kp∗c1+p∗kq∗c4modnm3=q∗kp∗c2+p∗kq∗c3modnm4=q∗kp∗c2+p∗kq∗c4modn
m就存在于四种结果之中
wilson
(p−1)!≡−1modp
(p−1)!≡p−1modp
(p−2)!≡1modp
求 q!modp 的值
其中 q<p, 且 p−q 的值不大
x=1
i 从 q+1 到 p−2 进行遍历
x=x∗(i−1modp)
则 q!=x
openssl
public.key
1
| openssl rsa -pubin -modulus -text -in public.key
|
得到e, n
flag.enc
1 2 3 4 5 6 7 8 9 10 11 12 13
| from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP key_info = RSA.construct((n, e, d, p, q)) key = RSA.importKey(key_info.exportKey()) key = PKCS1_OAEP.new(key) f = open('flag.enc', 'r').read() c = base64.b64decode(f) m = key.decrypt(c)
import rsa key = rsa.PrivateKey(n,e,int(d),p,q) c = open('flag.enc','rb').read() print(rsa.decrypt(c,key))
|
coppersmith 101
首先有一个首一的多项式
F(x)=xb+ab−1∗xb−1+...+a1x+a0
我们知道存在一个整数x0,使得F(x0)≡0modn
则可以借助coppersmith’s method,将该式转换到整数域上
使得G(x)=0
Example
n=11∗19=209
F(x)≡23∗x2+13∗x+61≡0modn
这里的首项不为1,则可以乘上23的逆元
F(x)≡(23∗x2+13∗x+61)∗100≡0modn
F(x)≡x2+134∗x+40≡0modn
G(x)=a∗F(x)+n∗K (K为x的多项式)
解得G(6)=0
即F(6)≡0modn
对于RSA的学习大概要告一段落了,该去花点时间学学Web,或是做做题,或是写写PHP。
The End, The Start.