AES (Advanced Encryption Standard) — это симметричный блочный алгоритм шифрования, принятый в 2001 году Национальным институтом стандартов и технологий США (NIST) в качестве официального стандарта. AES пришёл на смену устаревшему DES и с тех пор стал самым распространённым алгоритмом шифрования в мире, используемым от банковских систем до мобильных приложений. По данным NIST (2023), AES обеспечивает стойкость, эквивалентную 2^256 операциям для ключа длиной 256 бит, что делает его неуязвимым для современных атак полным перебором. NIST FIPS 197, 2023
Главное
AES (Advanced Encryption Standard) — это симметричный блочный шифр, разработанный бельгийскими криптографами Joan Daemen и Vincent Rijmen под названием Rijndael. В 2001 году NIST выбрал Rijndael победителем конкурса на новый стандарт шифрования США после пяти лет открытого тестирования и анализа. AES работает с блоками данных фиксированного размера (128 бит) и поддерживает три длины ключа: 128, 192 и 256 бит. Количество раундов преобразования зависит от длины ключа: 10 раундов для 128-битного, 12 для 192-битного и 14 для 256-битного ключа. Каждый раунд включает четыре операции: SubBytes (нелинейная замена байтов через S-box), ShiftRows (циклический сдвиг строк), MixColumns (перемешивание столбцов) и AddRoundKey (наложение раундового ключа).
Разработка AES началась в 1997 году, когда NIST объявил конкурс на замену DES, чей 56-битный ключ был взломан за 22 часа в 1998 году на специализированном устройстве Deep Crack. В конкурсе участвовали 15 алгоритмов из разных стран, включая Serpent (Великобритания), Twofish (США) и RC6 (США). К финалу 1999 года осталось 5 кандидатов. Rijndael победил благодаря комбинации высокой скорости на всех платформах (от 8-битных микроконтроллеров до 64-битных серверов), устойчивости к криптоанализу и компактной реализации в hardware. С 2006 года AES используется для шифрования данных с грифом SECRET и TOP SECRET в правительственных системах США. Сегодня AES встроен во все основные протоколы: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 и Bluetooth BR/EDR.
AES обрабатывает данные блоками по 128 бит (16 байт), организованными в виде матрицы 4x4 байта, называемой state. Каждый раунд шифрования выполняет последовательность детерминированных преобразований, которые в совокупности создают эффект «лавины»: изменение одного бита входных данных меняет около 50% битов выходных данных. Такой эффект делает AES устойчивым к дифференциальному и линейному криптоанализу — основным методам взлома блочных шифров.
Процесс начинается с AddRoundKey — наложения начального ключа на state через операцию XOR. Затем выполняются раунды: SubBytes заменяет каждый байт state на значение из S-box (таблицы замены). ShiftRows циклически сдвигает вторую строку на 1 позицию, третью на 2, четвёртую на 3 — это обеспечивает перемешивание между колонками. MixColumns умножает каждый столбец state на фиксированную матрицу в поле Галуа GF(2^8), создавая зависимость каждого выходного байта от всех четырёх входных байтов столбца. AddRoundKey накладывает очередной раундовый ключ, полученный из исходного ключа через процедуру Key Expansion. Последний раунд отличается отсутствием операции MixColumns. Расшифровка использует обратные операции InvSubBytes, InvShiftRows, InvMixColumns и AddRoundKey в обратном порядке. Для мобильных разработчиков понимание внутренней структуры AES не требуется — достаточно знать, как правильно вызывать встроенные API платформы с корректными параметрами.
Ключевая характеристика AES, обеспечивающая его криптостойкость — лавинный эффект (avalanche effect). Изменение одного бита в открытом тексте или ключе приводит к изменению примерно 50% битов шифртекста, что делает AES чрезвычайно устойчивым к дифференциальному и линейному криптоанализу. Комбинация операций SubBytes (нелинейность через S-box) и MixColumns (диффузия через умножение в поле Галуа) создаёт математическую сложность, при которой даже знание части шифртекста не позволяет восстановить ключ быстрее полного перебора. По данным анализа NIST (2018), лучшая известная атака на AES-128 — biclique attack — сокращает эффективную длину ключа всего на 2 бита (до 126.2 бит), что не даёт практического преимущества атакующему. Для AES-256 не существует ни одной практически реализуемой атаки, превосходящей полный перебор.
AES поддерживает три размера ключа, каждый из которых соответствует определённому уровню криптостойкости. Выбор размера ключа влияет на безопасность, производительность и требования к ресурсам устройства.
| Размер ключа | Количество раундов | Уровень безопасности | Применение |
|---|---|---|---|
| AES-128 | 10 | 128 бит | Коммерческие приложения, TLS |
| AES-192 | 12 | 192 бита | Государственные системы (SECRET) |
| AES-256 | 14 | 256 бит | TOP SECRET, финансовый сектор |
Практическое правило: для мобильных приложений используйте AES-256 по умолчанию. Разница в производительности между AES-128 и AES-256 на современных устройствах с поддержкой AES-NI составляет не более 10–15%, но уровень безопасности удваивается. Согласно квантовому анализу (Grassl et al., 2016), для взлома AES-128 потребуется 2^77 квантовых операций через алгоритм Гровера, а для AES-256 — 2^149, что делает AES-256 устойчивым к квантовым атакам на ближайшие 20–30 лет. Даже AES-128 обеспечивает достаточную защиту для подавляющего большинства коммерческих сценариев: для полного перебора 128-битного ключа потребуется больше энергии, чем существует во Вселенной по оценке Брюса Шнайера. Однако стандарты безопасности (GDPR, HIPAA, PCI DSS) часто явно требуют AES-256, поэтому в продакшен-проектах рекомендуется использовать максимальную длину ключа.
AES как блочный шифр шифрует блоки фиксированного размера (128 бит). Для шифрования данных произвольной длины используются режимы работы (modes of operation). Выбор режима критически влияет на безопасность: неправильный режим может свести на нет стойкость AES.
Для мобильных проектов используйте AES-256-GCM с nonce длиной 12 байт. GCM решает две проблемы одновременно: шифрование данных и проверка подлинности, что предотвращает атаки типа padding oracle и chosen ciphertext. Android Keystore и iOS CryptoKit поддерживают AES-GCM из коробки без необходимости реализации дополнительных криптографических примитивов. При работе с GCM важно никогда не повторять nonce с одним и тем же ключом — это полностью разрушает безопасность шифрования. Генерируйте новый случайный nonce для каждого шифрования и сохраняйте его вместе с шифртекстом.
Рассмотрим пример безопасной реализации AES-256-GCM на Android с использованием Jetpack Security. Код ниже демонстрирует полный цикл: создание ключа AES-256 через MasterKey, шифрование и расшифровку строки с дополнительными аутентифицированными данными (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)
}
Ключевая особенность этого решения — AES-256-GCM используется на двух уровнях: для шифрования ключей-значений (PrefValueEncryptionScheme) и для защиты самих названий ключей (PrefKeyEncryptionScheme использует AES-256-SIV, устойчивый к повторению nonce). MasterKey генерируется с использованием алгоритма AES-256-GCM и хранится в Android Keystore, защищённом аппаратно на устройствах с Trusted Execution Environment. На устройствах без аппаратной поддержки (TEE) ключ шифруется через Bouncy Castle, что всё равно безопаснее хранения в SharedPreferences.
Для прямого шифрования больших объёмов данных (например, изображений или файлов) используйте AES-256-GCM через EncryptedFile из AndroidX Security. Для экспорта ключей (например, для бэкапа) используйте дополнительное шифрование с использованием пароля пользователя через PBKDF2 с 100000+ итераций.
На iOS работа с AES организована через фреймворк CryptoKit (Swift 5.0+). Ключ AES-256 создаётся через SymmetricKey(size: .bits256) и хранится в Secure Enclave — аппаратном криптопроцессоре, изолированном от основного CPU и операционной системы. CryptoKit предоставляет две реализации AES: AES.GCM (рекомендуемый) и AES.CBC (для обратной совместимости с устаревшими форматами). Шифрование выполняется через метод seal(), который принимает данные, ключ и nonce (12 байт), а возвращает AES.GCM.SealedBox — структуру, содержащую шифртекст и тег аутентификации. Расшифровка — через open(). Apple настоятельно не рекомендует использовать CommonCrypto напрямую: CryptoKit автоматически выбирает оптимальные параметры, защищает от side-channel атак и использует аппаратное ускорение AES-NI на процессорах Apple Silicon. На устройствах с Secure Enclave ключи никогда не покидают аппаратный модуль, что исключает их кражу даже при полной компрометации приложения. Для сериализации ключа используется метод withUnsafeBytes с последующим сохранением в Keychain через SecItemAdd с атрибутом kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Часто задаваемые вопросы
AES — это алгоритм, который превращает читаемые данные в нечитаемый набор байтов с помощью секретного ключа. Тот же ключ нужен, чтобы вернуть данные в исходный вид. AES настолько надёжен, что используется для шифрования секретных документов правительства США.
AES-128 использует ключ длиной 128 бит и выполняет 10 раундов шифрования. AES-256 использует 256-битный ключ и 14 раундов, что делает его в 2^128 раз сложнее для взлома. Для мобильных приложений рекомендуется AES-256 из-за минимальной разницы в производительности.
AES-256-GCM — наиболее безопасный и рекомендуемый режим. GCM обеспечивает аутентифицированное шифрование (шифрование + проверка целостности). Режим ECB использовать запрещено, CBC требует отдельного MAC. GCM — стандарт де-факто для мобильных приложений.
Теоретически AES может быть взломан полным перебором, но для AES-256 потребуется 2^256 попыток — больше, чем атомов в наблюдаемой Вселенной. Практических атак на AES-256 не существует. Атаки на side-channel (Spectre, Meltdown) не взламывают AES, а крадут ключи из памяти, поэтому аппаратное хранение ключей критически важно.
Используйте библиотеку AndroidX Security: MasterKey.Builder с KeyScheme.AES256_GCM создаёт защищённый ключ в Android Keystore, а EncryptedSharedPreferences автоматически шифрует все данные через AES-256-GCM. Никакой ручной криптографии — API безопасен по умолчанию, без риска ошибок разработчика.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также