狂飙
题目:
import os
from flag import flag
from Crypto.Util.number import *
from Crypto.Cipher import AES
m = 88007513702424243702066490849596817304827839547007641526433597788800212065249
key = os.urandom(24)
key = bytes_to_long(key)
n=m % key
flag += (16 - len(flag) % 16) * b'\x00'
iv = os.urandom(16)
aes = AES.new(key,AES.MODE_CBC,iv)
enc_flag = aes.encrypt(flag)
print(n)
print(enc_flag)
print(iv)
#103560843006078708944833658339172896192389513625588
#b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
#b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'
已知如下式子
n
=
m
m
o
d
k
e
y
n = m \space mod \space key
n=m mod key
则有
k
×
k
e
y
=
m
−
n
k\times key = m-n
k×key=m−n
使用sage的divisors()函数可以得到k*key的所有因子组合,然后我们遍历一下符合题目要求的因子即可找到key
#sage
from Crypto.Util.number import *
from Crypto.Cipher import AES
m = 88007513702424243702066490849596817304827839547007641526433597788800212065249
n = 103560843006078708944833658339172896192389513625588
enc = b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
iv = b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'
tmp = m-n
data = divisors(tmp)
for i in data:
if i.nbits()<=192 and i.nbits()>=184 and tmp%i==0:
key = long_to_bytes(i)
aes = AES.new(key,AES.MODE_CBC,iv)
flag = aes.decrypt(enc)
if b'flag' in flag:
print(flag)
break
#flag{cf735a4d-f9d9-5110-8a73-5017fc39b1b0}
RRSA
题目:
from flag import flag
import random
from Crypto.Util.number import *
def genprime():
o = getPrime(300)
while True:
r = random.randint(2**211,2**212)
if isPrime(o*r+1):
return o,o*r+1
o1,p = genprime()
o2,q = genprime()
n=p*q
g = random.randint(2,n)
order = o1*o2
a = pow(g, (p-1)*(q-1)//order, n)
assert pow(a,order,n)==1
m = bytes_to_long(flag)
e = 65537
c = pow(m,e,n)
print(f'n={n}')
print(f'c={c}')
print(f'a={a}')
print(f'o={order}')
n=44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c=41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
a=39844923600973712577104437232871220768052114284995840460375902596405104689968610170336151307934820030811039502338683925817667771016288030594299464019664781911131177394369348831163266849069740191783143327911986419528382896919157135487360024877230254274474109707112110411601273850406237677432935818199348150470
o=1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453
非预期:
根据genprime()函数可知
p
=
o
1
r
1
+
1
,
q
=
o
2
r
2
+
1
p = o_1r_1+1,q = o_2r_2+1
p=o1r1+1,q=o2r2+1
则有
n
=
p
q
=
o
1
r
1
o
2
r
2
+
o
1
r
1
+
o
2
r
2
+
1
n = pq = o_1r_1o_2r_2+o_1r_1+o_2r_2+1
n=pq=o1r1o2r2+o1r1+o2r2+1
已知o1和o2的量级为300bit,r1和r2的量级为212bit
n
o
=
r
1
r
2
+
o
1
r
1
o
+
o
2
r
2
o
+
1
o
\frac{n}{o} = r_1r_2+\frac{o_1r_1}{o}+\frac{o_2r_2}{o}+\frac{1}{o}
on=r1r2+oo1r1+oo2r2+o1
那么第二项、第三项、第四项都为0,从而上式子可得
n
o
=
r
1
r
2
\frac{n}{o} = r_1r_2
on=r1r2
∵
p
h
i
=
(
o
1
r
1
+
1
−
1
)
(
o
2
r
2
+
1
−
1
)
=
o
1
o
2
r
1
r
2
\because phi = (o_1r_1+1-1)(o_2r_2+1-1)= o_1o_2r_1r_2
∵phi=(o1r1+1−1)(o2r2+1−1)=o1o2r1r2
此时
o
1
o
2
o_1o_2
o1o2和
r
1
r
2
r_1r_2
r1r2都已知,所以可以计算出d,然后RSA解密即可获得flag
exp:
from Crypto.Util.number import *
import gmpy2
n = 44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c = 41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
a = 39844923600973712577104437232871220768052114284995840460375902596405104689968610170336151307934820030811039502338683925817667771016288030594299464019664781911131177394369348831163266849069740191783143327911986419528382896919157135487360024877230254274474109707112110411601273850406237677432935818199348150470
o = 1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453
e = 65537
r1_r2 = n//o
phi = o*r1_r2
d =gmpy2.invert(e,phi)
m = pow(c,d,n)
flag = long_to_bytes(m)
print(flag)
#flag{0228FC7F-C865-BD0F-F124-9F9860B3542B}
预期解:
已知如下式子
p
=
o
1
r
1
+
1
,
q
=
o
2
r
2
+
1
p = o_1r_1+1,q = o_2r_2+1
p=o1r1+1,q=o2r2+1
p
+
q
=
o
1
r
1
+
o
2
r
2
+
2
p+q = o_1r_1+o_2r_2+2
p+q=o1r1+o2r2+2
n
=
p
q
=
o
1
r
1
o
2
r
2
+
o
1
r
1
+
o
2
r
2
+
1
n = pq = o_1r_1o_2r_2+o_1r_1+o_2r_2+1
n=pq=o1r1o2r2+o1r1+o2r2+1
依据上述两式,我们可以构造如下格
M
=
(
1
−
o
0
n
+
1
)
M = \begin{pmatrix} 1& -o\newline 0 &n+1 \end{pmatrix}
M=(10−on+1)
那么存在如下线性关系
(
r
1
r
2
1
)
(
1
−
o
0
n
+
1
)
=
(
r
1
r
2
o
1
r
1
+
o
2
r
2
+
2
)
=
(
r
1
r
2
p
+
q
)
\begin{pmatrix} r_1r_2&1 \end{pmatrix}\begin{pmatrix} 1& -o\newline 0 &n+1 \end{pmatrix} = \begin{pmatrix} r_1r_2&o_1r_1+o_2r_2+2 \end{pmatrix} = \begin{pmatrix} r_1r_2&p+q \end{pmatrix}
(r1r21)(10−on+1)=(r1r2o1r1+o2r2+2)=(r1r2p+q)
p
+
q
p+q
p+q的量级约为512bit,而
r
1
r
2
r_1r_2
r1r2的量级为424bit,为了使得目标向量大小差不多,调整系数,格子变为
M
=
(
2
88
−
o
0
n
+
1
)
M = \begin{pmatrix} 2^{88}& -o\newline 0 &n+1 \end{pmatrix}
M=(2880−on+1)
此时
δ
(
L
)
=
2
88
×
(
n
+
1
)
≈
556
b
i
t
>
∣
∣
v
∣
∣
=
(
2
88
r
1
r
2
)
2
+
(
p
+
q
)
2
≈
512
b
i
t
\delta(L) = \sqrt{2^{88}\times (n+1)} \approx556bit>||v|| = \sqrt{(2^{88}r_1r_2)^{2}+(p+q)^2}\approx 512bit
δ(L)=288×(n+1)≈556bit>∣∣v∣∣=(288r1r2)2+(p+q)2≈512bit
所以可以格基规约出目标向量
(
2
88
r
1
r
2
p
+
q
)
\begin{pmatrix} 2^{88}r_1r_2&p+q \end{pmatrix}
(288r1r2p+q)
接下来使用格基规约出来的
r
1
r
2
r_1r_2
r1r2或者
p
+
q
p+q
p+q都可以计算出phi
p + q p+q p+q
#sage
n=44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c=41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
o=1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453
e = 65537
M = matrix(ZZ,[[2^88,-o],[0,n+1]])
result = M.LLL()
p_q = result[0][1]
phi = n-p_q+1
d = inverse_mod(e,phi)
m = pow(c,d,n)
flag = bytes.fromhex(hex(m)[2:])
print(flag)
#flag{0228FC7F-C865-BD0F-F124-9F9860B3542B}
r 1 r 2 r_1r_2 r1r2
#sage
n=44435425447782114838897637647733409614831121089064725526413247701631122523646623518523253532066782191116739274354991533158902831935676078270115998050827358178237970133151467497051097694866238654012042884894924846645692294679774577780414805605811029994570132760841672754334836945991390844881416693502552870759
c=41355409695119524180275572228024314281790321005050664347253778436753663918879919757571129194249071204946415158483084730406579433518426895158142068246063333111438863836668823874266012696265984976829088976346775293102571794377818611709336242495598331872036489022428750111592728015245733975923531682859930386731
o=1745108106200960949680880500144134006212310627077303652648249235148621661187609612344828833696608872318217367008018829485062303972702933973340909520462917612611270028511222134076453
e = 65537
M = matrix(ZZ,[[2^88,-o],[0,n+1]])
result = M.LLL()
r1_r2 = result[0][0]//(2**88)
phi = o*r1_r2
d = inverse_mod(e,phi)
m = pow(c,d,n)
flag = bytes.fromhex(hex(m)[2:])
print(flag)
#flag{0228FC7F-C865-BD0F-F124-9F9860B3542B}
【俏丽若三春之桃,清素若九秋之菊。】