android–BadPaddingException:Blocktype不匹配:0

android–BadPaddingException:Blocktype不匹配:0,第1张

概述所以我有一个Android到PC通信(android=客户端,PC=服务器)当客户端尝试连接到服务器时,它会在服务器上抛出:javax.crypto.BadPaddingException:Blocktypemismatch:0atsun.security.rsa.RSAPadding.unpadV15(UnknownSource)atsun.security.rsa.RSAPadding.unpad(

所以我有一个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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1117017.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存