我有一台服务器和两台客户端。服务器运行Java和Jersey(Rest)。 一个客户端是Java客户端,另一个是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客户端发送加密消息时,服务器会对其进行解密并加密响应。 Java客户端解密响应。它运作得很好。
但是当Android客户端发送加密消息时,服务器无法对其进行解密。我有一个BadPaddingException:"给定最后一个块没有正确填充"在服务器上。
服务器和Java客户端使用SunJCE,Android客户端使用AndroidOpenSSL作为提供者。
Android的问题是什么?
PS:我使用org.apache.commons的Hex.encode和Hex.decode。我在Android上使用Spring。
修改
我发现了问题,但我不知道为什么。我有这段代码:
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客户端具有相同的密钥。
我不明白,因为所有人都有相同的课程,相同的代码。