JavaScript для Java AES - PullRequest
       8

JavaScript для Java AES

0 голосов
/ 04 января 2019

Мне нужно отправить зашифрованную строку из Javascript на Android, но я получаю следующую ошибку: javax.crypto.BadPaddingException: блок pad поврежден

К сожалению, я не могу изменить реализацию Android, я могу только адаптироватьJavascript код.Я пробовал CryptoJS и теперь aes-js.

Код Android для расшифровки:

        SecretKey secret_user_key = new SecretKeySpec(user_key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secret_user_key);

        byte[] clearBytes = cipher.doFinal(encrypted);

Javascript для шифрования:

        var aesCbc = new aesjs.ModeOfOperation.cbc(new Uint8Array(userKey));
        var encrypted = aesCbc.encrypt(aesjs.padding.pkcs7.pad(clearByteArray));

Ключ пользователя и зашифрованные переменныеодинаковы на обеих платформах.И пользовательский ключ, и clearByteArray имеют размер 32 байта.

Обратите внимание, что в реализации Android не указывается заполнение, iv или режим работы, но я не могу изменить эту часть.

Я пробовалмиллиард различных комбинаций параметров шифрования и потеряли бесчисленные часы на этом.

Редактировать: Также вот эквивалентный метод шифрования на Android, который я должен воспроизвести на Javascript:

        SecretKey secret_user_key = new SecretKeySpec(user_key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secret_user_key);
        byte[] encrypted = cipher.doFinal(clearBytes);

        return encrypted;

1 Ответ

0 голосов
/ 04 января 2019

Режим Cipher.getInstance("AES");, используемый в Android, является режимом ECB.Режим ECB небезопасен.Вы можете видеть это из изображения пингвина в Wikipedia .В качестве режима AES-GCM следует использовать как минимум режим CBC или более надежное шифрование с проверкой подлинности.

Поскольку вы сказали, что не можете изменить часть Android, вам придется понизить версию JS до режима ECB.

var aesEcb = new aesjs.ModeOfOperation.ecb(key);
...