- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我有一个 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/
我正在尝试使用这 3 个 typedef struct(人物、统计数据和车辆)创建一个单链表。 #include #include #include typedef struct{ char
所以我有一个 android 到 PC 的通信(android = 客户端,PC = 服务器)当客户端尝试连接到服务器时,服务器将抛出此消息: javax.crypto.BadPaddingExcep
我正在尝试为 react-draft-wysiwyg 中的 blockType 设置自定义标签。 根据这个pool request我应该能够将 displayName 属性添加到编辑器工具栏配置对象。
我是一名优秀的程序员,十分优秀!