2013-12-18 5 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: Invalid RSA открытый ключ

constractor из org.bouncycastle.asn1.pkcs.RSAPublicKey ожидает 2 BigInteger с (вероятно, модуль и общественный показатель) ,

Взгляд в cert.getPublicKey() показывает его DSAPublicKeyImpl.

Как я могу преобразовать его в RSAPublicKey (или что-нибудь еще), которое можно использовать на Cipher.getInstance("RSA", "BC")?

ответ

3

DSA-ключи не могут использоваться для шифрования RSA. DSA предназначен только для подписей, и он использует другую математику, требующую различной ключевой информации.

Вместо этого создайте ключ RSA и используйте его с библиотекой, реализующей стандарт, такой как CMS или PGP (BouncyCastle поддерживает оба). Они используют случайный ключ для симметричного шифра для шифрования файла, а затем шифруют этот ключ с открытым ключом каждого получателя. Есть много причин, по которым это лучший подход.

+0

Да, я на самом деле пытаюсь зашифровать симметричный ключ, я просто пытался упростить проблему. Тем не менее, я не могу сгенерировать ключи получателя, у меня есть его сертификат, как я могу зашифровать ключ для него? – user3116865

+0

@ user3116865 * DSA предназначен только для подписей ** **. Если получатель хочет получить зашифрованные сообщения, ему необходимо будет провести обмен ключами Диффи-Хеллмана, подписать его вклад в обмен со своим сертификатом DSA или создать новую пару ключей RSA, чтобы вы могли зашифровать ключ. – erickson

Смежные вопросы