그래서 TcpClient 및 TcpListener 클래스를 사용하여 간단한 "웹 채팅"을 만들고 있습니다. 보내진 모든 데이터를 암호화하여 암호화하고 AES 암호화를 사용하고 싶습니다. 먼저 서버의 AES 키가 안전하게 클라이언트에 전송되는지 확인해야합니다. RSA를 사용하여 AES 키를 암호화 한 다음이를 클라이언트에 보내면 RSA를 통해 암호 해독이 다시 시도됩니다.RSA를 사용하여 해독하려고 할 때 키가 존재하지 않습니다.
먼저 서버에 RSACryptoServiceProvider를 만들고 공개 키를 추출했습니다. 나는 클라이언트에게 공개 키를 보내 RSACryptoServiceProvider를 생성하고 그 키를 가져왔다. Decrpyt 메서드를 호출 할 때 키가 존재하지 않는다는 예외가 발생합니다. 이것은 내 코드입니다 :
서버 :
이것은 클라이언트에게 공개 키를 보내고 있습니다.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string privateXml = rsa.ToXmlString(true);
string publicXml = rsa.ToXmlString(false);
Byte[] pubKey = Encoding.UTF8.GetBytes(publicXml);
clientStream.Write(pubKey, 0, pubKey.Length);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); // simetrično kriptiranje
byte[] aesKey = aes.Key;
byte[] encryptedRSA = rsa.Encrypt(aesKey, false);
clientStream.Write(encryptedRSA, 0, encryptedRSA.Length);
클라이언트 :이 코멘트에 들어갈 정도로 작은 아니었다
Byte[] serverPublicKey = new Byte[1024];
Int32 bytes1 = stream.Read(serverPublicKey, 0, serverPublicKey.Length);
string serverKey = Encoding.UTF8.GetString(serverPublicKey, 0, bytes1);
serverKey = serverKey.Replace("\0", "");
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(serverKey);
Byte[] bytes2 = new Byte[128];
String aesKey = null;
stream.Read(bytes2, 0, bytes2.Length);
byte[] decryptedKey = rsa.Decrypt(bytes2, false);
문제는 발생하지 않습니다. 클라이언트에 대한 공개 키를 안전하게 보호하는 방법은 무엇입니까? 그렇지 않은 경우 클라이언트 코드에 공개 키를 포함시키고 개인 키를 서버 코드 (또는 구성)에 포함시키는 키 쌍을 생성하는 것이 좋습니다. –