我不知道为什么在android studio和netbean中使用相同的代码会导致行为不同。我正在尝试在android studio中使用RSA算法进行加密,并在netbean中进行解密,但是解密不起作用。 它会引发BadPadding异常,但是在android中使用相同的输入,解密才能正常工作。
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);
}
请问有人可以帮我吗?
答案 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);