Мне нужно отправить зашифрованную строку с 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;
Я рекомендую вам изменить реализацию Android, поскольку она менее безопасна, чем та, которую вы использовали для javascript. совместимый режим для вашей реализации js будет Cipher.getInstance("AES/CBC/PKCS7PADDING")



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Режим Cipher.getInstance("AES");, который используется в Android, - это режим ECB. Режим ECB небезопасен. Вы можете увидеть это на изображении пингвина на Википедия. Вы должны использовать как минимум режим CBC или лучше аутентифицированное шифрование в качестве режима AES-GCM.
Поскольку вы сказали, что не можете изменить часть Android, вам необходимо понизить версию JS до режима ECB.
var aesEcb = new aesjs.ModeOfOperation.ecb(key);
Cipher.getInstance("AES");- это небезопасный режим ECB,