AES: шифрование в режиме ECB в Java - PullRequest
0 голосов
/ 23 апреля 2020

Я на самом деле исследую разницу между режимом ECB шифрования AES и режимом CB C. После некоторого изучения я узнал, что в режиме ECB есть некоторый fl aws, который создает тот же зашифрованный текст для открытого текста, если зашифрован тем же ключом и тем же содержимым. с другой стороны, в CB C есть вектор инициализации для решения этой проблемы, который создает случайность байтов во время выполнения для каждого шифрования.

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

Я попробовал его с некоторым кодом Java и предоставил два 2 простых текста, как показано ниже:

Jimmy Anderson.
Corrie Anderson.

Теперь слово Андерсон является общим для обоих, но когда я зашифровал его и распечатал вывод, он дал разные шифротексты. Тем не менее, шифрование одного и того же фрагмента простого текста приводит к схожим шифротекстам, но это нормально. Но почему он произвел разные шифры для общих фамилий?

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

Тогда зачем нужен CB C, если он здесь есть?

Может ли кто-нибудь помочь мне в этом?

Буду признателен за любую помощь :).

    public static String encryptwithecb ( byte[] plaintext, SecretKey key )  throws Exception
    {
        Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );

        SecretKeySpec keyspec = new SecretKeySpec( key.getEncoded(), "AES" );

        cipher.init( Cipher.ENCRYPT_MODE,  keyspec );

        byte[] cipherText = cipher.doFinal( plaintext );

        return Base64.getEncoder().encodeToString( cipherText );

    }

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);

        // Generate Key
        SecretKey key = keyGenerator.generateKey();
        System.out.println("");
        System.out.println("");
        System.out.println("***** ENCRYPT WITH ECB ****** ");
        System.out.println("");

        String name1 = "Jimmy Anderson";
        String name2 = "Corrie Anderson..";

        String ecb = encryptwithecb( name1.getBytes("UTF-8") , key);
        String ecb2 = encryptwithecb( name2.getBytes("UTF-8") , key);
        String ecb3 = encryptwithecb( name1.getBytes("UTF-8") , key);

        System.out.println(ecb);
        System.out.println(ecb2);
        System.out.println(ecb3);

        System.out.println("");
        System.out.println("***** ENCRYPT WITH ECB ****** ");

        System.out.println("");
        System.out.println("");

Выход

***** ENCRYPT WITH ECB ****** 

gs3y1N8jA7kwzO/c/dzwEA==
yKFC43ySA1NBAnRdvp9jEHtfcJeM7bAlmcMY63Aeupc=
gs3y1N8jA7kwzO/c/dzwEA==

***** ENCRYPT WITH ECB ******

1 Ответ

0 голосов
/ 23 апреля 2020

Режим ECB создает тот же зашифрованный текст, если совпадает любой блок. Блоки по 16 байт для AES. Это верно не только для начальных блоков, но и для любого блока, необходимого для шифрования сообщения. В вашем примере первый блок отличается, потому что разные имена. Кроме того, открытый текст сдвигается на один символ. Блоки всегда начинаются со смещения, которое является границей блока, конечно же, кратным 16.

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

Для CB C IV должно быть непредсказуемым для противника (что обычно решается путем его случайного выбора). Во многих других режимах, таких как режим счетчика или режим GCM, требуется только одноразовый номер, и в этом случае вы можете использовать счетчик сообщений, который в любом случае часто требуется для запрета атак воспроизведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...