Рейтинг:2

Отличие правильного IV от неправильного IV в AES CBC, когда известен ключ

флаг us

В настоящее время я использую статическое значение IV для всего шифрования и дешифрования, но я хотел бы, чтобы оно было динамическим для каждого запроса шифрования/дешифрования, поэтому я начал использовать новый байт [16], и это работает. Проблема в том, как обнаружить и расшифровать старые данные. Ниже приведен мой код для расшифровки, и я передаю статический IV, хранящийся в секрете в хранилище ключей.

частный статический байт [] DecryptFromBytes_Aes (байт [] dataBytes, байт [] ключ, байт [] iV)
    {
        если (dataBytes == null || dataBytes.Length <= 0)
            выбросить новое исключение ArgumentNullException("DataBytes");
        если (ключ == null || key.Length <= 0)
            бросить новое исключение ArgumentNullException («ключ»);
        if (iV == null || iV.Length <= 0)
            бросить новое исключение ArgumentNullException ("iV");

        байт [] результат = ноль;
        используя (AesCryptoServiceProvider aesAlg = новый AesCryptoServiceProvider())
        {
            aesAlg.Key = ключ;
            aesAlg.IV = IV;
            aesAlg.Padding = PaddingMode.PKCS7;
            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            используя (MemoryStream memoryStream = новый MemoryStream (байты данных))
            {
                используя (CryptoStream cryptoStream = new CryptoStream (memoryStream, decryptor, CryptoStreamMode.Read))
                {
                    byte[] decryptedBytes = новый байт[dataBytes.Length];
                    int read = cryptoStream.Read (decryptedBytes, 0, dataBytes.Length);
                    Array.Resize(ref decryptedBytes, read);
                    результат = расшифрованные байты;
                }
            }

        }

        вернуть результат;
    }
Bharat Malhotra avatar
флаг us
Спасибо вам за быстрый ответ. Мне сказали выложить сюда :)
Bharat Malhotra avatar
флаг us
Кстати, я добавляю его, но не знаю, как обрабатывать все существующие данные.
Aman Grewal avatar
флаг gb
Если он уже добавлен к старым данным, просто определите, соответствует ли IV статическому. Если это так, расшифруйте его как обычно, но сгенерируйте новый IV при шифровании (даже если все остальные данные одинаковы).
kelalaka avatar
флаг in
@AmanGewal настоящая проблема, которую я вижу, заключается в следующем; статический IV не хранится с зашифрованным текстом, и дата не является надежной для проведения различия. Это просто означает, что мы можем отличить зашифрованный текст CBC, предваряемый случайным IV, от зашифрованного текста CBC, не предваряемого IV. Проверка заполнения является ключевым моментом.
Рейтинг:4
флаг in

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

Ответ зависит от заполнения и правильности ключа.

  • Случай: Если ключ правильный, а IV нет;

    Помните, что расшифровка CBC выполняется как \начать{выравнивать} P_1 =& Dec_k(C_1) \oplus IV\ P_i =& Dec_k(C_i) \oplus C_{i-1},\;\; 1 < i \leq nb, \end{выравнивание}

    Следовательно, если IV неверен, то первый блок $P_1$ не является правильным. Мы можем считать это похожим на атака с переворачиванием битов в первом блоке. Следующие блоки $P_i$ будут расшифровывать правильно, так как они полагаются на правильность $C_i$ и $C_{i-1}$ и в этом случае они правы. Только ваш первый блок будет неправильным. Различить это может быть сложно, и вам нужно подготовить некоторый фильтр, чтобы отличить его от свойств открытого текста. - язык или формат. Необходимо сравнить два случая; это статический IV или случайный IV. Какой бы ни был ваш фильтр, это может быть правильным случаем, и это действительно зависит от ваших данных.

    Если первый блок открытого текста представляет собой чистый текст и содержит только символы из первой части ASCII (т. е. значение int для char < 128), то это хороший различитель. Просто проверьте, что каждые 16 байт <128.

    Как можно скорее перенесите все свои файлы в уникальный формат.

  • Случай: если ключ не правильный тогда вы получите ошибку заполнения PKCS # 7 с высокой вероятностью.

    Байты заполнения будут одним из следующих в конце открытого текста в зависимости от размера открытого текста.При заполнении размер должен быть как минимум кратен размеру блока AES, который имеет размер блока 16 байт.

      отсутствует 1 байт - байты заполнения: 01
      отсутствуют 2 байта - байты заполнения: 02 02
      отсутствуют 3 байта - байты заполнения: 03 03 03
      отсутствуют 4 байта - байты заполнения: 04 04 04 04
      отсутствуют 5 байтов - байты заполнения: 05 05 05 05 05
      отсутствуют 6 байтов - байты заполнения: 06 06 06 06 06 06
      ...
      полный блок - байты заполнения: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 
      Даже если открытый текст кратен 128, необходим полный блок, чтобы заполнение не было неоднозначным.
    

    Проверьте правильность заполнения.

    Если это не так, вы можете быть уверены, что IV неверен. Если правильно, то есть $1/256$ вероятность того, что IV сгенерирует случайный действительный 01 прокладка, с $1/(256)^2$ вероятность 0202 допустимое заполнение и так далее. Чтобы убрать эту возможность, нужно проверить данные. Язык или любой другой формат открытого текста может помочь вам устранить ложные срабатывания.

