關於極光鑑權認證一鍵登錄RSA私鑰解密的2個相關問題的解決方案

報錯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

一個能解,一個說有問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章