iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Security

資安小白的密碼學從0到1-CryptoHack平台解題紀錄系列 第 3

【Day 3】Introduction to CryptoHack 02 – Encode

  • 分享至 

  • xImage
  •  

前言

這篇的主要會是以Writeup呈現,下一篇會去做統整,包含常用python語法跟進制轉換。好,那麼就開始繼續解題吧,今天的目標為以下四題GOGO!( •̀ ω •́ )y
https://ithelp.ithome.com.tw/upload/images/20230913/2016261339RUDpPkUU.png

解題網址 : https://cryptohack.org/courses/intro/enc1/

Writeup

-----

[ASCII]

題目

網址 : https://cryptohack.org/courses/intro/enc1/
https://ithelp.ithome.com.tw/upload/images/20230913/20162613OCbDw6nWE4.png

思路

根據題目,那些整數為ASCII碼,而我們要把那些整數轉換成我們看得懂的,下方的提示得知,可以利用python中的chr()來轉換,也就是數字轉字符

解法

把題目給的數字以陣列存取,之後利用for迴圈跑,一個個轉換後輸出

  • Code
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
    https://ithelp.ithome.com.tw/upload/images/20230913/20162613QlHJx8j5sI.png

    flag : crypto{ASCII_pr1nt4bl3}

-----

[Hex]

題目

網址 : https://cryptohack.org/courses/intro/enc2/
https://ithelp.ithome.com.tw/upload/images/20230913/20162613h8a2R43Pur.png

思路

題目是給一串16進制的字串,我們的目標是要把它轉成bytes形式,可利用提示給的bytes.fromhex()來實現

解法

  • 直接上code!
a = "63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d"
print(bytes.fromhex(a))
  • 得到flag

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613NJAAtCv6aN.png

    flag : crypto{You_will_be_working_with_hex_strings_a_lot}
    為什麼輸出的字串前面有個’b’呢+_+,可以想看看XD,後面的會提到!

-----

[Base64]

題目

網址 : https://cryptohack.org/courses/intro/enc3/
https://ithelp.ithome.com.tw/upload/images/20230913/20162613bU6lnn98kK.png

思路

題目一樣是給16進制的字串,最後目標要把它以base64編碼,但因為base64.b64encode()傳入的型態要為bytes形式,所以我們需要先把字串變成bytes形式,之後再以base64編碼

解法

先利用上一題所學, 把hex字串轉bytes後再base64編碼

  • Code
import base64

a = "72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
a = bytes.fromhex(a)
print(base64.b64encode(a))

也可以簡化成這樣

import base64

a = "72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"
print(base64.b64encode(bytes.fromhex(a)))
  • 得到flag

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613iH6RUvHHVj.png

    flag : crypto/Base+64+Encoding+is+Web+Safe/

-----

[Bytes and Big Integers]

題目

網址 : https://cryptohack.org/courses/intro/enc4/
https://ithelp.ithome.com.tw/upload/images/20230913/201626139jMIJlhJQ2.png

思路

題目給了例子(HELLO)和它被編碼後會長怎樣,之後題目要我們把它給的這個整數變回message,可利用提示的long_to_bytes ()來實現

解法

  • Code如下
from Crypto.Util.number import *
a = 11515195063862318899931685488813747395775516287289682636499965282714637259206269
print(long_to_bytes(a))
  • 得flag

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613arqhdZy87Q.png

    flag : crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}

-----

小結

今天學到了編碼、型態轉換和多認識了python語法

-----

int & chr轉換

  • code
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

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613qrIqP9cx69.png

查ASCII表發現的確如此(65 - > A)
ASCII Table : https://www.rapidtables.com/code/text/ascii-table.html
https://ithelp.ithome.com.tw/upload/images/20230913/20162613Pm5LvaNAg5.png

-----

Bytes & hexstr轉換

  • code
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

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613K6zQGDYEwY.png

-----

函式庫

import base64
from Crypto.Util.number import *

-----

base64編碼

需import base64

  • code
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

    https://ithelp.ithome.com.tw/upload/images/20230913/20162613d5fo6qNX8f.png

-----

int&bytes轉換

需from Crypto.Util.number import *

  • code
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()

  • Output
    https://ithelp.ithome.com.tw/upload/images/20230913/20162613H08w3zD1ix.png

還記得在上面writeup問了一個問題嗎,就是為甚麼字串輸出前面有個'b',現在應該有答案了!由以上Output皆可以看出,因為那個字串是bytes型別,所以輸出前面都會有個'b'來表示bytes型別,猜對了嗎XD

-----

小技巧

  • 如果在linux載vscode的話,可以在terminal打指令 "code",可快速把vscode叫出來
    https://ithelp.ithome.com.tw/upload/images/20230913/20162613fpdt6X0tqf.png

  • vscode存檔方式

    • 左上角按file - > Save
    • 快捷鍵Ctrl + S
      https://ithelp.ithome.com.tw/upload/images/20230913/20162613aUmrW4ZEnx.png
    • 開自動存檔(超方便!!,之後就不用每改一次就要去按Save一次,懶人福音R)
      • 左上角按file - > Auto Save,打勾代表成功開啟!
        https://ithelp.ithome.com.tw/upload/images/20230913/20162613C69pABkx4C.png

今天差不多到這裡啦~ 明天為encode的統整,感謝觀看~


上一篇
【Day 2】平台介紹&Introduction to CryptoHack 01
下一篇
【Day 4】Encode統整筆記
系列文
資安小白的密碼學從0到1-CryptoHack平台解題紀錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言