关于极光鉴权认证一键登录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.(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

一个能解,一个说有问题

你可能感兴趣的:(错误)