Mật mã đối xứng AES: Chế độ CBC và CTR
I. Tổng quan về Mật mã Đối xứng và AES
Mật mã đối xứng là phương pháp mã hóa mà trong đó một khóa duy nhất được sử dụng cho cả quy trình mã hóa và giải mã. AES (Advanced Encryption Standard) là một trong những tiêu chuẩn phổ biến nhất cho mã hóa dữ liệu trong các ứng dụng bảo mật ngày nay.
II. Chế độ CBC (Cipher Block Chaining) trong AES
1. Giới thiệu về chế độ CBC
Chế độ CBC là một trong những phương thức mã hóa phổ biến được sử dụng với AES. Với chế độ này, mỗi khối plaintext được mã hóa bằng khối khóa trước đó, giúp nâng cao bảo mật và chống lại các loại tấn công nhất định.
2. Thí nghiệm Challenge CTF: ECB CBC WTF
Bài tập này giúp người học thực hành việc giải mã AES-128 với chế độ CBC thông qua một ứng dụng Flask đơn giản. Mã nguồn được cung cấp với hai route: mã hóa và giải mã. Bạn có thể thử nghiệm với mã nguồn để hiểu rõ cơ chế hoạt động.
python
from Crypto.Cipher import AES
KEY = ?
FLAG = ?
@chal.route('/ecbcbcwtf/decrypt/<ciphertext>/')
def decrypt(ciphertext):
ciphertext = bytes.fromhex(ciphertext)
cipher = AES.new(KEY, AES.MODE_ECB)
try:
decrypted = cipher.decrypt(ciphertext)
except ValueError as e:
return {"error": str(e)}
return {"plaintext": decrypted.hex()}
@chal.route('/ecbcbcwtf/encrypt_flag/')
def encrypt_flag():
iv = os.urandom(16)
cipher = AES.new(KEY, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(FLAG.encode())
ciphertext = iv.hex() + encrypted.hex()
return {"ciphertext": ciphertext}
3. Quy trình giải mã
Bằng việc phân tích các khối, người dùng có thể tạo ra một quy trình giải mã hiệu quả thông qua việc sử dụng các phương thức GET và XOR để hồi phục flag từ ciphertext. Dưới đây là một phương thức đơn giản để lấy ciphertext:
python
def get_ciphertext(url, path):
r = requests.get(url = url + path)
response = r.text.strip()
data = json.loads(response)
return data['ciphertext']
III. Chế độ CTR (Counter) trong AES
1. Cơ chế hoạt động
Chế độ CTR được xây dựng dựa trên chế độ ECB nhưng sử dụng một giá trị nonce và biến đếm. Mỗi khi mã hóa một khối mới, biến đếm sẽ tăng lên, cho phép mã hóa song song các khối mà không phụ thuộc vào nhau.
2. Ví dụ thực hiện mã hóa và giải mã
Giống như chế độ CBC, CTR cũng có mã nguồn minh họa cho mã hóa và giải mã bằng Python, giúp bạn dễ dàng thực hành.
python
import json
from base64 import b64encode
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
data = b"viblo security"
key = get_random_bytes(16)
cipher = AES.new(key, AES.MODE_CTR)
ct_bytes = cipher.encrypt(data)
nonce = b64encode(cipher.nonce).decode('utf-8')
ct = b64encode(ct_bytes).decode('utf-8')
result = json.dumps({'nonce':nonce, 'ciphertext':ct})
print(result)
IV. Tấn công Known-plaintext
Tấn công known-plaintext là một kỹ thuật mà kẻ tấn công sử dụng các cặp plaintext-ciphertext đã biết để lấy thông tin về khóa mã hóa. Một ví dụ thực hành từ thử thách CTF cho thấy cách tấn công này có thể được thực hiện bằng cách tận dụng mã độc.
V. Kết luận
Hai chế độ CBC và CTR đều là những phương pháp mã hóa quan trọng trong AES, mỗi phương thức có những ưu điểm và nhược điểm riêng. Việc hiểu rõ về các chế độ này giúp bạn áp dụng chúng một cách hiệu quả trong thực tiễn.
Tài liệu tham khảo
source: viblo