mirror of
https://github.com/The-Art-of-Hacking/h4cker.git
synced 2024-12-18 02:46:11 +00:00
Update encrypt.py
This commit is contained in:
parent
edf148cb95
commit
c4f6f98836
@ -1,9 +1,3 @@
|
||||
Heavy computation(400)
|
||||
Question:
|
||||
A friend of mine handed me this script and challenged me to recover the flag. However, I started running it on my school cluster and everything is burning now... Help me please!
|
||||
|
||||
Given files:
|
||||
encrypt.py
|
||||
from Crypto.Util.number import bytes_to_long, long_to_bytes
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad
|
||||
@ -49,76 +43,3 @@ enc = cipher.encrypt(pad(flag,16))
|
||||
|
||||
with open("flag.enc","wb") as output_file:
|
||||
output_file.write(enc)
|
||||
flag.enc(dump)
|
||||
0000 f4 d8 e5 a2 ac 80 6c e9 dc c1 ef 1e d5 c4 51 7c ......l.......Q|
|
||||
0010 e3 d8 84 1a d7 c0 77 c9 9c b0 f6 f0 ab 13 63 b0 ......w.......c.
|
||||
0020 f9 5e 8d cd 87 ce c7 d3 88 7a 4a 68 de a9 6f 96 .^.......zJh..o.
|
||||
0030 77 cf 1e a7 95 a0 f8 1c be 3a 66 f0 aa 73 2c 3e w........:f..s,>
|
||||
Solution:
|
||||
Outline:
|
||||
(1) For preparartion, we calcurate Euler's totient of N by FactorDb( http://www.factordb.com/ ):
|
||||
|
||||
N=5*23*61*701*3043975283150884175290138965903193067634156680289693153778518185326633105971710936004483047892546798724665417739250476586249010832824560305913279982496088828053414799963361876618585076997170323631281630177651847
|
||||
|
||||
(2) First part of the functuon "derive_key":
|
||||
|
||||
for i in range(NB_ITERATIONS):
|
||||
start = start ** e
|
||||
start %= N
|
||||
It is easily simplificated by Euler's theorem.
|
||||
|
||||
start = pow(bytes_to_long(password),pow(e,NB_ITERATIONS,phi_N), N)
|
||||
where phi_N is the totient of N,
|
||||
|
||||
phi_N=(5-1)* (23-1)* (61-1)* (701-1)* (3043975283150884175290138965903193067634156680289693153778518185326633105971710936004483047892546798724665417739250476586249010832824560305913279982496088828053414799963361876618585076997170323631281630177651847-1)
|
||||
|
||||
(3) Second Part of the functuon "derive_key":
|
||||
|
||||
key = 1
|
||||
for i in range(NB_ITERATIONS):
|
||||
key = key ** e
|
||||
key %= N
|
||||
key *= start
|
||||
key %= N
|
||||
We can replace it with the following (using "invert" function of gmpy2).
|
||||
|
||||
inv_e = gmpy2.invert(e-1,phi_N)
|
||||
key = pow(start, (pow(e,NB_ITERATIONS,phi_N)-1) * inv_e, N)
|
||||
(4) Finally, We brute force the password and get the flag!
|
||||
|
||||
Solver:
|
||||
solve.py
|
||||
from Crypto.Util.number import bytes_to_long, long_to_bytes
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad
|
||||
from hashlib import sha256
|
||||
import gmpy2
|
||||
|
||||
NB_ITERATIONS = 10871177237854734092489348927
|
||||
e = 65538
|
||||
N = 14968794114523720195251887716913440457986979987674770429103169854116498198112478103466085455257317270930523061714030307370028304505577267672733143013124254253285088080041831478700041394909740024011681885623055622400205
|
||||
|
||||
#Using FactorDB, we have N=5*23*61*701*3043975283150884175290138965903193067634156680289693153778518185326633105971710936004483047892546798724665417739250476586249010832824560305913279982496088828053414799963361876618585076997170323631281630177651847
|
||||
phi_N = (5-1)*(23-1)*(61-1)*(701-1)*(3043975283150884175290138965903193067634156680289693153778518185326633105971710936004483047892546798724665417739250476586249010832824560305913279982496088828053414799963361876618585076997170323631281630177651847-1)
|
||||
|
||||
def derive_key(password):
|
||||
start = bytes_to_long(password)
|
||||
start = pow(start,pow(e,NB_ITERATIONS,phi_N), N)
|
||||
inv_e = gmpy2.invert(e-1,phi_N)
|
||||
key = pow(start, (pow(e,NB_ITERATIONS,phi_N)-1) * inv_e, N)
|
||||
return sha256(long_to_bytes(key)).digest()
|
||||
|
||||
with open('flag.enc','rb') as f:
|
||||
flag_enc = f.read()
|
||||
for i in range(0x20, 0x100):
|
||||
for j in range(0x20, 0x100):
|
||||
password = long_to_bytes(i) + long_to_bytes(j)
|
||||
key = derive_key(password)
|
||||
IV = b"random_and_safe!"
|
||||
cipher = AES.new(key, AES.MODE_CBC,IV)
|
||||
flag = cipher.decrypt(flag_enc)
|
||||
if(flag[0:6] == b'shkCTF'):
|
||||
print(flag.decode('utf-8')[0:flag.decode('utf-8').find('}')+1])
|
||||
break
|
||||
Flag:
|
||||
shkCTF{M4ths_0v3r_p4t13Nce_b4453d1f9f5386a1846e57a3ec95678f}
|
||||
|
Loading…
Reference in New Issue
Block a user