2016-08-05 3 views
0

Я пытаюсь реплицировать шифрование, используемое в приложении Java, используя Javascript и CryptoJS. Я не совсем уверен, как мне следует копировать SecretKeySpec, так как кажется, что CryptoJS ожидает строку для ключа.Java AES Шифрование в Javascript с использованием CryptoJS

Вот код шифрования Java, что мне нужно повторить в JS:

public byte[] encrypt(byte[] origin) 
    { 
     String key = "testkey"; 
     SecretKeySpec sks = new SecretKeySpec(convertAESKey(key), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     byte[] iv = new byte[16]; 
     cipher.init(Cipher.ENCRYPT_MODE, sks, new IvParameterSpec(iv)); 
     return cipher.doFinal(origin); 
    } 

private byte[] convertAESKey(String key) 
    { 
     byte[] keyBytes; 
     keyBytes = key.getBytes("UTF-8"); 
     byte[] keyBytes16 = new byte[16]; 
     System.arraycopy(keyBytes, 0, keyBytes16, 0, 
       Math.min(keyBytes.length, 16)); 
     return keyBytes16; 
    } 
} 

Мой JS код до сих пор:

var iv = new Uint8Array(16); 
var key = "testkey"; 

var encrypted = CryptoJS.AES.encrypt(
    someByteArray, 
    key, 
    { 
     iv: iv, 
     mode: CryptoJS.mode.CBC 
    } 
); 

Кроме того, конечный результат шифра является зашифрованным массив байтов , Конечным результатом CryptoJS является объект cipherText. Есть ли способ получить результат как массив байтов?

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

+0

Использование шифрования из коробки работает для меня без проблем. Проблема заключается в копировании Java-шифрования, поскольку текущая реализация - это клиент (Java) на сервер (Java), и мне нужно сделать ее Client (Javascript) на сервере (Java). Код сервера не может измениться, поэтому важно иметь возможность точно соответствовать шифрованию. – mildse7en

ответ

1

CryptoJS по умолчанию не обрабатывает Uint8Array, поэтому я не буду использовать его и вместо этого будет использовать значение по умолчанию WordArray для представления двоичных данных.

var iv = CryptoJS.lib.WordArray.create([0, 0, 0, 0]); 
var key = "testkey"; 

key = CryptoJS.enc.Utf8.parse(key); 
for (var i = key.words.length; i < 4; i++) { 
    key.words[i] = 0; 
} 
key.sigBytes = 16; 
key.clamp(); 

var encrypted = CryptoJS.AES.encrypt(
    someByteArray, 
    key, 
    { 
     iv: iv, 
     mode: CryptoJS.mode.CBC 
    } 
); 
console.log(encrypted.ciphertext.toString(CryptoJS.enc.Hex)); 

Это даст шестую строку, которую можно легко сравнить с зашифрованным текстом, созданным Java.


Этот код не является очень безопасным:

  • ХВ должен быть непредсказуемыми (читай: случайным образом). Не используйте статический IV, потому что это делает шифр детерминированным и, следовательно, не семантически безопасным. Злоумышленник, который наблюдает за зашифрованным текстом, может определить, когда тот же префикс сообщения был отправлен раньше. IV не секрет, поэтому вы можете отправить его вместе с зашифрованным текстом. Обычно это просто добавляется к зашифрованному тексту и разрезается перед расшифровкой.

  • Ключ должен быть случайным (читайте: смотрите как случайный шум). Текст не выглядит случайным, и вы серьезно сократили свою безопасность (неверно), используя пароль в качестве ключа. Если у вас есть пароль, вам нужно получить ключ от этого, используя что-то вроде PBKDF2, bcrypt, scrypt или Argon2 с высоким коэффициентом итерации/коэффициентом стоимости.

  • Вы должны аутентифицировать свои зашифрованные тексты, чтобы обнаруживать (злонамеренные) манипуляции. Если вы этого не сделаете, это может быть уязвимым против атаки оскорбления. Аутентификация может быть выполнена с помощью аутентифицированного режима работы, такого как GCM или EAX, или с использованием схемы шифрования-затем-MAC с сильным MAC, такого как HMAC-SHA256.

+0

Спасибо за это, я пытаюсь использовать это, и я получаю «undefined не является объектом (оценка« e.length »)« – mildse7en

+0

Вы не сказали, что такое 'someByteArray', поэтому я предположил, что это либо строка или 'WordArray'. Если это 'Uint8Array', вы можете включить файл lib-typedarrays.js для получения поддержки. –

+0

Я пробовал, включая файл lib-typedarrays.js и по-прежнему получаю ту же ошибку.массив im, пытающийся кодировать, - это Uint8Array [120, 156, 203, 72, 205, 201, 201, 7, 0, 6, 44, 2, 21] – mildse7en

 Смежные вопросы

  • Нет связанных вопросов^_^