2014-01-20 2 views
3

У меня есть следующий код Java для создания AES-128 шифрования, где ключ и iv оба основаны на одной и той же фразе.Crypto JS AES-128 шифр - эквивалент Javascript code

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
byte[] keyBytes = new byte[16]; 
byte[] b = passphare.getBytes("UTF-8"); 
int len = b.length; 
if (len > keyBytes.length) { 
    len = keyBytes.length; 
} 

System.arraycopy(b, 0, keyBytes, 0, len); 
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes); 
cipher.init(opmode, keySpec, ivSpec); 

cipher.doFinal(textToEncrypt.getBytes("UTF-8")); 

Я попытался использовать тот же подход в JavaScript, используя CryptoJS для создания и тот же шифр, но без успеха. Не могли бы вы мне помочь?

+0

Можете ли вы предоставить короткий ввод и вывод образца? Это упростит запись и тестирование эквивалентной версии cryptojs. Кроме того, можете ли вы добавить свою самую эффективную попытку криптой? – tucuxi

+0

Да, конечно! Это то, что я пробовал до сих пор. Http://jsfiddle.net/jonaix/hgAZM/ –

+0

FYI это не безопасно. Вы конвертируете пароль непосредственно в байты и используете это как ключ. Вы должны использовать пароль для создания защищенного ключа с использованием функции деривации ключа на основе пароля, например PBKDF или bcrypt или scrypt. Ваш IV также не является случайным, что небезопасно. См. Crypto.stackexchange.com. – Chloe

ответ

1

Цитируя JSFiddle с замечания ФПА в:

var salt = CryptoJS.lib.WordArray.random(128/8); 
// Key and iv should be based on the same value. In this example "1111" 
var key = CryptoJS.PBKDF2("1111", salt, { keySize: 128/32 }); 
var iv = key; // Not sure what should be here!! 

Вы генерирующий ключ от случайной соли (см первой строки), и используя тот же ключ, как вектор инициализации ... и все же вы ожидаете постоянный результат? (как и ожидалось, результат изменяется в каждом вызове).

Fix это использовать те же байты для key и iv используемой SecretKeySpec и IvParameterSpec из кода Java (который вы можете запросить, используя их getEncoded() методы). Я не знаю, использует ли AES SecretKeySpec PBKDF2 или другую функцию деривации ключей, но это должно быть легко проверить. Найдите ту, которая соответствует и придерживается ее.

Остерегайтесь также, что заполнение по умолчанию в CryptoJS является PKCS7 (см. the docs о «режимах блоков и отступов»); это может сильно отличаться от PKCS5, указанного в первой строке кода Java.

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