加密
python aes_file_crypto.py enc 1.txt
會輸出 1.txt.enc
解密
python aes_file_crypto.py dec 1.txt.enc
會輸出 1.txt.dec
今天把教學示範拉回「實務+負責任思考」。
我示範了用 LLM 快速生成一個 AES 檔案加解密工具,並把 GitHub 範例(Solomon-77/aes-file-crypto)與 LLM 產出版本 做比較,最後討論可被惡用的風險與藍隊的防護重點。
重點提醒:本文目的是「教育、檢討、與防護」,不是幫助任何人製造或散播惡意軟體。示範程式可用於學習如何正確加密與進行安全設計,切勿在未經授權的情況下對外部系統或他人資料執行加密操作。
這是我丟給 LLM(Ollama / Qwen / ChatGPT 類模型)的 prompt:
請幫我寫一個 Python AES 檔案加解密程式,
支援:
python aes_file.py enc 1.txt
python aes_file.py dec 1.txt.enc
並且使用 SHA256 將輸入密碼雜湊成金鑰。
LLM 迅速回傳了一個可執行的範例(PyCryptodome)。下面把它完整放上,方便做比較與教學。
aes_file.py
)import sys
import os
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from hashlib import sha256
# 將輸入密碼轉成 256-bit 金鑰
def get_key(password):
return sha256(password.encode()).digest()
def pad(data):
pad_len = 16 - (len(data) % 16)
return data + bytes([pad_len]) * pad_len
def unpad(data):
pad_len = data[-1]
return data[:-pad_len]
def encrypt_file(filename, password):
key = get_key(password)
cipher = AES.new(key, AES.MODE_CBC)
with open(filename, "rb") as f:
plaintext = f.read()
ciphertext = cipher.encrypt(pad(plaintext))
out_file = filename + ".enc"
with open(out_file, "wb") as f:
f.write(cipher.iv)
f.write(ciphertext)
print(f"[+] 加密完成: {out_file}")
def decrypt_file(filename, password):
key = get_key(password)
with open(filename, "rb") as f:
iv = f.read(16)
ciphertext = f.read()
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext))
out_file = filename.replace(".enc", "")
with open(out_file, "wb") as f:
f.write(plaintext)
print(f"[+] 解密完成: {out_file}")
if __name__ == "__main__":
if len(sys.argv) < 3:
print("用法: python aes_file.py [enc|dec] filename [password]")
sys.exit(1)
mode, filename = sys.argv[1], sys.argv[2]
password = sys.argv[3] if len(sys.argv) == 4 else input("輸入密碼: ")
if mode == "enc":
encrypt_file(filename, password)
elif mode == "dec":
decrypt_file(filename, password)
else:
print("模式錯誤,請用 enc 或 dec")
# 加密
python aes_file.py enc 1.txt MyPassword
# -> 輸出 1.txt.enc
# 解密
python aes_file.py dec 1.txt.enc MyPassword
# -> 輸出 1.txt
教學時可以示範:使用同一密碼加解密成功,改密碼則會失敗(除非密碼雜湊結果相同)。
主題 | 重點說明 |
---|---|
AES | 對稱式加密演算法;速度快,常用於檔案與通訊加密。選擇模式(CBC/EAX/GCM)會影響保密性與完整性保障。 |
SHA-256 | 雜湊演算法,不可逆;常用來把任意長密碼轉為固定長度金鑰(但需注意 salt/衍生函數以抵抗暴力破解)。 |
EAX / CBC / GCM | EAX / GCM 提供 authenticated encryption(同時提供機密性與完整性);CBC 必須搭配 MAC(如 HMAC)否則易遭改寫攻擊。 |
密鑰管理 | 密碼、金鑰不可硬編碼;應使用 KMS、硬體模組或使用者在安全環境輸入並避免寫入磁碟。 |
完整性 | 單純的 AES-CBC 沒有內建完整性驗證。實務應用請使用 AEAD(如 AES-GCM / AES-EAX)或加 HMAC 驗證。 |
部署/使用 | 在自動化環境避免明碼密碼參數;改用環境變數、受控金鑰存取、或使用 OS keyring。 |
GitHub 範例亮點(原始你給的)
LLM 版本亮點
教育角度總結
AI 幫你快速產生加密程式是好事,但它也降低了惡意行為的技術門檻。以下是我在課堂上會強調的防護方向(藍隊視角):
檢測可疑行為
.enc
的模式/短時間內大量 I/O。控制與限制程式執行權限
金鑰管理與秘密保護
網路層面防護(避免傳播)
若你想把 LLM 版變成「教學且較安全的版本」,可採取以下改進(示意):
getpass.getpass()
或環境變數來安全輸入密碼(不要在 CLI 命令列明碼傳遞)。範例檢查指令(示意):
# Nmap 檢查 SMB protocols
nmap --script smb-protocols -p445 192.168.0.0/24
# Windows 關閉 SMBv1 (PowerShell)
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol
(上述指令用於審計/防護,請在授權範圍內執行)
可以在內訓時讓學員實際與 LLM 互動的 prompt:
請寫一個 Python 程式,支援 `python aes_file.py enc filename` 與 `python aes_file.py dec filename`,
使用 SHA256 或 PBKDF2 將密碼衍生成金鑰,並使用 AES-GCM(AEAD)以確保完整性。請把 salt/iv/tag 與 ciphertext 一起寫入輸出檔案的前段。
以下是一段 AES 加解密程式,請檢查是否有安全風險,列出至少 5 項改進建議,不要提供可直接被濫用的惡意程式碼。
請根據上面程式,設計一個 45 分鐘的實作教學大綱,包括示範步驟、練習題、與防護討論主題。