Java - 获取密钥失败:java.security.InvalidKeyException:无效的 RSA 私钥和 DerInputStream.getLe

xmlJava

1个回答

写回答

布布3433

2025-07-09 16:55

+ 关注

Java
Java

Java - 获取密钥失败:Java.security.InvalidKeyException:无效的 RSA 私钥和 DerInputStream.getLength():找到冗余长度字节

在使用Java编写程序时,我们经常需要使用密钥来进行数据加密和解密操作。其中,RSA算法是一种常用的非对称加密算法,它需要使用公钥和私钥进行加密和解密操作。然而,有时候我们在使用RSA算法获取私钥时可能会遇到"Java.security.InvalidKeyException:无效的 RSA 私钥"的异常,同时还可能出现"DerInputStream.getLength():找到冗余长度字节"的异常。本文将会对这两个异常进行详细的解释,并提供解决这些异常的案例代码。

异常解释

首先,让我们来解释一下这两个异常的具体含义。

1. Java.security.InvalidKeyException:无效的 RSA 私钥

当我们使用RSA算法获取私钥时,有时候可能会遇到"无效的 RSA 私钥"的异常。这个异常通常是由于私钥的格式不正确或者私钥本身存在问题导致的。

2. DerInputStream.getLength():找到冗余长度字节

这个异常是由于密钥的DER编码格式存在问题导致的。DER(Distinguished Encoding Rules)是一种用于编码和解码数据结构的规则,它在加密算法中被广泛使用。当密钥的DER编码格式不正确时,就会抛出这个异常。

案例代码

接下来,我们将给出一些案例代码,以帮助读者更好地理解和解决这两个异常。

Java

import Java.security.*;

import Java.security.spec.InvalidKeySpecException;

import Java.security.spec.PKCS8EncodedKeySpec;

import Java.util.Base64;

public class RSAKeyExample {

public static void mAIn(String[] args) throws NoSuchALGorithmException, InvalidKeySpecException {

String privateKeyString = "MIICXQIBAAKBgQCx4OwWUj9Zzq6fFvDp5xuBv8QY4JyZqFCU5x0u4Kf1wYH2gqds\n" +

"74w0eJ6zVIZqFR1FyB7Xc1qZbjE8FhQSFl0xh4GnwZb1y3Nv6N5dJ1ufn9WzWsln\n" +

"K8z+DvCZo7f4oM9a9a0jXQ7izN0I1gZ3Hm8e+3y9j2ZQ1RcLjU7rS9h3v1y6fECX\n" +

"Lj9e8F7Uo1g7pF2hH6y6S1QxzQIDAQABAoGAePzgO6Mn+7JHgNjZ1f1GZ6vKuUf7\n" +

"HdMkLJk4kV6fQZ+XrjCILVS1T3AOqKqyjHU1DhSKX2Ez7JnQsJNRc5jd/1rQgQ9W\n" +

"xp6eMlzgqS2AowuY2W3eZ7CtFZ0GZ6G6aKShS1j1J4Km1A5t3V7GBy4z9pIzpHzK\n" +

"5hK/xzimkKs5UWJjZmECQQD5Q4Q4n8zR3l2F0PyoDjJn3HwUQvlt6SBZjWUz42A8\n" +

"E9M9C6NzgruWxg4hRcK3xjN7fjw8+JLJGc6fKbMJV5YdAkEAwWyb8l9j4f5u6J3C\n" +

"wT6B8s6G0Ss3ZjA0QY9aELx+1HmG3D6o9EJnKgQ9bqfC6EYD2IuGc+uXJ8kY0nKX\n" +

"bHm3SfrYOQJBAMtGq6ZmzA+5dMxQXEnVfBVSZzLN0Fq6U0d9JmN3ZxQJ+3wqfNqR\n" +

"0eQaC69z6zv3R3jY3VrQ4L3Kf1XZUvM2qQECQFZ85y5rB8K9o8eGZBQeUKHW1Q7M\n" +

"u6iW3UeH2ga5dLw9SW3R+kiq9ZG0j+Q0fBxKtT0yUO3hC2cEMvL7S4sZb2ECQF7C\n" +

"9Qp0cXeK2b5rj/8Q+3ZC3vVWm8Bi4X0hHjXqK7rQhczkM2X6/9mCaud6JY9XcB9m\n" +

"x6jGhJ6QDl4i5z3ZI9ECQQDZQm2iWqel5+Il3m1hK9UumFfl1Kqz6BZ2qDZSd5ro\n" +

"O8XfV2Y9JdM0BqK6q5H4HTC7B9ojRj1l0Bvqy5Ae7MgN";

try {

// 将私钥字符串解码为字节数组

byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);

// 创建PKCS8EncodedKeySpec对象,并传入私钥字节数组

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);

// 使用KeyFactory生成私钥对象

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

// 使用私钥进行加密或解密操作

// ...

} catch (NoSuchALGorithmException | InvalidKeySpecException e) {

e.printStackTrace();

}

}

}

在上面的代码中,我们首先将私钥字符串进行Base64解码,然后使用PKCS8EncodedKeySpec对象将私钥字节数组转换为私钥对象。最后,我们可以使用私钥对象进行加密或解密操作。

解决方法

针对这两个异常,我们可以采取以下几种解决方法:

1. 检查私钥的格式是否正确。确保私钥的格式与使用的密钥库或文件格式相匹配。

2. 检查私钥本身是否有效。有时候私钥文件可能会损坏或丢失,导致获取私钥失败。在这种情况下,我们需要重新生成一个有效的私钥。

3. 检查密钥的DER编码格式是否正确。可以使用DER编码工具对密钥进行检查和修复。

本文对"Java.security.InvalidKeyException:无效的 RSA 私钥"和"DerInputStream.getLength():找到冗余长度字节"这两个异常进行了详细的解释,并提供了解决这些异常的案例代码。希望读者能够通过本文了解并解决这两个异常,在使用RSA算法时能够更加顺利地获取私钥进行加密和解密操作。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号