private void ProcessKeyExchange(KeyExchangeRequest Request) { RSA RSAEncryption = RSA.Create(); RSAEncryption.KeySize = Request.RSAKeySize; RSAParameters PublicParameters = new RSAParameters() { Exponent = Request.RSAExponent, Modulus = Request.RSAModulus }; RSAEncryption.ImportParameters(PublicParameters); Cryptor = new AesManaged(); Cryptor.KeySize = Request.AESKeySize; Cryptor.GenerateIV(); Cryptor.GenerateKey(); Cryptor.Mode = CipherMode.CBC; Cryptor.Padding = PaddingMode.PKCS7; KeyExchangeResponse Response = new KeyExchangeResponse() { Accepted = true, EncryptedAESIV = RSAEncryption.Encrypt(Cryptor.IV, RSAEncryptionPadding.Pkcs1), EncryptedAESKey = RSAEncryption.Encrypt(Cryptor.Key, RSAEncryptionPadding.Pkcs1), ID = Request.ID }; Send(Response); }
public async Task <bool> InitializeEncryption(RSAParameters?Parameters = null, int AESKeySize = 256) { RSA RSAEncryption = RSA.Create(); RSAParameters PublicParameters; RSAEncryption.KeySize = Parameters?.D?.Length * 8 ?? 4096; if (Parameters != null) { RSAEncryption.ImportParameters(Parameters.Value); } PublicParameters = RSAEncryption.ExportParameters(false); KeyExchangeRequest Request = new KeyExchangeRequest() { RSAKeySize = RSAEncryption.KeySize, AESKeySize = AESKeySize, RSAExponent = PublicParameters.Exponent, RSAModulus = PublicParameters.Modulus }; KeyExchangeResponse Response = await Send <KeyExchangeResponse>(Request); if (Response?.Accepted ?? false) { Cryptor = new AesManaged(); Cryptor.KeySize = AESKeySize; Cryptor.IV = RSAEncryption.Decrypt(Response.EncryptedAESIV, RSAEncryptionPadding.Pkcs1); Cryptor.Key = RSAEncryption.Decrypt(Response.EncryptedAESKey, RSAEncryptionPadding.Pkcs1); Cryptor.Mode = CipherMode.CBC; Cryptor.Padding = PaddingMode.PKCS7; return(true); } return(false); }