javax.crypto.badpaddingexception:解密错误:仅对数据库中已加密的字符串进行解密时

e5nszbig  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(1018)

这个错误已经在几个链接中讨论过了。
我也犯了类似的错误,但我的情况与其他人没有什么不同。我需要
只有解密。不是加密。
在我的例子中,数据库中已经存储了一条加密消息。我得到了字符串,现在只需要解密它得到原来的字符串。
任何建议都会很有帮助。
我的代码如下:

  1. String encodedStr = "c2J7RiP1CY++gfdE7Ke/xD1fSOOdO7DvprdZZUDws9Yl8DmYJV64zGV9vvK/TMEfALqSPH8KcZik8XvmLowpjJWzYY2Of1aytHaya0ULwmopklRWlkaS5sjL80jjyhaRN2O+zQNarbAQy8g3VtXX643T2AhDTsT+NKFsCcpH4xbqmViwD1GXQQLsLwuKZx1POAtyC0UaMjQ2SrzR+eVEiSgKPDABDKIRbOyBEXRcJMK/t/P7uIk9tJ/p1X2JqQOO7GMO/1x7rvF6Pb1Fik2tmQv5qL1W6/kV97/VT5Hpi9uh6zdCFO7sstYvgkxxbs3gTyJ5raWlATVU6a/0B/Q50w==";
  2. KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
  3. keyGen.initialize(2048);
  4. KeyPair pair = keyGen.generateKeyPair();
  5. PrivateKey privateKey = pair.getPrivate();
  6. PublicKey publicKey = pair.getPublic();
  7. Cipher cipher = Cipher.getInstance("RSA");
  8. // Encryption is not required.
  9. //cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  10. //String ss =Base64.encodeBase64String(cipher.doFinal(encodedStr.getBytes("UTF-8")));
  11. //System.out.println(ss);
  12. // Only decryption is required.
  13. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  14. String sss = new String(cipher.doFinal(Base64.decodeBase64(encodedStr)), "UTF-8");
  15. System.out.println(sss);

每次我都在底线以下 cipher.doFinal(Base64.decodeBase64(encodedStr) :

  1. Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
  2. at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:383)
  3. at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:294)
  4. at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
  5. at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
  6. at javax.crypto.Cipher.doFinal(Cipher.java:2164)
  7. at com.sprint.neo.bc4j.util.TestMain.main(TestMain.java:20)

虽然我不需要加密 Cipher.ENCRYPT_MODE 工作正常。但万一 Cipher.DECRYPT_MODE ,它引发异常。请建议我,我怎么能只解密一个已经存在的加密字符串从数据库,以获得原始字符串值。

g6baxovj

g6baxovj1#

每次生成的公钥都不同,因此加密的字符串也不同。生成的字符串将不再对解密有效。尝试从文件中读取密钥机密并使用相同的加密字符串进行解密。

xqnpmsa8

xqnpmsa82#

下面是一段代码:

  1. public static void main(String[] args) {
  2. byte[] txt = "message".getBytes();
  3. byte[] encText;
  4. try{
  5. // Load the keystore
  6. KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  7. char[] password = "keystorePassword".toCharArray();
  8. Key rsakey = ks.getKey("mykeyalias", password);
  9. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  10. // Encrypt
  11. Certificate cert = ks.getCertificate("mykeyalias");
  12. try
  13. {
  14. cipher.init(Cipher.ENCRYPT_MODE, cert.getPublicKey());
  15. encText = cipher.doFinal(txt);
  16. System.out.println(encText.toString());
  17. }
  18. catch (Throwable e)
  19. {
  20. e.printStackTrace();
  21. return;
  22. }
  23. // Decrypt
  24. cipher.init(Cipher.DECRYPT_MODE, rsakey);
  25. String decrypted = new String(cipher.doFinal(encText));
  26. System.out.println(decrypted);
  27. } catch (Exception e) {
  28. System.out.println("error" + e);
  29. }

}

展开查看全部

相关问题