2013-12-18 110 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