# Asymmetric Cryptography (Public Key Cryptography) – Part I

Asymmetric cryptography, also known as public key cryptography, it uses two distinct, yet related keys. One key, the Public Key, is used for encryption and the other, the Private Key, is for decryption.

Let say *Mahesh* wants to send an encrypted message to *Shalini*, *Mahesh* will look for *Shalini* Public key and use it for encrypt the message before sending it. Then *Shalini* Can decrypt the message using her related private key.

if *Mahesh* encrypts the message using his private key, then the message can be decrypted only using *Shalini’s* public key, thus it will also authenticate *Shalini*. These encryption and decryption processes happen automatically hence no need to share the keys.

Asymmetric cryptography is slower then symmetric cryptography

Advantages:

1. Does not require to share key

2. Simple structure

*RSA* is common asymmetric algorithm, I will use the same for this example. To demonstrate, I have used .Net framework in build library *“System.Security.Cryptography”*.

Here is C# Source code for the same.

```
using System;
using System.Security.Cryptography;
using System.Text;
namespace AsymmetricCryptography
{
public class AsymmetricRsa
{
static void Main()
{
var rsaCryptoService = new RSACryptoServiceProvider();
var publicKey = rsaCryptoService.ToXmlString(false); // false to get the public key
var privateKey = rsaCryptoService.ToXmlString(true); // true to get the private key
Console.WriteLine("Enter message to encrypt");
var message = Console.ReadLine();
var encryptedMessage = EncryptMessage(publicKey, message, rsaCryptoService);
Console.WriteLine(new UnicodeEncoding().GetString(encryptedMessage));
var decryptData = DecryptData(privateKey,encryptedMessage);
Console.WriteLine(new UnicodeEncoding().GetString(decryptData));
Console.ReadLine();
}
static byte[] EncryptMessage(string publicKey, string message, RSACryptoServiceProvider rsaCryptoService)
{
var dataToEncrypt = new UnicodeEncoding().GetBytes(message);
rsaCryptoService.FromXmlString(publicKey);//We can even create new instance for RSACryptoServiceProvider
return rsaCryptoService.Encrypt(dataToEncrypt, false);
}
static byte[] DecryptData(string privateKey, byte[] dataToDecrypt)
{
var rsaCryptoService = new RSACryptoServiceProvider(); //a new instance for receiver;
rsaCryptoService.FromXmlString(privateKey);
return rsaCryptoService.Decrypt(dataToDecrypt, false);
}
}
}
```