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編碼,套娃!!!!
除了這種常規思路,我們也可以參考之前那個連結後面提到的方法直接用瀏覽器解析