src: 天下女人心 某一集
資芽北區2023 講師YuKai 洪郁凱
除了Crypto之外…
What is CTF
Capture the Flag
What is CTF
(jeopardy-style challenges)
What is CTF
format:FLAG{...}
flag = "" # Unknown cipher = flag[::-1] print(cipher) # "}5u03gr0G_5i_n1aK{GALF"
format:FLAG{...}
flag = "" # Unknown cipher = flag[::-1] print(cipher) # "}5u03gr0G_5i_n1aK{GALF"
answer: FLAG{Ka1n_i5_G0rg30u5}
密碼學 Cryptography
study of techniques for secure communication in the presence of adversarial behavior.
凱薩密碼 Caesar
assume key = 2
"A" => "C"
"B" => "D"
"X" => "Z"
"Y" => "A"
...
給定字串跟一個key(-25~25)
根據key產生/解開結果字串
Hint:
str.upper() ord("A") chr(65)
試著加密以下字串
"Sprout" # Key = 3 "Taylor Swift" # Key = 13 "Gnlybe Fjvsg" # Key = 13
When key = 13, it's ROT13!
凱薩密碼 Caesar
Weakness
將0-9,a-z隨意塞在6x6的方格內
當作加密的key
將要加密的英數字串全轉為小寫
並拆成兩兩一組,按照下列規則插入X
舉例:
happy2023
ha px py 2023
開始加密!
每組字都可能:
在不同行與列
各自換成同列的另個角落
ha => do
px => lu
23 => 6b
在同列不同行
各自換成同列右一個字
ut => xb
在同行不同列
各自換成同行下一個字
p1 => 1u
最後把各組字接起來就完成了!
doluh1wb6b
腦力激盪:怎麼把他還原呢?
不同行不同列 => 不同行不同列
同行不同列 => 同行不同列
不同行同列 => 不同行同列
不同行不同列 => 一樣找各自角落
同行不同列 => 往上找
不同行同列 => 往左找
從伺服器拿到加密用的訊息
試圖解出正確密碼並拿到Flag!
連上遠端機器用的工具
nc mercury.picoctf.net 21003
pwntools也有對應的工具幫忙收發訊息
from pwn import * conn = remote('mercury.picoctf.net', 21003) alphabet = conn.recvuntil("\n") # 接收直到換行 # alphabet = conn.recvline() alphabet = alphabet.decode() # 將Byte轉換成字串 方便操作 ... conn.sendline(msg) # 放字串
看扣時間!
修改加密步驟
得到Flag了!
超有名且泛用的加密方式
(應該只能大致講過)
為何有用?
:因數分解很難算
運作方式
Alice <--明文訊息-- Bob
不安全!
Alice --公鑰--> 其他人 + Bob
(拿著私鑰)
Alice負責生出公私鑰
發給其他人鎖頭
Alice <--用公鑰加密後的訊息-- + Bob
(拿著私鑰)
Alice用私鑰解密訊息
全世界只有Alice有私鑰能解密!
Alice如何製作公私鑰?
步驟:
加密
假設要傳送一串數字c,公鑰\((N,e)\)
加密後為\(enc=c^{e}{\bmod {N}}\)
解密
收到加密後的\(enc\)後,私鑰\((N,d)\)
還原數字\(c={enc}^{d}{\bmod {N}} = {c}^{ed}{\bmod {N}}\)
為何能解密?
\(c = {enc}^{d}{\bmod {N}} = enc=c^{ed}{\bmod {N}}\)
\(ed{\bmod {N}} = 1, ed - 1\)為N的倍數
為何能解密?
Euler定理:\(a^{c*N}{\bmod {N}} = 1\)
a跟N互質,c為任意整數
\(c^{ed}{\bmod {N}} = c * c^{hN} {\bmod {N}} = c * 1 {\bmod {N}}\)
更多正確性細節可以參考Wiki
flag ** 3 mod N = enc
flag ** 3 = t*N + enc
判斷是否為e次方的數字
Tool:gmpy2.iroot(n, e)
你們好棒!