Crypto-簡介及ECB
講師:堇姬 @ Izcc-ctf
2023.12.15
堇姬Naup(網管/美宣)
成電二年級/幽夜工作室繪師/台灣好厲駭學員
CKCSC36
DC : naup_sumire_hime
IG : ckcsc36th_naup
涉獵C++、C、python、遊戲(tkinter、pygame)、資安(Web、Crypto)、AI、flask、html/css/js、 PHP、DC bot。
喜歡看輕小說、動畫、Vtuber、打音遊,也喜歡看百合,就是一個長年混跡ACG的宅女。
夢想是可以成為很電的駭客跟繪師,也想自己寫出一個AI老婆。
本日重點
-
密碼學簡介
-
編碼 & 加密 & 雜湊
-
古典密碼學
-
現代密碼學
-
ECB
-
Cut and Paste
密碼學簡介
甚麼是密碼學?
包含各種加解密技術,可以很簡單的看成三大板,編碼類型、古典密碼學、現代密碼學,此區塊通常和其他類型題目結合
需要密碼學!!!
中間傳輸是公開的
msg:安安
-
不是研究怎麼設安全的密碼
-
不是教你怎麼破解別人 Facebook
-
你不會因為知道密碼學在幹嘛就變成天才駭客
-
很多數學
然後密碼學有兩個東西很重要
數學!!!
將題目化成數學問題
1. 加密 Encrypt:指將明文經過某種程序轉換成密文,該程序稱為加密
2. 解密 Decrypt:指將密文經過某種程序轉換成明文,該程序稱為解密
3. 明文 Plaintext:加密前的訊息
4. 密文 Cipertext:加密後的訊息
5. 密碼學演算法:做與密碼學相關程序(如加密、解密、簽章...)的演算法
6. 金鑰 / 密鑰 Key:加解密時所使用的「鑰匙」
1.不要使用保密的密碼算法
2.不使用密碼學加密比用很弱的加密算法更危險
3.任何密碼總有一天會被破解
4.密碼學只是資訊安全的一部分
編碼 & 加密 & 雜湊
jg7LzS3fpcH15kKScqUMdg==(加密->ECB)
TmF1cEpqaW4= (編碼->base64)
9bb2508637df52b17523e4a4a9f727fca1923134a8ace76f09220a3b908e03d2(雜湊->sha256)
感覺都是亂碼,沒什麼差
編碼(encode)
編碼並不會修改資料、也沒有任何加密的效果,單純就是換個方式來呈現
base64
基於64個可列印字元來表示
6Ji/6I6J5o6n
蘿莉控
WIN11娘
V0lOMTHlqJg=
加密(encrypt)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def encrypt_ecb(key, plaintext):
cipher = AES.new(key, AES.MODE_ECB)
padded_plaintext = pad(plaintext.encode('utf-8'), AES.block_size)
encrypted = cipher.encrypt(padded_plaintext)
return base64.b64encode(encrypted).decode('utf-8')
def decrypt_ecb(key, ciphertext):
cipher = AES.new(key, AES.MODE_ECB)
encrypted_bytes = base64.b64decode(ciphertext.encode('utf-8'))
decrypted = cipher.decrypt(encrypted_bytes)
return unpad(decrypted, AES.block_size).decode('utf-8')
if __name__ == "__main__":
key = b'YourSecretKey123'
plaintext = "NaupJjin"
encrypted = encrypt_ecb(key, plaintext)
print("加密後:", encrypted)
decrypted = decrypt_ecb(key, encrypted)
print("解密後:", decrypted)
加密後: jg7LzS3fpcH15kKScqUMdg==
解密後: NaupJjin
密鑰:YourSecretKey123
雜湊(hash)
-
由雜湊值是無法反推出原來的訊息
-
雜湊值必須隨明文改變而改變
-
明文相同出來的雜湊值相同
雜湊像果汁機一樣
訊息
神秘物質
古典密碼學
-
以前用得加密方法,主要可以分為替換式加密及移項式加密
-
古典密碼學主要關注資訊的保密書寫和傳遞
凱薩密碼
柵欄密碼
WE ARE DISCOVERED. FLEE AT ONCE
WECRL TEERD SOEEF EAOCA IVDEN
現在CTF古典密碼學已經很少出現了,不過他做為基礎還是要知道
現代密碼學
-
機密性(Confidentiality):確保訊息只有被授權者才能取得
-
完整性(Integrity):偵測訊息是否遭受竄改
-
身分認證(Authentication):傳送方與接受方需驗證識別
-
不可否認性(Non-Reputation):提供訊息傳送方與接受方的交易證明
不只關注保密性,也包含了防止暴力破解及更關注以下幾點
現代密碼學包含很多
-
block cipher
-
stream cipher
-
RSA
-
hash
-
ECC
......
Block Cipher
區塊加密法
只用同一份 key,把加密文件一次用一個 block 文字進行加密
(本篇皆以一個block 16bytes)
ECB
-
Plaintext(P):明文
-
Ciphertext(C):密文
-
key(K):密鑰
Padding
-
NoPadding
-
ZeroBytePadding
-
PKCS#7 Padding
不填充,如果該block沒有滿,會報錯
所有需要填充的地方都以0填充。
00 00 00 00
每個填充字節的值是用於須填充字節總數
01
02 02
03 03 03
優點
-
實作容易
-
算法簡單
-
加解密快速
缺點
安全性差,相同明文加密出來一樣,容易反推key,且若是圖像加密則加密前後差異不大
Cut and Paste
......role=
user;id=2,msg=12
456789
A
B
C
我可以輸入東西填到msg,並且如果role=admin,id=1,就可以登入管理員
......role=
userv12
admin;
A
B
D
......role=
user;id=2,msg=12
admin;id=1,msg=1
A
B
D
......role=
user;id=2,msg=AA
A
B
D
admin;id=1,msg=1
......role=
A
D
admin;id=1,msg=1
from pwn import *
r = remote('127.0.0.1', 20000)
r.sendlineafter('user = ', 'A' * 11 + '9' * 16 + 'A' * 9)
token = r.recvline().strip().partition(b' = ')[2].decode()
token = bytes.fromhex(token)
token = token[:16] + token[32:48] + token[16:32] + token[48:]
r.sendlineafter('token = ', token.hex())
r.interactive()
Solve
Crypto 1
By naup96321
Crypto 1
- 40