Javascript в Java AES

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

К сожалению, я не могу изменить реализацию 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;
Cipher.getInstance("AES"); - это небезопасный режим ECB,
kelalaka 04.01.2019 11:37

Я рекомендую вам изменить реализацию Android, поскольку она менее безопасна, чем та, которую вы использовали для javascript. совместимый режим для вашей реализации js будет Cipher.getInstance("AES/CBC/PKCS7PADDING")

user902383 04.01.2019 12:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
380
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме