AES (Advanced Encryption Standard) — симметричный блочный шифр, стандартизированный NIST в FIPS 197 и применяемый во всём мире для шифрования данных: от веб-трафика и Wi-Fi до дисков и мессенджеров.
Как работает AES
AES — алгоритм симметричного шифрования: один и тот же ключ шифрует и расшифровывает данные. Он обрабатывает данные блоками по 128 бит и поддерживает три длины ключа:
- AES-128 — 10 раундов преобразования;
- AES-192 — 12 раундов;
- AES-256 — 14 раундов.
В каждом раунде выполняются замена байтов, сдвиг строк, перемешивание столбцов и сложение с раундовым ключом, полученным из основного. Поскольку AES — блочный шифр, его применяют в режимах работы; сегодня чаще всего используется GCM, который также аутентифицирует данные, а более старому режиму CBC нужна дополнительная защита целостности.
Алгоритм, первоначально называвшийся Rijndael, разработали бельгийские криптографы Йоан Дамен и Винсент Рэймен. NIST выбрал его в 2000 году по итогам открытого международного конкурса, начатого в 1997 году, и опубликовал стандарт в 2001 году на замену устаревшему DES.
Почему AES важен
За более чем двадцать лет публичного криптоанализа практической атаки на полный алгоритм не найдено. AES защищает соединения TLS и HTTPS, Wi-Fi с WPA2 и WPA3, VPN-туннели, полнодисковое шифрование BitLocker и FileVault, а также защищённые мессенджеры. В современных процессорах есть специальные инструкции (AES-NI на x86), поэтому он работает очень быстро. Правительство США допускает AES с 192- или 256-битными ключами для информации уровня TOP SECRET.
Реальные провалы связаны с ошибками реализации: повторными nonce в GCM, атаками по времени доступа к кешу, жёстко прописанными или слабо выведенными ключами. На AES полагаются и программы-вымогатели, блокируя файлы жертв, — что лишь подтверждает его стойкость.
Рекомендации
- Использовать AES-GCM из проверенной библиотеки, а не собственную реализацию.
- Выбирать AES-256 для долгосрочной конфиденциальности.
- Выводить ключи из паролей медленными KDF, такими как Argon2 или PBKDF2, и не хранить ключи в исходном коде.