Aes шифрование javascript - расшифровка java

Я пытаюсь зашифровать сообщение в javascript (используя библиотеку crypto-js) и расшифровать его в java.

Это код javascript:

var key = CryptoJS.enc.Utf8.parse(aesPassword);
var ive  = CryptoJS.enc.Utf8.parse(aesIv);
var encryptedData = CryptoJS.AES.encrypt(dataToEncrypt, key, {mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: ive});

И это код Java:

final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        final SecretKeySpec key = new SecretKeySpec(aesPassword().getBytes("UTF-8"), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(aesIv().getBytes("UTF-8")));
        byte[] decrypted = cipher.doFinal(DatatypeConverter.parseBase64Binary(message));

Но когда я пытаюсь расшифровать в Java, возникает это исключение: javax.crypto.BadPaddingException: данный последний блок не заполнен должным образом

пароль: 6h2faBePVxpgyFSN iv: NKOzRKEMKs1kE4 данные для шифрования: "{токен: cMGOIrYlJm9lPhPW}"

Любая помощь?

заранее спасибо


person Giamma    schedule 20.04.2017    source источник
comment
Вы уверены, что они совместимы?   -  person evolutionxbox    schedule 20.04.2017
comment
Да. В других случаях я шифрую с помощью java и расшифровываю с помощью javascript, и все работает нормально.   -  person Giamma    schedule 20.04.2017
comment
Ваш код выглядит правильно. Пожалуйста, отредактируйте свой вопрос, указав свой ключ и IV. Вы должны закодировать массив байтов ключа и IV как Hex, чтобы сравнить их между JavaScript и Java.   -  person Artjom B.    schedule 20.04.2017
comment
Если вы используете только симметричное шифрование, вам нужен один и тот же ключ на сервере и на клиенте. Если вы отправляете ключ шифрования с сервера клиенту или наоборот, вам необходимо зашифровать свой симметричный ключ шифрования. Самый простой способ сделать это — использовать TLS. Если вы используете TLS, то данные и ключ шифруются, поэтому вам не нужно шифровать их самостоятельно. Это не обеспечивает никакой безопасности, просто немного запутывает. Вы должны прочитать: nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/август/   -  person Artjom B.    schedule 20.04.2017
comment
Я знаю, что tls — лучший способ, но я только играл с криптографией, чтобы повысить безопасность метода входа в систему. Отредактировал исходный пост с ключом и iv   -  person Giamma    schedule 21.04.2017
comment
вы играете с криптографией, да... но вы не сможете ничего улучшить таким образом... если вам нужен безопасный вход в систему, вам нужен TLS...   -  person DarkSquirrel42    schedule 21.04.2017


Ответы (1)


Я могу ошибаться, но я думаю, что BadPaddingException в этом случае означает, что у вас нет правильного ключа для успешного выполнения расшифровки. Исключение, по сути, означает, что ключ либо слишком короткий, либо слишком длинный (я думаю).

Try{
    String decrypted = aes.decrypt(...);
    System.out.println(decryted);
}catch(Exception e){

}

Что-то вроде приведенного выше кода может работать, так как System.out достигается только тогда, когда BadPaddingException не перехватывается, это можно использовать в цикле при попытке возможных ключей для расшифровки, например, если вы пытаетесь вычислить все возможные ключи для расшифровка.

person Plumbus    schedule 20.04.2017
comment
Ключ правильный, и он используется для шифрования сообщений в java и расшифровки сообщений в javascript. Ключ всегда один и тот же - person Giamma; 20.04.2017