2013-12-18 3 views
1

인증서에서 얻은 공개 키로 파일을 암호화하려고합니다.공개 키로 Java RSA 암호화

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

예외를 throw합니다. 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입니다.

Cipher.getInstance("RSA", "BC")으로 사용할 수있는 RSAPublicKey (또는 그 외)으로 변환하려면 어떻게해야합니까?

답변

3

DSA 키는 RSA 암호화에 사용할 수 없습니다. DSA는 서명에만 사용되며 다른 키 정보가 필요한 다른 수학을 사용합니다.

대신 RSA 키를 생성하고 CMS 또는 PGP와 같은 표준을 구현하는 라이브러리 (BouncyCastle는 둘 다 지원함)와 함께 사용하십시오. 이들은 대칭 암호에 임의의 키를 사용하여 파일을 암호화 한 다음 해당 키를 각 수신자의 공개 키로 암호화합니다. 이것이 더 나은 접근법 인 많은 이유가 있습니다.

+0

예, 실제로 대칭 키를 암호화하려고하는데 문제를 단순화하려고했습니다. 그래도받는 사람의 키를 생성 할 수는 없으며 그의 인증서를 가지고 어떻게 그를 암호화 할 수 있습니까? – user3116865

+0

@ user3116865 * DSA는 서명 전용입니다 ** ** 수신자가 암호화 된 메시지를 수신하려면 Diffie-Hellman 키 교환을 수행하거나 DSA 인증서를 사용하여 교환기에 기부를 서명하거나 새 RSA 키 쌍을 사용하여 키를 암호화 할 수 있습니다. – erickson