AES (Advanced Encryption Standard) là một thuật toán mã hóa khối đối xứng được Viện Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ (NIST) thông qua vào năm 2001 làm tiêu chuẩn chính thức. AES đã thay thế DES lỗi thời và từ đó trở thành thuật toán mã hóa phổ biến nhất trên thế giới, được sử dụng từ hệ thống ngân hàng đến ứng dụng di động. Theo NIST (2023), AES cung cấp độ bảo mật tương đương 2^256 thao tác cho khóa 256 bit, khiến nó bất khả xâm phạm trước các cuộc tấn công vét cạn hiện đại. NIST FIPS 197, 2023
Những điểm chính
AES (Advanced Encryption Standard) là một mã hóa khối đối xứng được phát triển bởi các nhà mật mã học người Bỉ Joan Daemen và Vincent Rijmen dưới tên Rijndael. Năm 2001, NIST đã chọn Rijndael là người chiến thắng trong cuộc thi tìm kiếm tiêu chuẩn mã hóa mới của Hoa Kỳ sau năm năm thử nghiệm và phân tích công khai. AES hoạt động với các khối dữ liệu có kích thước cố định (128 bit) và hỗ trợ ba độ dài khóa: 128, 192 và 256 bit. Số vòng biến đổi phụ thuộc vào độ dài khóa: 10 vòng cho khóa 128 bit, 12 cho khóa 192 bit và 14 cho khóa 256 bit. Mỗi vòng bao gồm bốn thao tác: SubBytes (thay thế byte phi tuyến qua S-box), ShiftRows (dịch chuyển hàng theo vòng), MixColumns (trộn cột) và AddRoundKey (XOR với khóa vòng).
Sự phát triển của AES bắt đầu vào năm 1997 khi NIST công bố cuộc thi thay thế DES, khóa 56 bit của nó đã bị phá vỡ trong 22 giờ vào năm 1998 trên thiết bị chuyên dụng Deep Crack. Mười lăm thuật toán từ nhiều quốc gia khác nhau đã tham gia, bao gồm Serpent (Vương quốc Anh), Twofish (Mỹ) và RC6 (Mỹ). Đến vòng chung kết năm 1999, còn lại 5 ứng cử viên. Rijndael đã chiến thắng nhờ sự kết hợp giữa tốc độ cao trên tất cả các nền tảng (từ vi điều khiển 8 bit đến máy chủ 64 bit), khả năng chống phân tích mật mã và triển khai phần cứng nhỏ gọn. Từ năm 2006, AES được sử dụng để mã hóa dữ liệu được phân loại SECRET và TOP SECRET trong các hệ thống chính phủ Mỹ. Ngày nay, AES được tích hợp trong tất cả các giao thức chính: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 và Bluetooth BR/EDR.
AES xử lý dữ liệu theo khối 128 bit (16 byte), được tổ chức dưới dạng ma trận 4x4 byte gọi là state. Mỗi vòng mã hóa thực hiện một chuỗi các biến đổi tất định, tạo ra hiệu ứng tuyết lở: thay đổi một bit dữ liệu đầu vào sẽ thay đổi khoảng 50% bit đầu ra. Hiệu ứng này làm cho AES có khả năng chống lại phân tích mật mã vi phân và tuyến tính — các phương pháp chính để phá vỡ mã hóa khối.
Quá trình bắt đầu với AddRoundKey — XOR khóa ban đầu với state. Sau đó các vòng được thực thi: SubBytes thay thế mỗi byte state bằng một giá trị từ S-box (bảng thay thế). ShiftRows dịch chuyển theo vòng hàng thứ hai 1 vị trí, hàng thứ ba 2, hàng thứ tư 3 — đảm bảo sự trộn lẫn giữa các cột. MixColumns nhân mỗi cột state với một ma trận cố định trong trường Galois GF(2^8), tạo ra sự phụ thuộc của mỗi byte đầu ra vào tất cả bốn byte đầu vào của cột. AddRoundKey thực hiện XOR với khóa vòng tiếp theo, được dẫn xuất từ khóa gốc thông qua Key Expansion. Vòng cuối cùng không có thao tác MixColumns. Giải mã sử dụng các thao tác nghịch đảo InvSubBytes, InvShiftRows, InvMixColumns và AddRoundKey theo thứ tự ngược lại. Đối với các nhà phát triển di động, không cần hiểu cấu trúc bên trong của AES — chỉ cần biết cách gọi API tích hợp của nền tảng một cách chính xác với các tham số phù hợp.
Đặc điểm chính của AES đảm bảo sức mạnh mật mã của nó là hiệu ứng tuyết lở. Thay đổi một bit trong văn bản gốc hoặc khóa dẫn đến thay đổi khoảng 50% bit của bản mã, làm cho AES cực kỳ chống lại phân tích mật mã vi phân và tuyến tính. Sự kết hợp của SubBytes (phi tuyến qua S-box) và MixColumns (khuếch tán qua phép nhân trường Galois) tạo ra độ phức tạp toán học đến mức ngay cả khi biết một phần bản mã cũng không thể khôi phục khóa nhanh hơn vét cạn. Theo phân tích của NIST (2018), cuộc tấn công nổi tiếng nhất vào AES-128 — tấn công biclique — chỉ làm giảm độ dài khóa hiệu quả 2 bit (xuống 126.2 bit), không mang lại lợi thế thực tế cho kẻ tấn công. Đối với AES-256, không có cuộc tấn công nào khả thi về mặt thực tế vượt quá vét cạn.
AES hỗ trợ ba kích thước khóa, mỗi kích thước tương ứng với một mức độ mạnh mật mã cụ thể. Việc chọn kích thước khóa ảnh hưởng đến bảo mật, hiệu suất và yêu cầu tài nguyên thiết bị.
| Kích thước khóa | Số vòng | Mức bảo mật | Ứng dụng |
|---|---|---|---|
| AES-128 | 10 | 128 bit | Ứng dụng thương mại, TLS |
| AES-192 | 12 | 192 bit | Hệ thống chính phủ (SECRET) |
| AES-256 | 14 | 256 bit | TOP SECRET, lĩnh vực tài chính |
Quy tắc thực tế: cho ứng dụng di động, sử dụng AES-256 theo mặc định. Sự khác biệt về hiệu suất giữa AES-128 và AES-256 trên các thiết bị hiện đại có hỗ trợ AES-NI không quá 10–15%, nhưng mức bảo mật tăng gấp đôi. Theo phân tích lượng tử (Grassl et al., 2016), việc phá vỡ AES-128 sẽ cần 2^77 thao tác lượng tử thông qua thuật toán Grover, trong khi AES-256 cần 2^149, làm cho AES-256 có khả năng chống lại các cuộc tấn công lượng tử trong 20–30 năm tới. Ngay cả AES-128 cũng cung cấp đủ bảo vệ cho phần lớn các kịch bản thương mại: theo ước tính của Bruce Schneier, việc vét cạn khóa 128 bit sẽ cần nhiều năng lượng hơn tồn tại trong vũ trụ. Tuy nhiên, các tiêu chuẩn bảo mật (GDPR, HIPAA, PCI DSS) thường yêu cầu rõ ràng AES-256, do đó các dự án sản xuất nên sử dụng độ dài khóa tối đa.
AES như một mã hóa khối mã hóa các khối có kích thước cố định (128 bit). Để mã hóa dữ liệu có độ dài tùy ý, các chế độ hoạt động được sử dụng. Việc chọn chế độ ảnh hưởng nghiêm trọng đến bảo mật: chế độ sai có thể vô hiệu hóa sức mạnh của AES.
Cho các dự án di động, sử dụng AES-256-GCM với nonce 12 byte. GCM giải quyết đồng thời hai vấn đề: mã hóa dữ liệu và xác thực, ngăn chặn các cuộc tấn công padding oracle và chosen ciphertext. Android Keystore và iOS CryptoKit hỗ trợ AES-GCM nguyên bản mà không cần các nguyên hàm mật mã bổ sung. Khi làm việc với GCM, điều quan trọng là không bao giờ sử dụng lại nonce với cùng một khóa — điều này phá hủy hoàn toàn bảo mật mã hóa. Tạo một nonce ngẫu nhiên mới cho mỗi lần mã hóa và lưu trữ nó cùng với bản mã.
Hãy xem xét một ví dụ về triển khai AES-256-GCM an toàn trên Android sử dụng Jetpack Security. Đoạn mã dưới đây minh họa chu trình đầy đủ: tạo khóa AES-256 qua MasterKey, mã hóa và giải mã một chuỗi với dữ liệu xác thực bổ sung (AAD).
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val securePrefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
fun storeSecureData(key: String, value: String) {
securePrefs.edit().putString(key, value).apply()
}
fun readSecureData(key: String): String? {
return securePrefs.getString(key, null)
}
Đặc điểm chính của giải pháp này là AES-256-GCM được sử dụng ở hai cấp độ: để mã hóa các cặp khóa-giá trị (PrefValueEncryptionScheme) và để bảo vệ chính tên khóa (PrefKeyEncryptionScheme sử dụng AES-256-SIV, chống lại việc sử dụng lại nonce). MasterKey được tạo bằng thuật toán AES-256-GCM và được lưu trữ trong Android Keystore, được bảo vệ bằng phần cứng trên các thiết bị có Trusted Execution Environment. Trên các thiết bị không có hỗ trợ phần cứng (TEE), khóa được mã hóa qua Bouncy Castle, vẫn an toàn hơn so với lưu trữ trong SharedPreferences.
Để mã hóa trực tiếp khối lượng dữ liệu lớn (ví dụ: hình ảnh hoặc tệp), sử dụng AES-256-GCM qua EncryptedFile từ AndroidX Security. Để xuất khóa (ví dụ: sao lưu), sử dụng mã hóa bổ sung với mật khẩu người dùng qua PBKDF2 với 100000+ vòng lặp.
Trên iOS, các thao tác AES được tổ chức qua framework CryptoKit (Swift 5.0+). Khóa AES-256 được tạo qua SymmetricKey(size: .bits256) và được lưu trữ trong Secure Enclave — một bộ xử lý mật mã phần cứng cách ly với CPU chính và hệ điều hành. CryptoKit cung cấp hai triển khai AES: AES.GCM (được khuyến nghị) và AES.CBC (để tương thích ngược với các định dạng cũ). Mã hóa được thực hiện qua phương thức seal(), nhận dữ liệu, khóa và nonce (12 byte), và trả về AES.GCM.SealedBox — một cấu trúc chứa bản mã và thẻ xác thực. Giải mã qua open(). Apple đặc biệt khuyến cáo không sử dụng CommonCrypto trực tiếp: CryptoKit tự động chọn các tham số tối ưu, bảo vệ khỏi các cuộc tấn công kênh phụ và sử dụng tăng tốc phần cứng AES-NI trên bộ xử lý Apple Silicon. Trên các thiết bị có Secure Enclave, khóa không bao giờ rời khỏi mô-đun phần cứng, ngăn chặn hành vi trộm cắp ngay cả khi ứng dụng bị xâm phạm hoàn toàn. Để tuần tự hóa khóa, sử dụng phương thức withUnsafeBytes, sau đó lưu trữ trong Keychain qua SecItemAdd với thuộc tính kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Câu hỏi thường gặp
AES là một thuật toán chuyển đổi dữ liệu có thể đọc được thành một tập hợp byte không thể đọc được bằng cách sử dụng khóa bí mật. Cần cùng một khóa để đưa dữ liệu trở lại dạng ban đầu. AES đáng tin cậy đến mức nó được sử dụng để mã hóa các tài liệu mật của chính phủ Mỹ.
AES-128 sử dụng khóa 128 bit và thực hiện 10 vòng mã hóa. AES-256 sử dụng khóa 256 bit và 14 vòng, khiến nó khó bị phá vỡ hơn 2^128 lần. Cho ứng dụng di động, AES-256 được khuyến nghị do sự khác biệt về hiệu suất tối thiểu.
AES-256-GCM là chế độ an toàn nhất và được khuyến nghị. GCM cung cấp mã hóa xác thực (mã hóa + xác minh tính toàn vẹn). Chế độ ECB bị cấm, CBC yêu cầu MAC riêng. GCM là tiêu chuẩn thực tế cho ứng dụng di động.
Về mặt lý thuyết, AES có thể bị phá vỡ bằng vét cạn, nhưng đối với AES-256 sẽ cần 2^256 lần thử — nhiều hơn số nguyên tử trong vũ trụ quan sát được. Không có cuộc tấn công thực tế nào vào AES-256 tồn tại. Các cuộc tấn công kênh phụ (Spectre, Meltdown) không phá vỡ AES mà đánh cắp khóa từ bộ nhớ, do đó lưu trữ khóa phần cứng là rất quan trọng.
Sử dụng thư viện AndroidX Security: MasterKey.Builder với KeyScheme.AES256_GCM tạo khóa được bảo vệ trong Android Keystore, và EncryptedSharedPreferences tự động mã hóa tất cả dữ liệu qua AES-256-GCM. Không cần mật mã thủ công — API an toàn theo mặc định, không có rủi ro lỗi nhà phát triển.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm