편집 : 두 번째 질문은 더 이상 필요하지 않습니다. 문제는 패딩 문제의 결과였습니다. 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가 아니므로 사용할 수 없습니다. 내가 누락 된 것이 있습니까?
누가 가르치는 지 모르겠지만 DES는 안전하지 않으며 PKCS # 1은 안전하지 않습니다 (예 : 전송 보안 중에 패딩 공격이 적용될 때). 개인 키로 암호화 (서명 생성이 아님). –