4

だから私はアンドロイドからPCへの通信(アンドロイド=クライアント、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は動作しますが、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;
}
4

2 に答える 2

1

多くのことがBadPaddingException. それらを診断するには、復号化方法を一時的に に設定しますNoPadding。これにより、実行が完了し、調べる出力が得られます。復号化されたメッセージの最後のブロックを見てください。

メッセージの末尾に適切なパディングが追加されている場合は、そのパディングを期待するように復号化方法を設定してください。

完全なガベージが表示される場合は、パディングとは関係のない以前の問題があります。キー、IV、メッセージなど、すべてが両側でバイトごとに同一であることを確認します。@GregS が指摘したように、ここではデフォルトの文字エンコーディングが一般的な違反者です。一般に、デフォルトは悪いことです。システムが異なればデフォルトも異なるため、使用しているものを常に明示的に指定してください: 文字エンコーディング、Cypher モード、パディング、KDF など。異なるシステム間で機能しないことは、多くの場合、システムのデフォルトが一致していないことを示しています。

最後に、問題を診断したら、パディングを 以外に設定しますNoPadding

于 2013-08-12T11:12:28.043 に答える