學習密碼學,不只是理解公式,更重要的是 動手實驗。在 Linux 環境下,我們可以利用許多現成工具來加密、解密,這對 CTF 實戰或學習密碼學都有幫助。
以下會依序介紹
原理:將字母依照固定位移 (shift) 來替換,例如位移 3:
tr
):# 把字母往後移 3 個
echo "HELLO" | tr 'A-Z' 'D-ZA-C'
輸出:
KHOOR
解密時,只要位移回去:
echo "KHOOR" | tr 'D-ZA-C' 'A-Z'
輸出:
HELLO
原理:A ↔ Z,B ↔ Y,C ↔ X … 也就是字母對調。
tr
):echo "HELLO" | tr 'A-Z' 'Z-A'
輸出:
SVOOL
原理:自己定義一個替換表,例如 A → Q,B → W …。
tr
):# 定義替換表 (A→Q, B→W, C→E ...)
echo "HELLO" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'QWERTYUIOPASDFGHJKLZXCVBNM'
輸出:
ITSSG
這種加密方式比較複雜,無法只靠 tr
,但可以用 Python one-liner:
echo "KHOOR" | python3 -c "import sys;from itertools import cycle;key='KEY';ct=sys.stdin.read().strip();print(''.join(chr(((ord(c)-65)-(ord(k)-65))%26+65)for c,k in zip(ct,cycle(key))))"
現代密碼學講究強度和演算法,Linux 上常用的工具是 OpenSSL、GPG。
雖然不是加密,但在 CTF 常見。
編碼 :
# 編碼
echo "hello" | base64
輸出:
aGVsbG8=
解碼 :
# 解碼
echo "aGVsbG8=" | base64 -d
輸出:
hello
加密:
echo "mysecret" | openssl enc -aes-256-cbc -a -salt -pass pass:password123
輸出 (範例,會隨機):
U2FsdGVkX1+aL5fj...
解密:
echo "U2FsdGVkX1+aL5fj..." | openssl enc -aes-256-cbc -a -d -pass pass:password123
輸出:
mysecret
產生金鑰:
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
加密:
echo "flag{secret}" | openssl rsautl -encrypt -pubin -inkey public.pem | base64
解密:
echo "..." | base64 -d | openssl rsautl -decrypt -inkey private.pem
# 加密
gpg -c secret.txt
# 解密
gpg secret.txt.gpg