Расшифровка в AES 256 в Android, получая NumberFormateException - PullRequest
0 голосов
/ 01 марта 2012

Я работаю над парсингом SOAP-запроса на сервер Dot.net.

Ответ шифруется на стороне сервера алгоритмом AES 256.ответ от сервера

к / tMHkiyWgoof8FAsTJttWZT7sku5QcJe6iZsWjkPXS + xE7ujjPn / f0E8sqWkXLH0jiXXHYwrV1SdJjbnXsiXxitfnAB83uIOr3VunB3fMVCOxTHk + Ej4mx + hBNB9pkJlgOJfTPX666fn6mwbkmFE4uqhTVbdGjm9HiSAW0mm91UANu3EERLS8g0UUPNdHn1

Теперь я использую метод дешифрования в Java-файлов, как:

**public class SimpleCrypto {
public static String decrypt(String seed, String encrypted) throws Exception {
    byte[] keyb = seed.getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] thedigest = md.digest(keyb);
    SecretKeySpec skey = new SecretKeySpec(thedigest, "AES/ECB/PKCS7Padding");
    Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
    dcipher.init(Cipher.DECRYPT_MODE, skey);
    byte[] clearbyte = dcipher.doFinal(toByte(encrypted));
    return new String(clearbyte);
}
public static byte[] toByte(String hexString) {
    int len = hexString.length()/2;
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++)
        result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
    return result;
}
}**

1 Ответ

0 голосов
/ 01 марта 2012

Ваша 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...