RSA加密:InvalidKeyException:无效的密钥格式

时间:2010-08-12 07:28:06

标签: java encryption

我必须阅读pem密钥文件以获取RSA公钥,然后使用它们进行加密。 我可以使用openssl执行此操作并将pem文件转换为der文件。 然后使用X509EncodedKeySpec和PKCS8EncodedKeySpec加载我的密钥。 但我不想这样做,因为pem是用户密钥交换格式。 用户可以注册它自己的密钥可以这样:

--BEGIN PUBLIC KEY-- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGi0/vKrSIIQMOm4atiw+2s8tSojOKHsWJU3oPTm

b1a5UQIH7CM3NgtLvUF5DqhsP2jTqgYSsZSl+W2RtqCFTavZTWvmc0UsuK8tTzvnCXETsnpjeL13

Hul9JIpxZVej7b6KxgyxFAhuz2AGscvCXnepElkVh7oGOqkUKL7gZSD7AgMBAAE=

--END PUBLIC KEY--

并且此密钥以此格式存储在数据库中......

这是我试过的代码..

File pubKeyFile=new File("D:/public_key.pem");
DataInputStream dis = new DataInputStream(new FileInputStream(pubKeyFile));
byte[] pubKeyBytes = new byte[(int)pubKeyFile.length()];
dis.readFully(pubKeyBytes);
dis.close();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes);
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);

我的异常是

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

由于我对加密概念完全陌生,任何人都可以帮我解决这个例外吗?

非常感谢。

3 个答案:

答案 0 :(得分:3)

使用bouncycastle,可以这样做:

CertificateFactory cf = CertificateFactory.getInstance("X509", "BC");
InputStream is = new FileInputStream("D:/public_key.pem");
X509Certificate certificate = (X509Certificate) cf.generateCertificate(is);
is.close();
RSAPublicKey pubKey = (RSAPublicKey)certificate.getPublicKey();

答案 1 :(得分:1)

你几乎就在那里,有标准的提供者。您只需要删除页眉和页脚行:

List<String> lines = Files.readAllLines(Paths.get(path), StandardCharsets.US_ASCII);
if (lines.size() < 2) 
    throw new IllegalArgumentException("Insufficient input");
if (!lines.remove(0).startsWith("--"))
    throw new IllegalArgumentException("Expected header");
if (!lines.remove(lines.size() - 1).startsWith("--")) 
    throw new IllegalArgumentException("Expected footer");
byte[] raw = Base64.getDecoder().decode(String.join("", lines));
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pub = factory.generatePublic(new X509EncodedKeySpec(raw));

答案 2 :(得分:0)

尝试使用Bouncycastele的PemReader。

PublicKey getPublicKey(String pubKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { 
    PemObject pem = new PemReader(new StringReader(pubKeyStr)).readPemObject();
    byte[] pubKeyBytes = pem.getContent();
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes);
    RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);
    return pubKey;
}
相关问题