這篇的主要會是以Writeup呈現,下一篇會去做統整,包含常用python語法跟進制轉換。好,那麼就開始繼續解題吧,今天的目標為以下四題GOGO!( •̀ ω •́ )y
解題網址 : https://cryptohack.org/courses/intro/enc1/
-----
網址 : https://cryptohack.org/courses/intro/enc1/
根據題目,那些整數為ASCII碼,而我們要把那些整數轉換成我們看得懂的,下方的提示得知,可以利用python中的chr()來轉換,也就是數字轉字符
把題目給的數字以陣列存取,之後利用for迴圈跑,一個個轉換後輸出
num = [99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
for i in num :
print(chr(i), end="")
end=""用途為讓每次輸出後不換行(預設為end="\n")
Output
flag : crypto{ASCII_pr1nt4bl3}
-----
網址 : https://cryptohack.org/courses/intro/enc2/
題目是給一串16進制的字串,我們的目標是要把它轉成bytes形式,可利用提示給的bytes.fromhex()來實現
a = "63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d"
print(bytes.fromhex(a))
得到flag
flag : crypto{You_will_be_working_with_hex_strings_a_lot}
為什麼輸出的字串前面有個’b’呢+_+,可以想看看XD,後面的會提到!
-----
網址 : https://cryptohack.org/courses/intro/enc3/
題目一樣是給16進制的字串,最後目標要把它以base64編碼,但因為base64.b64encode()傳入的型態要為bytes形式,所以我們需要先把字串變成bytes形式,之後再以base64編碼
先利用上一題所學, 把hex字串轉bytes後再base64編碼
import base64
a = "72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
a = bytes.fromhex(a)
print(base64.b64encode(a))
也可以簡化成這樣
import base64
a = "72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
print(base64.b64encode(bytes.fromhex(a)))
得到flag
flag : crypto/Base+64+Encoding+is+Web+Safe/
-----
網址 : https://cryptohack.org/courses/intro/enc4/
題目給了例子(HELLO)和它被編碼後會長怎樣,之後題目要我們把它給的這個整數變回message,可利用提示的long_to_bytes ()來實現
from Crypto.Util.number import *
a = 11515195063862318899931685488813747395775516287289682636499965282714637259206269
print(long_to_bytes(a))
得flag
flag : crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}
-----
今天學到了編碼、型態轉換和多認識了python語法
-----
num = 65
chr_num = chr(num) # int to chr
print("chr : ", chr_num)
int_num = ord(chr_num) # chr to int
print("int : ", int_num)
Output
查ASCII表發現的確如此(65 - > A)
ASCII Table : https://www.rapidtables.com/code/text/ascii-table.html
-----
str = "Hello"
bytes_str = str.encode()# str to bytes
print("bytes :", bytes_str)
###
print("hex :", bytes_str.hex())# bytes to hex
hex_str = bytes_str.hex()
print("bytes :", bytes.fromhex(hex_str))# hex to bytes
因.hex()、bytes.fromhex()傳入的變數都須以bytes型態傳入,所以###上方利用.encode()來把”Hello”變為bytes型態
Output
-----
import base64
from Crypto.Util.number import *
-----
需import base64
import base64
str = "Hello"
bytes_str = str.encode()# str to bytes
print("bytes :", bytes_str)
###
base64_str = base64.b64encode(bytes_str)# bytes use base64encode
print("base64 :", base64_str)
print("bytes :", base64.b64decode(base64_str))# base64decode
encode為編碼,decode為解碼,所以如果要base64編碼,就用base64.b64encode()反之base64.b64decode(),他們傳入的變數型態一樣要為bytes
Output
-----
需from Crypto.Util.number import *
from Crypto.Util.number import *
str = "Zer0cat"
str_bytes = str.encode()# str to bytes
print("bytes :", str_bytes)
###
str_int = bytes_to_long(str_bytes)# bytes to int
print("int :", str_int)
print("bytes :", long_to_bytes(str_int))# int to bytes
語法也很直觀,如果是要bytes轉int就bytes_to_long(),反之long_to_bytes()
還記得在上面writeup問了一個問題嗎,就是為甚麼字串輸出前面有個'b',現在應該有答案了!由以上Output皆可以看出,因為那個字串是bytes型別,所以輸出前面都會有個'b'來表示bytes型別,猜對了嗎XD
-----
如果在linux載vscode的話,可以在terminal打指令 "code",可快速把vscode叫出來
vscode存檔方式
今天差不多到這裡啦~ 明天為encode的統整,感謝觀看~