AES encryption/decryption 从 Android 到服务器
AES encryption/decryption from Android to server
我有一台服务器和两个客户端。服务器使用 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 : "Given final block not properly padded" 在服务器上。
服务器和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 客户端具有相同的密钥。
我不明白,因为它们都有相同的class,相同的代码。
我找到了解决办法。问题是 securite.setSeed()。
你可以在第一个post
中看到解决方案here
我有一台服务器和两个客户端。服务器使用 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 : "Given final block not properly padded" 在服务器上。
服务器和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 客户端具有相同的密钥。
我不明白,因为它们都有相同的class,相同的代码。
我找到了解决办法。问题是 securite.setSeed()。 你可以在第一个post
中看到解决方案here