2010-08-12 67 views
2

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

--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

随着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(); 
+0

+1,我还以为你不得不使用PEMReader类,不知道你可能只是指定“BC”提供商CeritificateFactory。 – 2010-08-12 21:03:01

+0

是的,但实际上在这种情况下,使用PEMReader会更简单... – 2010-08-13 05:15:14