У меня есть один сервер и два клиента. Сервер работает с Java и Jersey (Rest). Один клиент - клиент Java, а другой - клиент Android.AES шифрование/дешифрование с Android на сервер
Я хочу отправить сообщение, зашифрованное AES. Таким образом, у меня есть этот код (на сервере и клиентах):
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
public String crypterMessage(String message) {
cipher.init(Cipher.ENCRYPT_MODE, key);
String messageCrypte = new String(Hex.encodeHex(cipher.doFinal(message.getBytes())));
mIv = cipher.getIV();
return messageCrypte;
}
public String decrypterMessage(String messageCrypte) {
IvParameterSpec ivParameterSpec = new IvParameterSpec(mIv);
cipher.init(Cipher.DECRYPT_MODE, obtenirCleSecrete(), ivParameterSpec);
return new String(cipher.doFinal(Hex.decodeHex(messageCrypte.toCharArray())));
}
Когда я отправить зашифрованное сообщение от клиента Java, сервер дешифровать его и Crypt ответ. Клиент Java расшифровывает ответ. Он работает отлично.
Но когда клиент Android отправляет зашифрованное сообщение, сервер не может его расшифровать. У меня есть исключение BadPaddingException: «Учитывая, что последний блок не был правильно дополнен» на сервере.
Сервер и клиент java используют SunJCE, а клиент Android использует AndroidOpenSSL в качестве поставщика.
В чем проблема с Android?
PS: Я использую Hex.encode и Hex.decode из org.apache.commons. И я использую Spring на Android.
EDIT
Я нашел эту проблему, но я не знаю, почему. У меня есть этот код:
KeyGenerator generateurCle = KeyGenerator.getInstance("AES");
SecureRandom securite = SecureRandom.getInstance("SHA1PRNG");
securite.setSeed(mCleCryptage.toByteArray());
generateurCle.init(128, securite);
mCleSecrete = generateurCle.generateKey();
Переменная «mCleCryptage» одинакова для сервера и клиентов. Но «mCleSecrete» отличается между сервером и клиентом Android. Сервер и клиент Java имеют один и тот же секретный ключ.
Я не понимаю, потому что все имеют одинаковый класс, тот же код.
Это должно сработать. Вы уверены, что используете тот же ключ и IV? –