Шифрование Java в JS и JS в Java с использованием cryptojs

Я получил этот пост пару недель назад и отлично работал: Java и JavaScript

Теперь мне нужно выполнить обратную операцию, но однажды в java я получаю это исключение:

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)

Это моя «обратная» операция, которую я сделал в JavaScript:

var rkEncryptionKey = CryptoJS.enc.Base64.parse('u/Gu5posvwDsXUnV5Zaq4g==');
var rkEncryptionIv = CryptoJS.enc.Base64.parse('5D9r9ZVzEYYgha93/aUK2w==');

function encryptString(stringToEncrypt) {
    var utf8Stringified = CryptoJS.enc.Utf8.parse(stringToEncrypt);
    var encrypted = CryptoJS.AES.encrypt(utf8Stringified.toString(), rkEncryptionKey, {mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: rkEncryptionIv});
    return CryptoJS.enc.Base64.parse(encrypted.toString()).toString();
}

Я думал, что это все?

[ИЗМЕНИТЬ]

Зашифрованная строка выглядит следующим образом: {"company_name":"asdfasdfasd","customer_name":"asdfasdfasdfasdf","phone_number":"asdfasdfasdfasdf","email":"asdfasdfasdfasdfads"}

При выполнении шифрования/дешифрования из java в java это работает, при этом из java в javascript тоже работает, но из javascript в java не работает.

Код Java

public String toJson(final String encrypted) {
    try {
        SecretKey key = new SecretKeySpec(Base64.decodeBase64("u/Gu5posvwDsXUnV5Zaq4g=="), "AES");
        AlgorithmParameterSpec iv = new IvParameterSpec(Base64.decodeBase64("5D9r9ZVzEYYgha93/aUK2w=="));
        byte[] decodeBase64 = Base64.decodeBase64(encrypted);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, iv);

        return new String(cipher.doFinal(decodeBase64), "UTF-8");
    } catch (Exception e) {
        throw new RuntimeException("This should not happen in production.", e);
    }
}

person P. Lalonde    schedule 21.05.2015    source источник
comment
Вот пример, который сработал для меня   -  person DANIEL PERDOMO    schedule 05.04.2017


Ответы (1)


Сдача

return CryptoJS.enc.Base64.parse(encrypted.toString()).toString();

to

return encrypted.ciphertext.toString(CryptoJS.enc.Base64);

Объект encrypted обычно преобразуется в формат OpenSSL, который также может содержать соль. Если вас интересует только фактический зашифрованный текст, вам необходимо преобразовать свойство ciphertext в строку.

Обратите внимание, что toString() принимает дополнительную функцию кодирования. Используйте тот, который вам нужен.

person Artjom B.    schedule 21.05.2015
comment
Я больше не получаю исключение, но после преобразования строка не соответствует зашифрованной js, которая является строкой JSON. В результате получается куча цифр/букв - person P. Lalonde; 21.05.2015
comment
Я не понимаю, откуда может взяться строка JSON. Разве отсутствие исключения не говорит вам, что расшифровка сработала? - person Artjom B.; 21.05.2015
comment
функция encryptString вызывается после JSON.stringify(obj), поэтому я знаю, что источником для шифрования является JSON, я ожидаю, что обратная операция вернет мне строку JSON, но это не так. - person P. Lalonde; 21.05.2015
comment
Полностью извините, это правильно, я сравнил неправильные строки преобразования. - person P. Lalonde; 21.05.2015