2015-05-23 2 views
3

У меня есть один сервер и два клиента. Сервер работает с 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 имеют один и тот же секретный ключ.

Я не понимаю, потому что все имеют одинаковый класс, тот же код.

+0

Это должно сработать. Вы уверены, что используете тот же ключ и IV? –

ответ

1

Я нашел решение. Проблема была securite.setSeed(). Вы можете увидеть решение here в первом посте

Смежные вопросы