#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