ZJCTF予選1つpyの逆問題
9671 ワード
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 from hashlib import sha256
4 def xor(a,b):
5 result = []
6 for (i, j) in zip(a, b):
7 result.append(chr(ord(i) ^ ord(j)))
8 return "".join(result)
9 def HASH(msg):
10 return sha256(msg).digest()[:8]
11 def zjctf_encrypt(gen_keys, hahahah):
12 i = 0
13 d1 = hahahah[:8]
14 d2 = hahahah[8:]
15 for i in gen_keys:
16 d1 = xor(xor(HASH(d2),i),d1)
17 d1, d2 = d2, d1
18 return d2 + d1
19 def gen_keymap(key):
20 maps = []
21 _ = key
22 for i in range(16):
23 _ = HASH(_)
24 maps.append(_)
25 return maps
26 def encrypt(key, data):
27 keys = gen_keymap(key)
28 return zjctf_encrypt(keys, data).encode('hex')
29 if __name__ == "__main__":
30 result = encrypt("zzzzzjctffffffff", "This_is_the_flag")
31 print(result)
32 # your result = 1b3a0152bef25769f384a740aa189e78
問題のヒントはxorを利用して解決して、ダウンロードしてpyファイルであることを発見します.
まず「zzzzzjctffffff」「This_is_the_flag」の2つのパラメータをencrypt()に伝達し、
gen_keymap()は「zzzzzjctffffff」をHASH処理してmapsを返す
zjctf_encrypt()は、このmapsを「This_is_the_flag」とスライスし、d 2+d 1に戻して出力する
復号コードは次のとおりです.
1 from hashlib import sha256
2 def xor(a,b):
3 result = []
4 for (i, j) in zip(a, b):
5 result.append(chr(ord(i) ^ ord(j)))
6 return "".join(result)
7 def HASH(msg):
8 return sha256(msg).digest()[:8]
9 def zjctf_encrypt(gen_keys, hahahah):
10 i = 0
11 d1 = hahahah[:8]
12 d2 = hahahah[8:]
13 d1, d2 = d2, d1
14 for i in gen_keys:
15 d2= xor(xor(HASH(d1),d2),i)
16 d1, d2 = d2, d1
17 return d1+d2
18 def gen_keymap(key):
19 maps = []
20 _ = key
21 for i in xrange(16):
22 _ = HASH(_)
23 maps.append(_)
24 maps.reverse()
25 return maps
26 def encrypt(key, data):
27 keys = gen_keymap(key)
28 return zjctf_encrypt(keys, data)
29
30 key="zzzzzjctffffffff"
31 result = '1b3a0152bef25769f384a740aa189e78'
32 result=result.decode('hex')
33 print encrypt(key, result)
この問題はpythonの文法だけでなくhashlibライブラリの使用,暗号化アルゴリズムの理解も考察した.