Purpose
Study asymmetric (public-key) encryption using the RSA algorithm implemented via RSACryptoServiceProvider in C#.
Theory
Symmetric encryption uses the same key for both encryption and decryption.
Asymmetric (RSA) encryption uses two different keys: a public key for encryption and a private key for decryption. The two keys are mathematically linked but it is computationally infeasible to derive the private key from the public one.
Step 1 — Generate key pair and encrypt
DateTime dt1 = DateTime.Now;
int key = int.Parse(tbxKey.Text);
// Generate RSA key pair
var rsa = new RSACryptoServiceProvider(key);
var privateKey = rsa.ExportParameters(true);
var publicKey = rsa.ExportParameters(false);
// Encrypt using public key
string str = tbxTextInitial.Text;
var rsa_enc = new RSACryptoServiceProvider(key);
rsa_enc.ImportParameters(publicKey);
byte[] bytesStr = System.Text.Encoding.Unicode.GetBytes(str);
byte[] bytesCypher = rsa_enc.Encrypt(bytesStr, false);
string cypherText = Convert.ToBase64String(bytesCypher);
tbxEncrypted.Text = cypherText;
Step 2 — Decrypt using private key
// Decrypt using private key
bytesCypher = Convert.FromBase64String(cypherText);
var rsa_dec = new RSACryptoServiceProvider();
rsa_dec.ImportParameters(privateKey);
bytesStr = rsa_dec.Decrypt(bytesCypher, false);
string decText = System.Text.Encoding.Unicode.GetString(bytesStr);
tbxDecrypted.Text = decText;
Step 3 — Measure execution time
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2.Subtract(dt1);
Label3.Text = dt1.Hour + ":" + dt1.Minute + ":" + dt1.Second;
Label2.Text = dt2.Hour + ":" + dt2.Minute + ":" + dt2.Second;
Label1.Text = "<u>" + Math.Truncate(
float.Parse(ts.TotalMilliseconds.ToString())) + "</u> ms.";
Key size comparison
Larger key sizes are more secure but significantly slower. Try 512, 1024, and 2048 bits and compare the encryption time shown by the labels.
Live Demo
Generate a key pair and encrypt / decrypt text on the server using RSACryptoServiceProvider.
Code-behind (C#)
protected void btnGenerate_Click(object sender, EventArgs e)
{
try
{
string text = txtText.Text;
if (string.IsNullOrEmpty(text)) { litError.Text = "Please enter text."; return; }
DateTime dt1 = DateTime.Now;
// Generate new key pair
var rsa = new RSACryptoServiceProvider(512);
string publicKeyXml = rsa.ToXmlString(false);
string privateKeyXml = rsa.ToXmlString(true);
// Encrypt
byte[] bytes = Encoding.Unicode.GetBytes(text);
var rsaEnc = new RSACryptoServiceProvider(512);
rsaEnc.FromXmlString(publicKeyXml);
byte[] encrypted = rsaEnc.Encrypt(bytes, false);
string encryptedB64 = Convert.ToBase64String(encrypted);
// Decrypt
var rsaDec = new RSACryptoServiceProvider(512);
rsaDec.FromXmlString(privateKeyXml);
byte[] decrypted = rsaDec.Decrypt(encrypted, false);
string decryptedText = Encoding.Unicode.GetString(decrypted);
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2.Subtract(dt1);
}
catch (Exception ex)
{
litError.Text = "Error: " + ex.Message;
}
}
Conclusion
RSA asymmetric encryption provides secure communication without needing to share a secret key in advance. The trade-off is performance — RSA is significantly slower than symmetric algorithms like AES, which is why in practice RSA is used only to exchange a symmetric session key.