gpt4 book ai didi

android - 错误填充异常 : Blocktype mismatch: 0

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:24 27 4
gpt4 key购买 nike

所以我有一个 android 到 PC 的通信(android = 客户端,PC = 服务器)当客户端尝试连接到服务器时,服务器将抛出此消息:

javax.crypto.BadPaddingException: Blocktype mismatch: 0
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)

但是 pc 客户端的相同代码成功连接到 pc 服务器(PC <-> PC Works,Android <-> PC doesn't)

android crypto 有什么不同会导致这种情况吗?我没有发布任何代码,因为代码很大,而且 PC 客户端上的 1:1 副本可以完美运行。

解密数据包的服务器方法:

public static Packet decompile(PacketWrapper wrapper, PrivateKey privateKey)
throws Exception {
for (Provider provider : Security.getProviders()) {
System.out.println(provider.getName());
System.out.println(provider.getInfo());
System.out.println(System.lineSeparator());
}
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] data = cipher.doFinal(wrapper.data);
return (Packet) bytesToObj(data);
}

发送数据包时的客户端方法:

try {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(AESsize, new SecureRandom());
aesKey = (SecretKeySpec) kg.generateKey();
new SecureRandom().nextBytes(ivKey);

out.writeObject(Packet.compile(new ClientKeyPacket(aesKey, ivKey),
publicKey));
} catch (Exception e) {
e.printStackTrace();
print("Could not connect to the server");
closeStreams("");
return;
}

其中 Packet.compile() 是:

public static PacketWrapper compile(Packet packet, PublicKey publicKey)
throws Exception {
byte[] bytes = objToBytes(packet);
System.out.println("Size > " + bytes.length);

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] data = cipher.doFinal(bytes);
return new PacketWrapper(data);
}

Crypt 静态字符串是:

public class Crypt {
public static String saltMethod = "PBKDF2WithHmacSHA1";
public static String encryptMethod = "AES/CBC/NoPadding";
public static String shortEncrypt = "AES";
public static String encoding = "UTF-8";
public static int saltIterations = 5000;
public static int saltLength = 8;
}

最佳答案

很多事情都可能导致 BadPaddingException。要诊断它们,请暂时将您的解密方法设置为 NoPadding。这将允许它运行完成并为您提供一些输出以供检查。查看解密消息的最后一个 block 。

如果您看到消息的尾部加上一些好的填充,则将您的解密方法设置为期望该填充。

如果你看到完整的垃圾,那么你有一个较早的问题,与填充无关。检查两边的所有内容是否逐字节相同: key 、IV、消息。正如@GregS 指出的那样,默认字符编码是这里的常见问题。通常,默认值是一件坏事。不同的系统有不同的默认值,因此请始终明确指定您正在使用的内容:字符编码、Cypher 模式、填充、KDF 等。不能跨不同的系统工作通常是系统默认值不匹配的症状。

最后,当您诊断出问题后,将填充设置回 NoPadding 以外的值。

关于android - 错误填充异常 : Blocktype mismatch: 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18174587/

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