---
# System prepended metadata

title: Encoding
tags: [筆記]

---

# Encoding
||其實以下為我的教課文字檔||

編碼貌似常被歸在crypto?
但在general skill就很常看到了
算某種CTF的基本知識?

一些奇奇怪怪的編碼就不是很想說了
||遇到再查||


## bytes
* 表示二進制數據的資料型別
* 在密碼學中，尤其是 RSA 等演算法中，常需在 bytes 與大數（整數）間轉換

py用變數儲存bytes型別 : `b_data = b"hello"`
bytes to string : `var1.decode()`
string to bytes : `var2.encode("utf-8")`
bytes to hex-string : `var3.hex()`
hex-string to bytes : `bytes.fromhex(var4)`

### bytes ⇆ integer

將 bytes 轉換為整數 : `int.from_bytes(bytes, byteorder)`
將整數轉換為 bytes : `int.to_bytes(length, byteorder)`

byteorder：指定字節序（'big' 或 'little'）
大端序（Big Endian）：數字的高位字節存儲在前面（左邊）。
小端序（Little Endian）：數字的低位字節存儲在前面（左邊）。
🌰
``` py
# 收到的 bytes 數據
data = b'\x00\x00\x01\x02'

# 解讀成一個整數（假設是大端序）
value = int.from_bytes(data, byteorder='big')
print(f"解讀的整數值是：{value}")  # 輸出：258

# 再轉回 bytes
converted = value.to_bytes(4, byteorder='big')
print(f"轉換回 bytes：{converted}")  # 輸出：b'\x00\x00\x01\x02'

```

另一種常用於密碼學的方式(預設為big)
``` py
from Crypto.Util.number import  # 從 Crypto.Util.number 模組中引入所有函數和工具
bytes_to_long() #將位元組序列（bytes）轉換為長整數（long integer）
long_to_bytes() #將長整數（long integer）轉換為位元組序列（bytes）
```

## hex
* Hexadecimal，也就是base16
* 轉換為ASCII時，每兩個十六進位數字對應一個ASCII字符

🌰轉換過程:
Hexadecimal: 48 65 6C 6C 6F
Step-by-Step Conversion:
48 (十六進位) → 72 (十進位) → H (ASCII字符)
65 (十六進位) → 101 (十進位) → e (ASCII字符)
6C (十六進位) → 108 (十進位) → l (ASCII字符)
6C (十六進位) → 108 (十進位) → l (ASCII字符)
6F (十六進位) → 111 (十進位) → o (ASCII字符)
Result: 48 65 6C 6C 6F 轉換為 ASCII 為 Hello

**用py轉換**
`bytes.fromhex() `: 將一個十六進制字符串轉換為 bytes 類型
`.hex() `: 將 bytes 類型的數值轉換為一個十六進制字符串


## Base16 / Base32 / Base64
把字串轉成數字後依照 base size 去對應 encode 的字母
Base16：0-9 A-F (hex)
Base32：2-7 A-Z
Base64：0-9 A-Z a-z +/

py要先`import base64`
b32加密:`base64.b32encode(var1.encode()).decode()`
b32解密:`base64.b32decode(var2.encode()).decode()`
b64加密:`base64.b64encode(var3.encode()).decode()`
b64解密:`base64.b64decode(var4.encode()).decode()`

⭐ 括號內要是bytes型別 ， 此處var皆為string


## ASCII
* 全稱為American Standard Code for Information Interchange，美國標準資訊交換碼
* 基於拉丁字母的一套電腦字元編碼標準
* 局限在於只能顯示26個基本拉丁字母、阿拉伯數字和英式標點符號，因此，現在的軟體系統大多採用Unicode

**可以用py轉換**
`chr(數字)`:ASCII轉字元
`ord(字元)`:字元轉ASCII
<div class="sl-block is-focused" data-block-type="image" data-name="image-cbbad2" style="width: 555.465px; height: 368.863px; left: 705.171px; top: 342.416px; min-width: 1px; min-height: 1px;" data-origin-id="78af7b40743062c95cbc903775633bd0"><div class="sl-block-content" style="z-index: 13;"><img class="" data-natural-width="1536" data-natural-height="1020" data-lazy-loaded="" src="https://s3.amazonaws.com/media-p.slid.es/uploads/2705601/images/11966760/pasted-from-clipboard.png"></div></div>


## xor
* XOR（Exclusive OR 異或）是一種位元運算，常用於密碼學和資料處理
* XOR 的運算規則是：兩個輸入位相同時，結果為0；兩個輸入位不同時，結果為1
* Commutative (交換率)：A ⊕ B = B ⊕ A
* Associative (結合率)：A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
* Identity (恆等律)：A ⊕ 0 = A
* Self-Inverse (自反律)：A ⊕ A = 0
* Double Application (雙重應用)：如果將相同的數字進行兩次 XOR，會回到原始數值：(A ⊕ B) ⊕ B = A
**py內建函式庫:**
``` py
from pwn import xor
result=xor('label',13) #使用pwn.xor會得到bytes型別的結果
```
## Morse Code
* 一種時通時斷的訊號代碼，通過不同的排列順序來表達不同的英文字母、數字和標點符號
* 長度與字元出現的頻率成反比

解碼:
[文字](https://morsecode.world/international/translator.html)
[音檔](https://databorder.com/transfer/morse-sound-receiver/)
<div class="sl-block is-focused" data-block-type="image" data-name="image-bc0c54" style="width: 436.687px; height: 532.826px; left: 843.313px; top: 187.174px; min-width: 1px; min-height: 1px;" data-origin-id="f3a8f02a953b073ac3ca787d5e07db0d"><div class="sl-block-content" style="z-index: 14;"><img class="" data-natural-width="473" data-natural-height="610" data-crop-x="0" data-crop-y="0" data-crop-width="1" data-crop-height="0.946121" style="left: 0px; top: 0px; width: 437px; height: 563px;" data-lazy-loaded="" src="https://s3.amazonaws.com/media-p.slid.es/uploads/2705601/images/11994784/pasted-from-clipboard.png"></div></div>


# 參考資料
[ASCII vs. Unicode: A full tutorial](https://spectralops.io/blog/ascii-vs-unicode-a-full-tutorial/)
[密碼學小白的學習之路 系列](https://ithelp.ithome.com.tw/m/users/20168165/ironman/7247)
[資安小白的密碼學從0到1-CryptoHack平台解題紀錄 系列](https://ithelp.ithome.com.tw/users/20162613/ironman/6498)
[SCIST Week 3 (11/16) & Week 4 (11/30) - Crypto](https://hackmd.io/@SCIST/S5_ALL/https%3A%2F%2Fhackmd.io%2F%40SCIST%2FH1wdVfEbyl)