I want to implement a scenario where two endpoints can securely communicate with each other using public/private key encryption. The scenario is following:

For A to send a message to B:

> 
> A encrypts the message using A's private key.
> 
> 
> A encrypts the message using B's public key.
> 
> 
> A sends the message.
> 
> 
> B receives the message.
> 
> 
> B decrypts the message using A's public key.
> 
> 
> B decrypts the message using B's private key.
> 
> 
> B reads the message.
> 
> 
> 

Here is what I have in C# using RSA encryption:

```
// Alice wants to send a message to Bob:

String plainText = "Hello, World!";
Byte[] plainData = Encoding.Default.GetBytes(plainText);
Byte[] cipherData = null;

RSACryptoServiceProvider alice = new RSACryptoServiceProvider();
RSACryptoServiceProvider bob = new RSACryptoServiceProvider();

var alicePrivateKey = alice.ExportParameters(true);
var alicePublicKey = alice.ExportParameters(false);

var bobPrivateKey = bob.ExportParameters(true);
var bobPublicKey = bob.ExportParameters(false);

RSACryptoServiceProvider messenger = new RSACryptoServiceProvider();

messenger.ImportParameters(alicePrivateKey);
cipherData = messenger.Encrypt(plainData, true);

messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);

messenger.ImportParameters(alicePublicKey);
cipherData = messenger.Decrypt(cipherData, true);

messenger.ImportParameters(bobPrivateKey);
cipherData = messenger.Decrypt(cipherData, true);            

String result = Encoding.Default.GetString(alice.Decrypt(cipherData, true));

```

Clearly, there is something wrong with the following lines:

```
messenger.ImportParameters(bobPublicKey);
cipherData = messenger.Encrypt(cipherData, true);

```

Which throws *System.Security.Cryptography.CryptographyException* with message *{ "Bad Length" }*.

As I can see it is not able to encrypt the data using just the public part of bob's key.

Can someone throw some light on how to properly accomplish what I want to do in *C#*?