欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RSA 签名异常:java.security.InvalidKeyException: IOException : Detect premature EOF 已解决

程序员文章站 2022-04-15 20:52:24
我们直接点 —— 你参数里的私钥(privateKey)有问题!!请核实一下。...

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


项目场景:

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

全部的异常描述如下:

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

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

RSA 签名异常:java.security.InvalidKeyException: IOException : Detect premature EOF 已解决


原因分析:

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

  • 原因一:RSA 秘钥用混了

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

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

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

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

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

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

RSA 签名异常:java.security.InvalidKeyException: IOException : Detect premature EOF 已解决


解决方案:

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

本文地址:https://blog.csdn.net/weixin_44259720/article/details/111040063