原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。


项目场景:

业务上使用 RSA + AES 混合加密,在本地测试 RSA 签名流程时,出现了标题中描述的错误。

全部的异常描述如下:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : Detect premature EOF

附:我的签名生成方法,如下图所示 ↓↓↓(该异常就是这个 catch 块捕获的)


原因分析:

我们直接点 —— 你参数里的私钥(privateKey)有问题!!请核实一下。

  • 原因一:RSA 秘钥用混了

作为【发送方】,RSA 签名用的一定是自己的私钥(privateKey),【接收方】解密我们的签名用公钥(publicKey)。

注意:这个使用方法刚好和 RSA 对 AES 的秘钥加密相反,AES 的秘钥是【发送方】用对方的公钥(publicKey)加密,【接收方】用自己的私钥(privateKey)解密。

如果你用混了,比如用公钥(publicKey)来做签名,一定会出现标题的错误。

  • 原因二:你的 RSA 秘钥是自己定义的,或者复制过程中弄错了

不同于 AES  加密秘钥可以自己定义,RSA 的秘钥生成是遵循很多算法的,是个很复杂的过程(下图所示),生成的公钥(publicKey)和私钥(privateKey)必须是一对使用。

在强大的算法支持下,不要说自己定义,就是弄错一位都废了,也会出现标题的错误。


解决方案:

按照 RSA 规范进行签名和验签,并使用正确的,符合 RSA 规范的,用 RSA 方法生成的私钥(privateKey)

没有正确的 RSA 秘钥??还没写好工具类??不用担心,都给你准备好了,所需Jar包也附在里面,拿去拿去 (*^▽^*)

	import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.security.KeyPairGenerator;
    import org.apache.commons.codec.binary.Base64;


    /** 
	 * RSA:随机生成密钥对 
	 * 
	 * @throws NoSuchAlgorithmException 
	 */  
	public static void genKeyPair() throws NoSuchAlgorithmException {  
		// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象  
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); 
		
		// 初始化密钥对生成器,密钥大小为96-2048位  
		keyPairGen.initialize(2048, new SecureRandom());
		
		// 生成一个密钥对,保存在keyPair中  
		KeyPair keyPair = keyPairGen.generateKeyPair();  
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   	// 得到私钥
		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  		// 得到公钥

		// 得到公钥字符串
		String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
		// 得到私钥字符串
		String privateKeyStr = new String(Base64.encodeBase64((privateKey.getEncoded())));

		System.out.println("随机生成的公钥为:" + publicKeyStr);
		System.out.println("随机生成的私钥为:" + privateKeyStr);
	}

我是 IT无知君,您的点赞、评论和关注,是我不懈创作的动力。
学无止境,气有浩然,让我们一起加油,天涯未远,江湖有缘再见!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