BadPaddingException解决方案

时间:2019-05-07 20:40:04

标签: java android rsa

我不知道为什么在android studio和netbean中使用相同的代码会导致行为不同。我正在尝试在android studio中使用RSA算法进行加密,并在netbean中进行解密,但是解密不起作用。 它会引发BadPadding异常,但是在android中使用相同的输入,解密才能正常工作。

Android Studio https://ibb.co/6RDLVHP

Netbean https://ibb.co/8MgRx3r

    public byte [] Encrypt(String plain) throws NoSuchAlgorithmException,NoSuchPaddingException, InvalidKeyException,IllegalBlockSizeException, BadPaddingException {

        byte[] encryptedBytes;

        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, this.PublicKey);
        encryptedBytes = cipher.doFinal(plain.getBytes());

        return encryptedBytes;

    }
public String Decrypt(byte [] result) throws NoSuchAlgorithmException,NoSuchPaddingException, InvalidKeyException, 
                IllegalBlockSizeException, BadPaddingException {

        byte[] decryptedBytes=null;
            Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
            cipher.init(Cipher.DECRYPT_MODE, this.PrivateKey);
            decryptedBytes = cipher.doFinal(result);
            System.out.println();
            return new String(decryptedBytes);

    }

请问有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

在“解密”方法中,调用cipher.init(...)时,需要包括类型为OAEPParameterSpec的必需的第三个参数。

Cipher类的文档:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/javax/crypto/Cipher.html

我怀疑如果您是在Netbeans中进行加密并使用Android Studio进行解密,则会发生相同的异常。

答案 1 :(得分:0)

不幸的是,在不同平台上实现OAEP操作中某些默认值的方式存在一些不兼容之处。避免这些头痛的最好方法是在每个Cipher.init(...)调用中指定相同的OAEPParameterSpec,如下所示:

更改

cipher.init(Cipher.DECRYPT_MODE, this.PrivateKey);
//...
cipher.init(Cipher.ENCRYPT_MODE, this.PublicKey);

cipher.init(Cipher.DECRYPT_MODE, this.PrivateKey, OAEPParameterSpec.DEFAULT);
//...
cipher.init(Cipher.ENCRYPT_MODE, this.PublicKey, OAEPParameterSpec.DEFAULT);