報錯1:
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character a
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
at temp.Test.decrypt(Test.java:45)
at temp.Test.main(Test.java:35)
具體代碼如下
鑑於隱私,我將私鑰的部分用------代替,有需要可以自己替換
public static void main(String[] args) throws Exception {
// 待解密的
String encrypted = "T/sE3FoiPsJ2eGvqc5WuEiEy947Y/3VlRrSDu17Cgloq4xT9XbR8s6fezmVfuerCnTHNhYAq9xD8bxOlg/Fr+NHbJd9+iCl+3f3/JUhVHYXiHjh6NNiv6c9YfnGaDM3XfeputD1YKoaBxb6ohtgNmMCpAEUGocbmWcN6mWi/D0Q=";
// 私鑰
String prikey ="MIICXgIBAAKBgQDJQCULbXrHH/48/6rWB18as30KpOEGSDDHgIe1VTDm0xbHLbqS\n"
+ "ZQMUpiPYHBzMmpA8aHkz+rVT48nYoEF+Gh3fHe2u0V6e7VmWKq4ZR9LLD7UrVdqC\n"
+ "bIjEO8/hkzVEhplYx6dt8/SmG5GDjhCb5kxJ4q0j4MNptSbUjGXZI5NloQIDAQAB\n"
+ "AoGBAMQJTsyN7X5QhNgod+IatiKNWq1mpKf45ENByW/ytzrxvotw2P/Hk7Omjt3x\n"
+ "rIAFw6CEaCQhAEbiafkxSfqrOBIm4K3sEH+momolIcp3k5O7hqD9wtcqpqeTCPz5\n"
+ "u0ymcJYBq1pAHl52vsWEm0lx9v6A7EYBZISgP+nQQgtcYAABAkEA8J3eGq+Wf+7b\n"
+ "HvnlOk6ulV0DE3fKBwq+yXdHQ72iM9U4+93TPcAHqC5dYLl/KphdFQQK/GjcrESZ\n"
+ "SOYhYCWNoQJBANYd+o1IKcx/9f/1aLIdK8m7CjnospeF2Rq3JQIp68oGcfxcOsGn\n"
+ "5xKt2A8gA2/DFM3n8pfOm1bxIfq4awEu2AECQQDggZxD8AOP2PERBP/SGKoi6Uc+\n"
+ "ee3CBk+fsTCITz8x98gUkZRRMIS0cpZj8pBp0QJA4qXRf5IvFk6jyz3m9QMhAkEA\n"
+ "1dK0Tni9PTqgSM8jkZOuEdPWX4QxLT3+VD6HF8UTcfnDxPe5uYDaMn4nINugcvDH\n"
+ "CuVSDyXFXSqK+11FhrXoAQJAULj1dAxOkVOJpq9GcNJmhQ5rOH8hsKPEnzrbP0B1\n"
+ "-----------------------------------------------------";
String result = decrypt(encrypted, prikey);
System.out.println(result);
}
public static String decrypt(String cryptograph, String prikey) throws Exception {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte [] b = Base64.getDecoder().decode(cryptograph);
return new String(cipher.doFinal(b));
}
當時我就納悶,怎麼從極光官網https://docs.jiguang.cn/jverification/server/rest_api/loginTokenVerify_api/抄下來的東西怎麼會報這個錯。
解決辦法:把私鑰的換行符去掉,改成一行
報錯2:
Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
at temp.Test.decrypt(Test.java:34)
at temp.Test.main(Test.java:25)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:352)
at sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:357)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(RSAPrivateCrtKeyImpl.java:91)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)
at sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:316)
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:213)
... 3 more
遇到這種問題,將私鑰仔細覈對下,是不是客戶端的沙雕給你私鑰的是叫rsa_private_key_pkcs8.pem還是叫
rsa_private_key.pem(區別在於有沒有_pkcs8)
這個有兩個解決辦法
辦法1:叫他給你帶_pkcs8的私鑰
辦法2:在解密之前加一行代碼
java.security.Security.addProvider(
new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
最終代碼
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
/**
* @author 18cm不含頭的wdd
* @Title: Test
* @Description:
* @date 2019/10/18 17:52
*/
public class Test {
public static void main (String[] args) throws Exception {
// 待解密的
String encrypted =
"T/sE3FoiPsJ2eGvqc5WuEiEy947Y/3VlRrSDu17Cgloq4xT9XbR8s6fezmVfuerCnTHNhYAq9xD8bxOlg/Fr+NHbJd9+iCl+3f3/JUhVHYXiHjh6NNiv6c9YfnGaDM3XfeputD1YKoaBxb6ohtgNmMCpAEUGocbmWcN6mWi/D0Q=";
// 私鑰
String prikey =
"MIICXgIBAAKBgQC7y0oKqu+2oUpIBwlBW2p4rm5C7ke0ivXVoEQa43jkIUsB4cH9tWQ5d1h9CvQMsn9UFb3vZfjF4Hn6NidAnEq46gj84dDW0Q66MpSJxz0T/jcqQIZzlN5XwUF+50nooJQUS/U1JvKBkWaDIsyp4C491C4we8P6rCgaQbZfVYPnxwIDAQABAoGATsHiCnlH0SLxgSWaRxOsonIdAermnZwNn4r4JQKzJ5Gi4GYqsllJcCRSMxbN5SlS5xO7NVRhsbMD1OCzM5CYcR1ROZaVkvxSLF5QU/6BsxbosI2bA+VGZ2vyuxsrxO/u6hIFeEsr3cRAyFnkm/hBo4q3FqvrhnErX9/tb5PfI4kCQQD3NoJ9+qby1NsALdT4rx3nhcXBqzCK3XFNE8J3A0hFGA7Q/+T/3WU+t9zJ2j7MSqGUjSjJPxtp8CJkHZBSgWQlAkEAwngagv22BWQDFtMjlPMBUz8VseSSRaOtcEGHN+OY3LqySWbeWJ0d4vtH+rJ8sSmbtHzxgGguW4IgkzYG8yaCewJBALlDdoOmxlqRPhZiQoqj4ctSKyO6gURwM6rJtiCuqwhswR3Lx/ggGPHppGL5VbqP64uCRiCbVJYNyhgxN6k9IqkCQQCxwRZ6pW27f69TLatYesa7UO6DrGoHPZVLBpqSe3c+S2irr1uNpA+tagJhJMTVKzMnxwz4UkINYuRjqv6vQoQBAkEAm70o8jTfLTg7ytd5UwsEy3JHAR2q5VP3a1pKwDReZZOL99y5---------------------";
String result = decrypt(encrypted, prikey);
System.out.println(result);
}
public static String decrypt (String cryptograph, String prikey) throws Exception {
java.security.Security.addProvider(
new org.bouncycastle.jce.provider.BouncyCastleProvider()
);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(prikey));
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] b = Base64.getDecoder().decode(cryptograph);
return new String(cipher.doFinal(b));
}
}
最後說一句話,用代碼解密之前先去網上看看在線解密,一個網站不行就換一個,不要死盯着一個網站。
舉個例子,同樣的私鑰和解密內容
http://www.bejson.com/enc/rsa/
和http://tool.chacuo.net/cryptrsaprikey
一個能解,一個說有問題