← Back to list
DL 2

DL 2 — RSA Encryption

Implement RSA asymmetric encryption and decryption using C# and RSACryptoServiceProvider.

Zhilinsky Egor Author

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.

Web hosting by Somee.com