AES: nó là gì, thuật toán mã hóa đối xứng và được áp dụng ở đâu

Tác giả: IT Sectr Đã đăng: 2026-04-02 Thời gian đọc: 9 phút

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 là mã hóa khối đối xứng với kích thước khối cố định 128 bit và khóa 128, 192 hoặc 256 bit.
  • Chế độ GCM là chế độ hoạt động AES được khuyến nghị cho ứng dụng di động, cung cấp mã hóa xác thực.
  • AES-256 là phiên bản có mức bảo mật tối đa, được khuyến nghị để bảo vệ dữ liệu có độ nhạy cao.
  • Tăng tốc phần cứng — các lệnh AES-NI của bộ xử lý cho phép mã hóa với tốc độ lên đến 10 GB/s trên các thiết bị hiện đại.
  • Android và iOS cung cấp API tích hợp cho AES: Android Keystore và iOS CryptoKit với hỗ trợ tăng tốc phần cứng.

AES là gì?

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).

Lịch sử của tiêu chuẩn AES

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.

Cách thức hoạt động của mã hóa AES

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.

Hiệu ứng tuyết lở và sức mạnh mật mã của AES

Đặ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.

Kích thước khóa AES và mức bảo mật

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óaSố vòngMức bảo mậtỨng dụng
AES-12810128 bitỨng dụng thương mại, TLS
AES-19212192 bitHệ thống chính phủ (SECRET)
AES-25614256 bitTOP 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.

Chế độ hoạt động của AES

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.

  • ECB (Electronic Codebook) — chế độ đơn giản nhất và kém an toàn nhất. Mỗi khối được mã hóa độc lập với cùng một khóa. Các khối văn bản gốc giống hệt nhau tạo ra các khối mã hóa giống hệt nhau, cho phép khôi phục cấu trúc dữ liệu. Bị cấm trong tất cả các tiêu chuẩn bảo mật hiện đại. KHÔNG BAO GIỜ sử dụng ECB trong ứng dụng di động.
  • CBC (Cipher Block Chaining) — mỗi khối mã hóa trước đó được sử dụng làm vectơ khởi tạo (IV) cho khối tiếp theo. Yêu cầu IV ngẫu nhiên cho mỗi thông điệp. Dễ bị tấn công padding oracle khi triển khai không đúng. Phù hợp để mã hóa tệp nhưng yêu cầu MAC (HMAC) để đảm bảo tính toàn vẹn dữ liệu.
  • GCM (Galois/Counter Mode) — chế độ được khuyến nghị cho ứng dụng di động. Cung cấp mã hóa xác thực (AEAD): mã hóa + xác minh tính toàn vẹn trong một thao tác duy nhất. Sử dụng bộ đếm để tạo luồng khóa và phép nhân trường Galois để xác thực. GCM yêu cầu nonce duy nhất (12 byte) cho mỗi thông điệp. Được NIST khuyến nghị, được sử dụng trong TLS 1.2/1.3 và Android Keystore.
  • CCM (Counter with CBC-MAC) — chế độ AEAD thay thế dựa trên CTR + CBC-MAC. Chậm hơn GCM và không hỗ trợ xử lý song song. Được sử dụng trong các giao thức ZigBee và 802.11 (Wi-Fi). Cho ứng dụng di động, GCM được ưu tiên.

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ã.

Triển khai AES trong ứng dụng di động

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).

kotlin
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.

AES trên iOS qua CryptoKit

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à gì theo cách nói đơn giản?

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 khác AES-256 như thế nào?

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.

Chế độ AES nào an toàn nhất?

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.

Có thể phá vỡ AES khô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.

Làm thế nào để sử dụng AES trong ứng dụng di động trên Android?

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

  • AES là thuật toán mã hóa đối xứng phổ biến và đã được kiểm chứng nhất, được NIST tiêu chuẩn hóa vào năm 2001.
  • AES-256 cung cấp mức bảo mật tối đa với biên độ chống lại các cuộc tấn công lượng tử trong 20–30 năm tới.
  • Chế độ GCM là chế độ duy nhất được khuyến nghị cho ứng dụng di động: mã hóa + xác thực trong một thao tác.
  • Android Keystore và iOS Secure Enclave — bộ lưu trữ phần cứng cách ly khóa AES khỏi ứng dụng.
  • Jetpack Security (Android) và CryptoKit (iOS) cung cấp triển khai AES-256-GCM an toàn mà không cần mật mã thủ công.
  • Nonce (IV) cho GCM phải là duy nhất cho mỗi lần mã hóa — sử dụng lại phá hủy hoàn toàn bảo mật.
  • Khuyến nghị: sử dụng AES-256-GCM qua EncryptedSharedPreferences trên Android và CryptoKit trên iOS cho tất cả dữ liệu nhạy cảm.

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.

Thảo luận dự án

Đọc thêm