gpt4 book ai didi

java - Android到服务器的AES加密/解密

转载 作者:太空狗 更新时间:2023-10-29 14:09:09 24 4
gpt4 key购买 nike

我有一台服务器和两个客户端。服务器使用 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:“给定的最终 block 未正确填充”。

服务器和 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 客户端具有相同的 key 。

我不明白,因为它们都有相同的类,相同的代码。

最佳答案

我找到了一个解决方案。问题是 securite.setSeed()。可以看解决办法here在第一篇文章中

关于java - Android到服务器的AES加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30410575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com