2013-12-18 192 views
1

我試圖使用從證書獲取的公鑰來加密文件。使用公鑰的Java RSA加密

PublicKey publicKey = cert.getPublicKey(); 
cipher = Cipher.getInstance("RSA", "BC");   
cipher.init(Cipher.ENCRYPT_MODE, publicKey); 

引發異常:java.lang.IllegalArgumentException:不是RSA密鑰!

我已經試過:

KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKey.getEncoded()); 
PublicKey rsaPublicKey = KeyFactory.getInstance("RSA").generatePublic(spec); 

但拋出java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException:無效的RSA公鑰

org.bouncycastle.asn1.pkcs.RSAPublicKey的constractor預計2 BigInteger秒(可能是公開指數) 。

調查cert.getPublicKey()顯示它的一個DSAPublicKeyImpl

我該如何將它轉換成RSAPublicKey(或其他)可用?

回答

3

DSA密鑰不能用於RSA加密。 DSA僅用於簽名,它使用不同的數學要求不同的密鑰信息。

改爲生成一個RSA密鑰,並將其用於實現像CMS或PGP(BouncyCastle同時支持這兩種標準)的庫。這些使用對稱密碼的隨機密鑰來加密文件,然後使用每個收件人的公鑰對該密鑰進行加密。有很多原因是更好的方法。

+0

是的,我實際上試圖加密一個對稱密鑰,我只是想簡化問題。不過,我不能生成收件人的密鑰,我有他的證書,我如何爲他加密密鑰? – user3116865

+0

@ user3116865 * DSA僅用於簽名* **如果收件人想要接收加密郵件,他需要進行Diffie-Hellman密鑰交換,使用他的DSA證書籤署他對交易所的貢獻,或生成新的RSA密鑰對,以便您可以加密密鑰。 – erickson