2017-02-22 2 views
-1

편집 : 두 번째 질문은 더 이상 필요하지 않습니다. 문제는 패딩 문제의 결과였습니다. Cipher의 매개 변수를 "RSA/ECB/PKCS1Padding"으로 수정했습니다.이 매개 변수는 이미 사용 된 다른 Cipher에서 구현되었습니다.RSA 개인 키를 사용하여 DES 키를 암호화 한 다음 Java의 공개 키를 암호화하고 보내려면 어떻게해야합니까?

학교 임용을 위해 RSA 비대칭 암호화를 사용하여 DES 암호화를 사용하는 세션 키를 만들고 동의하는 Java (클라이언트 및 서버)의 두 프로그램을 만들어야합니다. 교환기의 마지막 메시지에는 클라이언트가 생성 한 키가 포함되어 있습니다.이 키는 클라이언트의 개인 키로 암호화 된 다음 서버의 공개 키를 사용하여 다시 암호화됩니다. 그런 다음 서버는 개인 키를 사용하여 메시지를 해독 한 다음 클라이언트 공개 키를 사용하여 다시 해독하여 DES 키를 가져올 수 있습니다. 그러나 첫 번째 암호화는 크기가 256 인 바이트 배열을 생성하고 두 번째 암호화는 바이트 배열보다 작은 바이트 배열을 필요로합니다. 할당에 지정된대로 키를 두 번 암호화 할 수 있도록 데이터를 조작하는 방법이 있습니까? 이것은 세션 키에 DES 알고리즘을 사용하는 것과 마찬가지로 요구 사항입니다.

또한 클라이언트와 서버가 암호화 된 메시지를 다른 사람에게 보내는 것을 허용하는 다음 할당 부분을 무시하면 다른 문제가 발생합니다. 현재 클라이언트는 서버의 공개 키를 사용하여 키를 래핑 한 다음 서버가 개인 키를 사용하여 키의 랩핑을 해제합니다. 그러나 서버 측에서 세션 키의 래핑을 해제하면 InvalidKeyException이 생성됩니다. 랩핑되지 않은 키 길이는 256 바이트입니다. 이것은 완전히 잘못되었습니다. 서버 측에

, 내가 가진 : 클라이언트 측에

 byte[] m4 = new byte[256]; 
     datIn.read(m4); 
     cUwp.init(Cipher.UNWRAP_MODE, myKey); 
     ks = (SecretKey)cUwp.unwrap(m4, "DES", Cipher.SECRET_KEY); 
     System.out.println("Recieved key:\n" + ks); 
     try{ 
      Cipher desCipher = Cipher.getInstance("DES"); 
      desCipher.init(Cipher.DECRYPT_MODE, ks); 
     } 
     catch(NoSuchPaddingException|InvalidKeyException e){ 
      System.out.println("Error: " + e); 
     } 

: 내 코드의 다른 부분에 어떤 크기의 불일치를 받고 있지 않다

 KeyGenerator keygen = KeyGenerator.getInstance("DES"); 
     SecretKey key = keygen.generateKey(); 
     cWrp.init(Cipher.WRAP_MODE, theirKey); 
     byte[] m4 = cWrp.wrap(key); 
     datOut.write(m4); 
     ks = key; 
     try{ 
      Cipher desCipher = Cipher.getInstance("DES"); 
      desCipher.init(Cipher.DECRYPT_MODE, ks); 
     } 
     catch(NoSuchPaddingException|InvalidKeyException e){ 
      System.out.println("Error: " + e); 
     } 

; 다른 해독 된 메시지는 적절한 크기이지만 wrap() 메서드는 String 키가 아니라 SecretKeys가 아니므로 사용할 수 없습니다. 내가 누락 된 것이 있습니까?

+1

누가 가르치는 지 모르겠지만 DES는 안전하지 않으며 PKCS # 1은 안전하지 않습니다 (예 : 전송 보안 중에 패딩 공격이 적용될 때). 개인 키로 암호화 (서명 생성이 아님). –

답변

4

완전히 잘못되었습니다. 암호화는 공개 키를 사용하고 개인 키를 사용하여 암호 해독해야합니다. 그렇지 않으면 누구든지 해독 할 수 있습니다.

모두 버리고 TLS를 사용하십시오.

+0

오해. 할당은 명시 적으로 메시지를 두 번, 즉 발신자의 개인 키로 수신자의 공개 키로 암호화 한 다음 수신자의 개인 키와 발신자의 공개 키를 사용하여 암호를 해독합니다. 첫 번째 암호화는 서명 역할을하고 두 번째 암호화는 보안을 제공합니다. 또한 TLS는 할당 사양에 따라 옵션이 아닙니다. – Sean

+3

대답은 정확합니다. 클라이언트의 개인 키를 사용하여 암호화 한 다음 클라이언트의 공개 키를 사용하여이를 해독한다고 언급합니다. 이것은 RSA가 작동하는 방식이 아닙니다. 이것은 어떤 보안도 제공하지 않습니다. 클라이언트의 개인 키로 서명 한 다음 공개 키를 사용하여 서명을 확인하려고 할 것입니다. – jackgu1988