简体   繁体   English

为什么从RSA解密中得到BadPaddingException?

[英]Why do I get a BadPaddingException from RSA decryption?

I used RSA algorithm to encrypt and decrypt. 我使用RSA算法进行加密和解密。 When I encrypt a string, it's working properly. 当我加密字符串时,它可以正常工作。 When I decrypt, I get an error. 解密时出现错误。 Below, I post my code. 下面,我发布我的代码。

public final String modulusString ="..............";
public final String publicExponentString = "AQAB";

/* Encryption */
byte[] modulebytes = Base64.decode(modulusString);
byte[] exponentbytes = Base64.decode(publicExponentString);
BigInteger module = new BigInteger(1,modulebytes);
BigInteger publicexponent = new BigInteger(1,exponentbytes);
RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(module, publicexponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] plainBytes = EncryptionValue.getBytes("UTF-8");
byte[] cipherData = cipher.doFinal( plainBytes );
String encryptedString = Base64.encode(cipherData);

return encryptedString;

/* Decryption */
byte[] modulebytes = Base64.decode(modulusString);
byte[] exponentbytes = Base64.decode(publicExponentString);

BigInteger modulus = new BigInteger(1, modulebytes );
BigInteger exponent = new BigInteger(1, exponentbytes);

RSAPrivateKeySpec rsaPrivKey = new RSAPrivateKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PrivateKey privKey = fact.generatePrivate(rsaPrivKey);

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privKey);

byte[] base64String = Base64.decode(DecryptionValue);
byte[] plainBytes = new String(base64String).getBytes("UTF-8");
plainBytes = cipher.update(plainBytes);
byte[] values = cipher.doFinal(plainBytes);

return new String(values, "UTF-8");
Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
  at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
  at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
  at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363)
  at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
  at javax.crypto.Cipher.doFinal(Cipher.java:2121)
  at cryptocodefinal.CryptoCodeFinal.DecryptionValue(CryptoCodeFinal.java:79)
  at cryptocodefinal.CryptoCodeFinal.main(CryptoCodeFinal.java:148)

You appear to be decrypting with the public key. 您似乎正在使用公共密钥解密。 That won't work. 那行不通。 You need to need to decrypt with the private exponent that goes with the public exponent used for encryption. 您需要使用与用于加密的公共指数一起的私有指数进行解密。

You can't decrypt without the private key. 没有私钥,您将无法解密。 That is the point of asymmetric cryptography. 那就是非对称密码学的重点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM