Как зашифровать с помощью нулевого заполнения AES CBC в Javascript и расшифровать с помощью Java

#javascript #java

#javascript #java

Вопрос:

Мне нужно зашифровать в Javascript и расшифровать на Java, но когда я шифрую на Java, текст отличается, я использовал другой скрипт, но тот же алгоритм, AES-128 CBC Zero Padding.

Это для Javascript и Java 7 в Intellij IDEA

Javascript:

    var message = "3258";
   var key = "CLAVE00000000000";
   var iv  = "VECTOR0000000000";

   var ciphertext = CryptoJS.AES.encrypt(message, key,  {iv: iv, padding: CryptoJS.pad.ZeroPadding, mode: CryptoJS.mode.CBC});
   alert(ciphertext.toString());

   var decrypt = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding, mode: CryptoJS.mode.CBC});
   alert(CryptoJS.enc.Utf8.stringify(decrypt).toString());
  

Java:

 KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(AES_128);

String key = "CLAVE00000000000";
String IV = "VECTOR0000000000";
System.out.println("1. Message to Encrypt: "   new String(message, StandardCharsets.UTF_8));

byte[] cipherText = encrypt(key, IV, message);
System.out.println("2. Encrypted Text: "   Base64.getEncoder().encodeToString(cipherText));

byte[] decryptedString = decrypt(key, IV, cipherText);
System.out.println("3. Decrypted Message : "   new String(decryptedString));
  

Я ожидаю, что зашифрованный текст идентичен в Javascript или в Java, но значения разные

Комментарии:

1. какое значение вы получаете в Java?

2. В Javascript это: U2FsdGVkX1/3H3/VO8b5gjCk3XZfXkSK9JpgmPGYjtk=

3. В Java это: sEAtASy0J3 Ya3g Afcj3Q ==

4. Сообщение: 3258

5. Тот же алгоритм = тот же результат для того же ввода. Пожалуйста, покажите больше кода Java, в нем отсутствуют необходимые методы.

Ответ №1:

В JavaScript-code ключ и iv должны быть переданы как WordArrays . Для этой цели CryptoJS предоставляет функции преобразования:

 var key = CryptoJS.enc.Latin1.parse("CLAVE00000000000");
var iv = CryptoJS.enc.Latin1.parse("VECTOR0000000000");
  

Если ключ передается в виде строки (как это имеет место в опубликованном коде), он обрабатывается как кодовая фраза и используется для получения ключа и IV (см. Здесь, раздел Ввод шифра).

Кроме того, в JavaScript-коде заполнение нулевым байтом должно быть заменено заполнением Pkcs7 ( padding: CryptoJS.pad.Pkcs7 вместо padding: CryptoJS.pad.ZeroPadding ) в encrypt — и decrypt -вызове.

Тогда шифрование JavaScript-кода соответствует шифрованию Java-кода ( sEAtASy0J3 Ya3g Afcj3Q== для используемого сообщения, ключа и IV).

Замена заполнения является предположением, потому что encrypt — и decrypt -методы Java-кода не были опубликованы, так что прямая проверка невозможна. Однако, что касается того же шифрования при переключении на Pkcs7, это должно быть правдой.

Комментарии:

1. Большое спасибо Topaco