Định nghĩa cơ bản
Thuật toán AES (Advanced Encryption Standard) là phương pháp mã hóa đối xứng phổ biến nhất hiện nay, trong đó khóa mã hóa và giải mã hoàn toàn giống nhau.
Đặc điểm chính:
- Chia dữ liệu thành khối: Dữ liệu được xử lý theo khối cố định 128 bit (16 byte)
- Độ dài khóa: Hỗ trợ 3 loại khóa 128 bit, 192 bit và 256 bit. Độ dài khóa càng lớn mức độ bảo mật càng cao
Các chế độ mã hóa phổ biến
| Chế độ | Đặc điểm | Ứng dụng |
|---|---|---|
| ECB | Mỗi khối dữ liệu được xử lý độc lập, không cần vector khởi tạo (IV) | Phù hợp với dữ liệu ngắn không có mẫu lặp |
| CBC | Sử dụng IV ngẫu nhiên và liên kết các khối qua phép XOR | Ưu tiên cho dữ liệu nhạy cảm |
| CTR | Cho phép xử lý song song, tạo luồng mã hóa từ bộ đếm | Hiệu quả với dữ liệu lớn |
Ví dụ giải mã ECB
import base64
from Crypto.Cipher import AES
def giai_ma(data, khoa):
cipher = AES.new(khoa.encode(), AES.MODE_ECB)
ma_b64 = base64.b64decode(data)
ban_ro = cipher.decrypt(ma_b64)
return ban_ro[:-ban_ro[-1]].decode()
Phân tích giao diện API
Ví dụ từ một hệ thống thực tế:
{
"data": "U2FsdGVkX1+...",
"secret": "khoamahoa123"
}
Giải mã CBC trong JavaScript:
function giaiMaAES(duLieu, khoa, iv) {
const key = CryptoJS.enc.Utf8.parse(khoa);
const ivParsed = CryptoJS.enc.Utf8.parse(iv);
const decrypted = CryptoJS.AES.decrypt(duLieu, key, { iv: ivParsed });
return decrypted.toString(CryptoJS.enc.Utf8);
}
Vấn đề IV cố định
Khi hệ thống sử dụng vector khởi tạo (IV) không thay đổi:
- Tăng nguy cơ bị tấn công phân tích mẫu
- Dễ bị tấn công replay do tính lặp lại của bản mã
- Giải pháp: Tự động tạo IV ngẫu nhiên cho mỗi phiên mã hóa
Giải mã CBC trong Python
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def giai_ma_CBC(du_lieu_ma_hoa, khoa, iv):
cipher = AES.new(khoa.encode(), AES.MODE_CBC, iv.encode())
ban_ro = unpad(cipher.decrypt(base64.b64decode(du_lieu_ma_hoa)), AES.block_size)
return ban_ro.decode()