1. 程式人生 > 實用技巧 >Crypto入門 (五)混合編碼

Crypto入門 (五)混合編碼

前言:

  這次得題目從本質上說沒有什麼難點,是多次利用base64和16進位制編碼,層層解開就好,通過這題得程式碼編寫能很好得鍛鍊python程式碼能力,一起加油,嘗試著自己寫寫看看把。

混合編碼:

題目:JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==

分析: 下載題目後發現,結尾出有等號而且兩個,不由的想到Base64,這個編碼方式我們前面已經提到過了就不多說了

先寫個程式碼,解解碼,python程式碼如下:

import base64

with open(r'F:\桌面\tmp\1.txt','r') as f:
    data = f.read()

def base64decode(data):
    data = bytes(data, encoding="utf8")
    data = base64.b64decode(data)
    return data

print(base64decode(data))

執行結果如下:

1 b'LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw
'

很明顯發現都是$#開頭,網上百度一番https://www.jianshu.com/p/6dcefb2a59b2,這篇文章說了以「&#」開頭的後接十進位制數字,所以先變成16進位制然後解碼,思路有了,開始寫程式碼

 1 import base64
 2 
 3 with open(r'F:\桌面\tmp\1.txt','r') as f:
 4     data = f.read()
 5 
 6 def base64decode(data):
 7     data = bytes(data, encoding="utf8")
 8     data = base64.b64decode(data)
 9     return data
10 
11 data= base64decode(data)
12 data =   bytes.decode(data)
13 
14 
15 
16 def base16decode(data):
17     m = ''
18     pattern = re.compile('[0-9]{2,3}')
19     result = pattern.findall(data)
20     
21     for i in result:
22         m += chr(int(i))
23     return m
24 
25 data = base16decode(data)
26 print(data)

然後我們來看下結果:

1 LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw

嗯哼,有點像Base64,先測試下,長度能不能被8整除,如果可以那很大概率是Base64啦,給程式碼

1 str = 'LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw'
2 
3 if len(str) % 8 == 0:
4     print(len(str))
5     print('可以被8整除')

結果是可以被8整除,故我們再用base64解碼一下試試,程式碼後面一起給出,先貼出解碼後的結果:

b'/119/101/108/99/111/109/101/116/111/97/116/116/97/99/107/97/110/100/100/101/102/101/110/99/101/119/111/114/108/100'

感覺被套娃了,沒辦法,再base16解碼,給出全部的程式碼:

 1 import base64
 2 
 3 with open(r'F:\桌面\tmp\1.txt','r') as f:
 4     data = f.read()
 5 
 6 print(data)
 7 def base64decode(data):
 8     data = bytes(data, encoding="utf8")
 9     data = base64.b64decode(data)
10     return data
11 
12 data= base64decode(data)
13 data =   bytes.decode(data)
14 print(data)
15 
16 
17 def base16decode(data):
18     m = ''
19     pattern = re.compile('[0-9]{2,3}')
20     result = pattern.findall(data)
21     
22     for i in result:
23         m += chr(int(i))
24     return m
25 
26 data = base16decode(data)
27 print(data)
28 
29 data = base64decode(data)
30 print(data)
31 
32 def base16decode1(data):
33     m = ''
34     data =   bytes.decode(data)
35     pattern = re.compile('[0-9]{3}')
36     result = pattern.findall(data)
37     
38     for i in result:
39         m += chr(int(i))
40     return m
41 print(base16decode1(data))

給出結果:

1 welometottknddefeneworld

哈哈,還是被解出來了,根據解出的步驟反推加密步驟為,先轉成16進位制,然後再base64編碼 ,再轉成16 進位制,再base64編碼,套娃!!!!

除了這種常規思路,我們也可以參考之前那個連結後面提到的方法直接用瀏覽器解析

參考連結:

https://www.jianshu.com/p/6dcefb2a59b2

https://www.cnblogs.com/yuanchu/p/13467058.html