Manish Adhikari avatar
флаг us
Я что-то упустил или где в вопросе предполагается, что зашифрованный текст состоит из одного блока? Если это более одного блока, проверка заполнения всегда будет проходить, я получу только поврежденный первый блок, если IV неверен.
Manish Adhikari avatar
флаг us
Я не ОП. Я просто указал, что проверка IV с помощью правильности заполнения работает только в том случае, если она создает только один блок зашифрованного текста. Итак, мне просто было интересно, есть ли какой-то тонкий намек на то, что я пропустил. Спасибо за обновление вашего ответа
kelalaka avatar
флаг in
@ManishAdhikari да, ты не ОП :)
Bharat Malhotra avatar
флаг us
Спасибо, что поделились своими мыслями по этому поводу :) У меня не так много знаний, чтобы решить эту проблему, поэтому мне просто интересно, будет ли мне достаточно уловки, чтобы идентифицировать первые блоки как IV в зашифрованной строке, чтобы переключиться на использование старого IV? Я думаю, что AesCryptoServiceProvider сохраняет IV перед зашифрованной строкой.
kelalaka avatar
флаг in
@BharatMalhotra Если вы ожидаете, что это открытый текст, убедитесь, что байт меньше 128? Обычная практика — экономить вместе. Я не мог видеть это из документации. Вы можете очень легко проверить это сами. Об этом может свидетельствовать размер зашифрованного текста.Зашифровать одну букву, если шифртекст 16 байт, то IV не сохраняется,,,,
Bharat Malhotra avatar
флаг us
Спасибо, я думаю, вы правы. Он не сохраняет IV с зашифрованной строкой. Любые ссылки, на которые можно сослаться, чтобы увидеть, как мы можем это сделать, чтобы позже я мог обнаружить это для новых данных?
kelalaka avatar
флаг in
Это практика программного обеспечения, вы можете добавить магическое число, поскольку [Maarten] (https://crypto.stackexchange.com/a/96527/18298) предложил показать, что IV является статическим или случайным. Обратите внимание, что при создании программного обеспечения убедитесь, что вы можете различать версии данных, если это необходимо. Обновления должны учитывать все случаи...
Рейтинг:4
флаг in

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

Например, у вас может быть 16-байтовая полностью случайная магия перед вновь зашифрованными файлами (конечно, сгенерированная один раз), затем номер версии и другие данные, включая случайный IV, зашифрованный текст и HMAC над заголовком и данными, включая IV. Таким образом, вы можете обнаружить, что используется правильное шифрование (поскольку случайное генерирование этой магии имеет вероятность 1 из $2^{128}$), просто выполнив сравнение. Вы также защитили свой файл на целостность и подлинность с помощью HMAC (это необязательно и не обязательно для обеспечения конфиденциальности, но настоятельно рекомендуется).

Итак, это будет:

 МАГИЯ (16 байт) | ВЕРСИЯ | IV (16 байт) | ШИФРОТЕКСТ | ТЕГ

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

Конечно, было много людей, которые уже написали подобные протоколы, поэтому вы можете захотеть изучить форматы контейнеров, такие как CMS (который обычно зависит от шифрования/сертификатов с открытым ключом) или даже NaCL.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.