密碼學基礎知識總結
一、Base編碼
1. Base系列特征
編碼類型 | 字符集 | 特征 |
---|---|---|
Base16 | 0-9, A-F | 密文長度偶數 |
Base32 | A-Z, 2-7 | 包含數字2-7 |
Base64 | a-z,0-9,+,/,= | 密文長度是8的倍數 |
Base36 | A-Z,0-9 | 僅支持整數加密 |
Base91 | 0-9,a-z,A-Z,特殊符號 | 高密度編碼 |
Base100 | Emoji表情 | 表情符號組成 |
2. 典型題型
- 疊套加密:多次Base編碼嵌套(如HNCTF 2022 Week1題目)
- 換表加密:自定義字符映射表(如BJDCTF 2020題目)
# 換表解密示例 custom_table = "J K L M N O x y U V z A B C D E F G H 7 8 9 P Q I a b c d e f g h i j k l m W X Y Z 0 1 2 3 4 5 6 R S T n o p q r s t u v w + / =" standard_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" cipher = "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw"# 構建轉換字典 trans = str.maketrans(custom_table, standard_table) standard_cipher = cipher.translate(trans) print(base64.b64decode(standard_cipher))
二、古典密碼
1. 替換密碼
- 凱撒密碼:位移變換
# 凱撒解密腳本 def caesar_decrypt(cipher, shift):return ''.join([chr((ord(c)-ord('A')-shift)%26+ord('A')) if c.isupper() else chr((ord(c)-ord('a')-shift)%26+ord('a')) for c in cipher])
- 埃特巴什碼:字母表鏡像映射(A?Z, B?Y…)
- 簡單替換:隨機字母映射(需詞頻分析破解)
2. 移位密碼
- 柵欄密碼:
明文: THEQUICKBROWNFOX 2欄柵欄: T E U C B O N F XH Q I K R W O 密文: TEUCBOFNXHQIKRWO
- Playfair密碼:5×5矩陣雙字母加密
- 維吉尼亞密碼:多表替換(需卡西斯基試驗破譯)
3. 特殊編碼
- 社會主義核心價值觀編碼:中文詞語映射
- 豬圈密碼:符號替代(如SWPUCTF 2021題目)
三、近代密碼
1. Enigma機
- 德國二戰加密設備,通過轉子機械實現多表替換
四、現代密碼
1. 對稱密碼
算法 | 密鑰長度 | 模式 | 特點 |
---|---|---|---|
DES | 56位 | ECB/CBC | 已不安全 |
3DES | 168位 | 三重加密 | 仍在使用 |
AES | 128/192/256位 | ECB/CBC/GCM | 主流加密標準 |
# AES加密示例
from Crypto.Cipher import AES
key = b'16byteslongkey!!'
cipher = AES.new(key, AES.MODE_ECB)
ciphertext = cipher.encrypt(b'SecretMessage16') # 需填充至16字節倍數
2. 非對稱密碼
-
RSA算法:
- 密鑰生成:( n = p \times q ), ( \phi(n)=(p-1)(q-1) ), 選擇e使( gcd(e,\phi(n))=1 ), 計算d滿足( ed \equiv 1 \mod \phi(n) )
- 加密:( c \equiv m^e \mod n )
- 解密:( m \equiv c^d \mod n )
# RSA解密示例 from Crypto.Util.number import long_to_bytes p = 152276107194759839394339252953668929833379494272797635215678777394989176086311370136035478447887926444275784082066390686965320698243113804043171803008108957334907494436138284735908220245791716231134027668300903468613086977898318244422816904811663818867009341751581380232066351461067404386138711392602905182327 q = 165862216368738151171691047077971125385823304861583668749112440485286071513555171553668744837558717911342949436706045003893101207778257828156155579957939073590381726467515305197248665285721804095245979532718423232742857246879254699058634781094524194465195004455721760308439281036465034307352501227102299122599 e = 65537 c = 8714149934588122613890609205826559063957396235456334581066750104141833387128819259074228632737215784067681665337373847122241506740977460425676706234123688048971299968252735566083061567386357327514300746902937654004543191945690400727133317228366779579116882233771039719002815276546167694160681831378762223177951840415429867605824997691072569915435484862548063841182891523397571914055707256503122950455644515402154037908557382756498138387988939464887512595990270123841900640997837144301259531459279512993819808359480410211723491073722980281648910041025010174785548169983002872841283535091066006242941399443173584257860n = p * q phi = (p-1)*(q-1) d = pow(e, -1, phi) print(long_to_bytes(pow(c, d, n)))
-
ECC算法:基于橢圓曲線離散對數問題
3. 哈希函數
算法 | 輸出長度 | 特性 |
---|---|---|
MD5 | 128位 | 已破解,不安全 |
SHA-1 | 160位 | 逐漸淘汰 |
SHA-256 | 256位 | 主流安全標準 |
- MD5碰撞示例:
import hashlib hashlib.md5(b"message").hexdigest() # 輸出32位16進制字符串
五、攻擊技術
-
密碼分析:
- 差分分析(針對DES)
- 線性分析(針對AES)
- 模數分解(針對RSA)
-
側信道攻擊:
- 計時攻擊(RSA加密時間差異)
- 功耗分析(智能卡攻擊)
-
工具推薦:
- 在線解碼:CyberChef
- 哈希查詢:CMD5
- 密碼破解:Hashcat
建議配合實際CTF題目進行練習,重點關注:
- Base編碼的層層嵌套
- 古典密碼的詞頻分析
- RSA各攻擊場景的實現
- 現代密碼庫的正確調用方式