Проверяем ответы ИИ по шифрованию данных: результаты теста

Вы спрашиваете у ChatGPT, как зашифровать строку на Python. Получаете аккуратный блок кода с импортами, функциями и даже примером вызова. Копируете, вставляете в проект, запускаете — работает.

Проверяем ответы ИИ по шифрованию данных: результаты теста

Я решил проверить это не на уровне «мне кажется», а руками: взял несколько моделей, задал типовые задачи по шифрованию и разбору результатов — и внимательно посмотрел, что именно они предлагают. Результаты оказались неутешительными и одновременно очень полезными для понимания границ доверия к генеративному ИИ в критически важных задачах.

Фундаментальная путаница: хеширование ≠ шифрование

Первое, что бросается в глаза при систематическом тестировании, — модели стабильно смешивают два совершенно разных инструмента. Хеширование — это односторонняя функция: данные входят, отпечаток выходит, обратно путь заказан. Шифрование — двустороннее преобразование: зашифровал, получил ключ, потом расшифровал обратно. Это базовая архитектурная разница, азы.

Но когда вы просите модель «зашифровать данные» и она в ответ выдаёт вам SHA-256 — это не мелкая неточность, а фундаментальная ошибка в понимании задачи. Такой код не защитит ваши данные; он лишь создаст их отпечаток, который невозможно превратить обратно в оригинал. Если вам нужно хранить пароли — хеширование подходит. Если нужно передать кому-то зашифрованное сообщение и потом его прочитать — нет.

Модель предсказывает вероятную последовательность токенов, а не понимает математическую природу криптографического протокола. Это принципиальная разница, которую легко забыть, когда ответ выглядит убедительно.

Почему так происходит? LLM обучается на корпусе текстов, где слово «зашифровать» нередко соседствует с SHA-256 и MD5 — потому что в обучающих данных полно примеров хеширования паролей, а авторы статей и тредов на Stack Overflow порой используют терминологию небрежно. Модель улавливает статистическую связь и воспроизводит её. Ощущение, что она «понимает» разницу, — это наш когнитивный сдвиг, а не её реальная компетенция.

AES-GCM: где нейросети ломают надёжную схему

AES-GCM — один из самых распространённых и проверенных режимов шифрования. Используется повсеместно: от TLS-соединений до мессенджеров. Если попросить модель сгенерировать код для AES-GCM, результат визуально выглядит компетентно: импорт библиотеки, инициализация шифра, вызов encrypt. Проблема прячется в деталях — и конкретно в одном параметре, который модели регулярно игнорируют или генерируют неправильно.

Речь о nonce (он же IV, инициализирующий вектор). Это число, которое должно быть уникальным для каждого сообщения, зашифрованного одним и тем же ключом. «Уникальным» — не значит «красивым» или «длинным». Оно должно быть фактически непредсказуемым и ни в коем случае не повторяться. Один и тот же nonce с одним и тем же ключем — и математические гарантии AES-GCM рассыпаются: злоумышленник получает возможность восстановить части открытого текста.

В тестах модели регулярно предлагают решения с жёстко закодированным nonce — то есть буквально вписывают в код что-то вроде b'\x00' * 12 или фиксированную строку. Это удобно для демонстрации, но катастрофически небезопасно в реальном использовании. Другой частый вариант — генерация nonce через стандартный random из Python, который не является криптографически стойким генератором. Правильный подход — использовать модуль secrets или os.urandom(), но модели часто выбирают путь наименьшего сопротивления.

Что предлагает ИИЧто нужно делатьПочему разница критична
Жёстко закодированный nonce (b'\x00'*12)Генерировать случайный nonce для каждого сообщенияПовторный nonce с тем же ключем раскрывает данные
import random для генерацииimport secrets или os.urandom()Стандартный random — не криптографический PRNG, его выход предсказуем
Nonce не сохраняется рядом с шифротекстомПередавать nonce открыто вместе с шифротекстомБез nonce получатель не сможет расшифровать сообщение
Использование одного ключа навсегдаРотация ключей после определённого объёма данныхОдин ключ + много сообщений = растущий риск компрометации

Это не теоретический риск. Если вы встроите такой код в протокол, работающий с реальными средствами или личными данными, последствия будут вполне осязаемыми.

40% кода с уязвимостями: что говорит статистика

Заявления о «ненадёжности ИИ-кода» звучат абстрактно, пока не увидишь цифры. Исследования, проведённые в 2023 году и опубликованные на arXiv, показали: при тестировании ответов моделей (включая GPT-4) на задачи по генерации криптографического кода от 30 до 40% предложенных решений содержали уязвимости, классифицируемые как критические по стандартам OWASP.

OWASP Top 10 — это не абстрактная академическая классификация. Это индустриальный стандарт, по которому проверяют реальные приложения, и «критическая» оценка означает, что уязвимость может привести к компрометации данных, потере средств или полному обходу механизма защиты. Когда треть или даже больше ответов ИИ попадают в эту категорию, речь идёт не о курьёзе, а о системной проблеме.

Конкретные типы ошибок, которые всплывают наиболее часто:

1. Использование небезопасных генераторов случайных чисел. Модели предлагают random.randint() там, где нужен secrets.token_bytes(). Это как использовать дешёвый замок для сейфа — формально заперто, по факту — нет.

2. Хардкод ключей и секретов. Код с вписанным напрямую ключом выглядит удобно для демо, но в реальном проекте это открытая дверь. Модели редко напоминают о необходимости использования переменных окружения или менеджеров секретов.

3. Отсутствие проверки целостности. Шифрование без аутентификации (без тега в GCM, без HMAC в CBC) — данные зашифрованы, но вы не можете быть уверены, что их не подменили в пути.

