Crypto 1
棒棒的練習資源
- 編碼
- 古典密碼
- 穿插「ㄧ」點數學
- 流加密
- 對稱式加密
先裝套件
pip install pycryptodome
什麼是編碼
「編碼器(英語:Encoder)是一種將資訊由一種特定格式轉換為其他特定格式的感測器、軟體或是演算法,轉換的目的可能是由於標準化、速度、保密性、保安或是為了壓縮資料。」——維基百科
常見文字編碼
- ASCI
- 用一個 byte 來表示字母、數字、符號,是針對英文設計的,Unicode的最初128個字符與ASCII完全相同 (因為只有了 128 種可能,所以最左邊的 bit 永遠是 0)
- UTF-8
- 用 1~4 bytes 來表示一個字符,也包含了 ASCII 的字符,因為 ASCII 的字符只用 1 byte 表示,所以 UTF-8 能完全兼容原先是 ASCII 編碼的文件
- 容納了各國語言,算是 Unicode 的一種實現方式
- HEX (16 進位)
- Base64
- 用 64 個字符來表示二進位數據,常用於在 URL、Cookie、網頁中傳輸少量二進位數據,常見編碼結果會有 =, ==
Lab - Complex Encoder
要先用 Base64 解碼,再用 HEX 解碼
Lab - F**k Encoder
用 BrainFuck 和 JSFuck 都試試看,然後發現用 JSFuck 解密 Flag 就出來了
古典密碼學
加解密的用途
即便被攔截如果加解密夠好,也能確保密文不被破譯
常見的加解密
- 凱薩密碼
- 簡易替換密碼
-
- 解密方式:頻率分析
-
- 維吉尼亞密碼(Vigenere)
-
-
- 用密鑰長度切分,每一段相同位置的偏移量會相同 (例如上圖的CSASTPK的 K 和 CSASTPI 的 I 同樣都是向右偏移兩格) ,這樣就能分別對相同位置的字幕做頻率分析
- 波雷費密碼 (Playfair)
- 柵欄密碼 (Rail fence)
-
- 密鑰是有幾個
_
Lab - vigenere cipher
線上解密工具
然後找了一下就發現了一個看起來像正確 flag 的字串
Lab - secure substitution
[線上解密工具](secure substitution)
丟上去跑出來的第一個就是 Flag 了
XOR
MOD
Lab - XOR wormup
改一下他的程式碼就可以得到 Flag 了
from Crypto.Random import get_random_bytes
# from flag import FLAG
FLAG = bytes.fromhex("603ad76575ed41dd3fd38be80d6edfdc569e2a324c928741129e210e2c934aa3770ff8d4f0c5340e82d9c0eea5")
def xor_bytes(a, b):
return bytes(x ^ y for x, y in zip(a, b))
random_data = bytes.fromhex("0209e4030e9929b44c8ce29b5216b0ae09ed456d29f3f4386be7585114f22ec2436ecdb795f2506db0bff5dcd8")
result = xor_bytes(FLAG, random_data)
print({result.decode()})
流密碼
隨機數
偽隨機數
線性同餘生成器 (Linear Congruential Generator)
其他常見方法
反饋位移生成器 (Feedback Shift Register)
lab - eof-almost baby prng
lab - easy lcg
lab - eof lf3r
對稱式加密
重點是 使用同一把鑰匙
基本策略
Feistel Network
DES (Data Encryption Standard)
Substitution-Permutation Network
AES (Advanced Encryption Standard)
TODO
之後好好研究一下原理還有把上面三題 lab 做完
參考資料