
所以我有一个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不)
androID加密有什么不同可能导致这个?我不发布任何代码,因为代码很大,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.这将允许它运行完成并给你一些输出来检查.查看解密消息的最后一个块.
如果你看到你的消息的尾端加上一些好的填充,那么设置你的解密方法以期望填充.
如果你看到完全垃圾,那么你有一个早期的问题,与填充无关.检查两端的所有内容都是逐字节相同的:密钥,IV,消息.正如@GregS指出的那样,默认字符编码在这里是常见的攻击者.一般来说,默认是一件坏事.不同的系统具有不同的默认值,因此始终明确指定您使用的内容:字符编码,Cypher模式,填充,KDF等.不在不同系统中工作通常是系统默认不匹配的症状.
最后,当您诊断出问题时,请将填充设置为Nopadding以外的其他内容.
总结以上是内存溢出为你收集整理的android – BadPaddingException:Blocktype不匹配:0全部内容,希望文章能够帮你解决android – BadPaddingException:Blocktype不匹配:0所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)