4. Неправильный выбор режима. Предложение ECB для произвольных данных — классика жанра. ECB шифрует блоки независимо, что делает паттерны в открытом тексте видимыми в шифротексте.

30–40% ответов ИИ по криптографии содержат критические уязвимости по стандартам OWASP. Это не курьёз, а системная проблема, которую нужно закладывать в процесс разработки.

Иллюзия компетенции: почему убедительный ответ — не правильный ответ

Главная опасность LLM в задачах шифрования — не в том, что они откровенно ошибаются (такие случаи заметны), а в том, что они ошибаются красиво. Код компилируется, запускается, даже выдаёт результат. Структура ответа логична: вступление, пояснение, пример использования. Всё выглядит как грамотная документация от разработчика, который знает, что делает.

Это и есть та самая иллюзия компетенции. Модель не верифифицирует свои ответы на безопасность — она генерирует наиболее вероятную последовательность токенов на основе обучающих данных. Если в обучающем корпусе много примеров с небезопасным кодом (а их там достаточно, потому что в учебных репозиториях и туториалах безопасность часто приносится в жертву простоте), модель будет воспроизводить эти паттерны с высокой уверенностью.

Попробуйте эксперимент: спросите у модели, безопасно ли использовать random.SystemRandom() вместо secrets. Ответ, скорее всего, будет внятным и структурированным. Но правильность зависит от контекста — а контекст модель часто не учитывает или учитывает неполно. Она не понимает, почему криптографический генератор отличается от обычного, — она лишь видела, что в «правильных» ответах чаще встречается одна конструкция, а в «неправильных» другая.

Это напоминает ситуацию с модными трендами: можно следовать рекомендациям стилистов, но если не понимать принципов сочетания фактур и пропорций, результат будет «по гайду», но не обязательно гармоничным. С криптографией та же история: копировать структуру кода без понимания математики — значит получить иллюзию безопасности.

Границы ответственности: где заканчивается ассистент и начинается инженер

Самый частый вопрос, который я слышу: «Ну а что, совсем нельзя пользоваться ИИ для крипто-задач?» Можно. Но с пониманием, для чего именно.

LLM — хороший инструмент для генерации черновиков, подсказки синтаксиса и объяснения концепций на пальцах. Если вы разбираетесь в предмете и используете модель как ускоритель, а не как единственный источник истины — это рабочий паттерн. Но если вы не можете отличить CBC от GCM и не знаете, что такое nonce, — генерация кода через ИИ становится рулеткой, где 30–40% ячеек — «проигрыш».

Вот простой чек-лист, который стоит пройти, прежде чем встраивать сгенерированный ИИ крипто-код в проект:

  • Понимаете ли вы, что именно делает каждая строка? Если нет — не используйте код, даже если он работает.
  • Проверяли ли вы nonce/IV на уникальность? Это первое, что модели портят.
  • Какой генератор случайных чисел используется? random — нет. secrets или os.urandom() — да.
  • Есть ли аутентификация шифротекста? AES-GCM с тегом — хорошо. AES-CBC без HMAC — плохо.
  • Кодировался ли ключ жёстко в тексте программы? Если да — немедленно исправляйте.

Пять вопросов. На каждый должен быть однозначный ответ. Если хотя бы один вызывает сомнение — код не готов к продакшену.

Дополнительный уровень защиты — формальная верификация. Для смарт-контрактов и протоколов, работающих с реальными средствами, существуют специализированные инструменты аудита, которые проверяют свойства кода математически. Доверять аудиту ИИ-модели для такой задачи — примерно как доверять навигатору, который не видит карту целиком, а только предсказывает следующий поворот.

Практический вердикт

После серии тестов у меня сформировалось чёткое представление о месте ИИ-ассистентов в криптографическом стеке разработки.

Что модели делают хорошо: объясняют концепции, подсказывают синтаксис библиотек, генерируют скелет функций, которые потом дорабатываются вручную. Для обучения и онбординга в тему — полезный инструмент.

Что модели делают плохо: генерируют безопасный криптографический код «с нуля». Особенно в задачах, где мелкая деталь (размер nonce, выбор генератора, наличие аутентификации) определяет, будет ли схема работать или рассыплется при первой же атаке.

Мой совет: используйте ИИ как справочник и генератор идей, но не как криптографа. Финальную проверку кода, связанного с шифрованием, — всегда за человеком, который понимает не только синтаксис, но и математику стоящих за ним протоколов. Тридцать секунд экономии на генерации кода могут обернуться месяцами исправления уязвимостей — или потерей средств, если речь о блокчейн-проекте.

ИИ — хороший черновик, но плохой криптограф. Граница между этими двумя ролями — и есть то место, где заканчивается удобство и начинается ответственность инженера.

Частые вопросы

Почему нельзя использовать модуль random для генерации ключей или nonce?
Стандартный модуль random не является криптографически стойким генератором, поэтому его выходные данные предсказуемы и небезопасны для криптографических задач.
Что такое nonce и почему он важен в AES-GCM?
Nonce — это уникальное число, которое должно быть непредсказуемым для каждого сообщения. Его повторное использование с одним ключом позволяет злоумышленнику восстановить части открытого текста.
Можно ли доверять коду, который сгенерировал ChatGPT?
Нет, доверять коду без проверки нельзя, так как модели часто допускают критические ошибки, такие как хардкод секретов или использование небезопасных алгоритмов.
В чем разница между хешированием и шифрованием?
Хеширование — это односторонняя функция для создания отпечатка данных, а шифрование — двустороннее преобразование, позволяющее расшифровать данные обратно при наличии ключа.
Как безопасно использовать ИИ при написании кода для шифрования?
Используйте модель для генерации черновиков и подсказок по синтаксису, но обязательно проверяйте каждую строку кода на соответствие стандартам безопасности и корректность криптографических параметров.