2013-05-20 2 views
3

누구나 RSA 공개 키와 비공개 키를 사용하여 문자열 객체를 암호화하고 암호 해독하는 방법을 알고 있습니까?자바 키 쌍을 사용하여 암호화하고 암호 해독 하시겠습니까?

KeyPair 생성기를 사용하여 개인 및 공개 키를 만들었지 만 공개 키를 사용하여 데이터를 암호화하고 개인 키를 사용하여 암호를 해독하려고합니다.

public class Keys { 

    private static KeyPairGenerator generator; 

    private static KeyPair keyPair; 

    private static PrivateKey mPrivateKey; 

    private static PublicKey mPublicKey; 

    private static SecureRandom secureRandom; 

    private static final String SHA1PRNG = "SHA1PRNG"; 

    public static final String RSA = "RSA"; 

    private Keys() throws NoSuchAlgorithmException { 
     generator = KeyPairGenerator.getInstance("RSA"); 
    } 

    /** 
    * Generate private and public key pairs 
    * 
    * @throws NoSuchAlgorithmException 
    */ 
    private static void generateKeyPair() throws NoSuchAlgorithmException { 
     // create SecureRandom object used to generate key pairs 

     secureRandom = SecureRandom.getInstance(SHA1PRNG); 

     // initialise generator 
     generator = KeyPairGenerator.getInstance(RSA); 
     generator.initialize(1024, secureRandom); 

     // generate keypair using generator 
     keyPair = generator.generateKeyPair(); 

     // asssign private and public keys 
     setPrivateKey(keyPair.getPrivate()); 
     setPublicKey(keyPair.getPublic()); 

    } 

    /** 
    * Get private key from key generated 
    * @return 
    * @throws NoSuchAlgorithmException 
    */ 
    public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException { 

     if (mPrivateKey == null) { 
      generateKeyPair(); 
     } 
     return mPrivateKey; 
    } 

    private static void setPrivateKey(PrivateKey privateKey) { 
     mPrivateKey = privateKey; 
    } 

    /** 
    * Get public key from key pair generated 
    * 
    * @return 
    * @throws NoSuchAlgorithmException 
    */ 
    public PublicKey getPublicKey() throws NoSuchAlgorithmException { 
     if (mPublicKey == null) { 
      generateKeyPair(); 
     } 
     return mPublicKey; 
    } 

    private static void setPublicKey(PublicKey publicKey) { 
     mPublicKey = publicKey; 
    } 

이 가능합니까? 아니면 암호화가 동일한 키를 공유하고 사용해야합니까?

주요 목표는 다음과 같습니다.

암호화 된 데이터를주고받을 수있는 두 개의 클라이언트가 있습니다. 클라이언트 A의 공개 키에 대한

클라이언트 B 요청 : 클라이언트 A에 대한

는 암호화 된 데이터를받을 수 있습니다. 클라이언트 B는 문자열을 암호화하여 클라이언트 A로 보냅니다. 클라이언트 A는이 암호화 된 문자열을 수신 한 다음 자체 개인 키를 사용하여 암호를 해독합니다.

클라이언트 B가 암호화 된 데이터를 수신하려는 경우에도 마찬가지입니다.

+1

키 생성 코드에 문제가 있습니까? 그렇지 않은 경우 질문에서 제거 될 수 있습니다. –

답변

4

RSA 암호화는 키의 모듈러스보다 작은 데이터를 암호화하는 데에만 사용할 수 있습니다. 나는. 2048 비트 RSA 공개 키는 256 바이트의 데이터 만 암호화 할 수 있습니다. 이 데이터 중 일부는 바이트 채우기에 필요하므로 일반적으로 재생할 공간이 적습니다.

일반적으로 하이브리드 암호화 방식으로 해결됩니다. 즉, 데이터 자체는 임시 대칭 세션 키를 사용한 암호화이고 세션 키는 수신자의 공개 키로 암호화됩니다. 암호화 된 데이터와 암호화 된 세션 키는 모두받는 사람에게 전송됩니다.

이 동작을 구현하는 OpenPGP와 같은 것을 고려해 볼 수 있습니다. BouncyCastle은 Java 용 OpenPGP 구현입니다.

+0

음, RSA가 암호 필드와 같은 작은 데이터를 암호화하는 데 사용되는 이유는 무엇입니까? – jonney

+0

@ jonney 예. 데이터가 항상 작을 경우 RSA 공개 키로 직접 암호화 할 수 있습니다. 그렇지 않으면 위에 제시된 것과 같이 다른 계획을 채택해야합니다. –

+0

감사합니다. – jonney

관련 문제