2010-08-12 1014 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