Я на самом деле исследую разницу между режимом 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 ******