Ваша toByte
функция не имеет никакого смысла. Зашифрованный ответ не является шестнадцатеричной строкой (в шестнадцатеричном String
есть только 0123456789ABCDEF). Таким образом, вы воспринимаете свой ответ как гекс String
и конвертируете его в byte[]
.
Вам необходимо знать кодировку, используемую на сервере, когда он преобразует зашифрованные данные в String
, и вам следует использовать ту же кодировку, чтобы получить byte[]
из ответа String
. Так что попробуйте
encrypted.getBytes(YOUR_RESPONSE_ENCODING);
EDIT
Также ваш шифр должен использовать тот же алгоритм, который использовался на сервере для шифрования, в моем случае я использую:
new SecretKeySpec(thedigest, "AES/CBC/ZeroBytePadding");
Примечание. Мы также используем шифрование AES 256. Но существует множество способов шифрования данных с использованием AES 256. Вам необходимо знать точный алгоритм и метод заполнения, используемые на вашем сервере.
Если вы получите BadPaddingException
, это означает, что длина данных не является точным кратным длине ключа. Так что в вашем случае encrypted.getBytes(YOUR_RESPONSE_ENCODING).length % thedigest.length
должно быть равно 0
. Вам следует добавить ноль байтов в конец ваших данных, чтобы это ограничение было выполнено.
Здесь есть отличное руководство по криптографии:
http://www.javamex.com/tutorials/cryptography/index.shtml