Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# RSA encryption/decryption with transmission

I've seen plenty of encryption/decryption tutorials and examples on the net in C# that use the System.Security.Cryptography.RSACryptoServiceProvider, but what I'm hoping to be able to do is:

  • Create an RSA public/private keypair
  • Transmit the public key (or for proof of concept, just move it in a string variable)
  • Create a new RSA crypto provider and encrypt a string with the public key
  • Transmit the encrypted string (or data) back to the original crypto provider and decrypt the string

Could anyone point me to a useful resource for this?

like image 477
Transmission Avatar asked Jun 15 '13 21:06

Transmission


1 Answers

well there are really enough examples for this, but anyway, here you go

using System; using System.Security.Cryptography;  namespace RsaCryptoExample {   static class Program   {     static void Main()     {       //lets take a new CSP with a new 2048 bit rsa key pair       var csp = new RSACryptoServiceProvider(2048);        //how to get the private key       var privKey = csp.ExportParameters(true);        //and the public key ...       var pubKey = csp.ExportParameters(false);        //converting the public key into a string representation       string pubKeyString;       {         //we need some buffer         var sw = new System.IO.StringWriter();         //we need a serializer         var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));         //serialize the key into the stream         xs.Serialize(sw, pubKey);         //get the string from the stream         pubKeyString = sw.ToString();       }        //converting it back       {         //get a stream from the string         var sr = new System.IO.StringReader(pubKeyString);         //we need a deserializer         var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));         //get the object back from the stream         pubKey = (RSAParameters)xs.Deserialize(sr);       }        //conversion for the private key is no black magic either ... omitted        //we have a public key ... let's get a new csp and load that key       csp = new RSACryptoServiceProvider();       csp.ImportParameters(pubKey);        //we need some data to encrypt       var plainTextData = "foobar";        //for encryption, always handle bytes...       var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(plainTextData);        //apply pkcs#1.5 padding and encrypt our data        var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);        //we might want a string representation of our cypher text... base64 will do       var cypherText = Convert.ToBase64String(bytesCypherText);         /*        * some transmission / storage / retrieval        *         * and we want to decrypt our cypherText        */        //first, get our bytes back from the base64 string ...       bytesCypherText = Convert.FromBase64String(cypherText);        //we want to decrypt, therefore we need a csp and load our private key       csp = new RSACryptoServiceProvider();       csp.ImportParameters(privKey);        //decrypt and strip pkcs#1.5 padding       bytesPlainTextData = csp.Decrypt(bytesCypherText, false);        //get our original plainText back...       plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);     }   } } 

as a side note: the calls to Encrypt() and Decrypt() have a bool parameter that switches between OAEP and PKCS#1.5 padding ... you might want to choose OAEP if it's available in your situation

like image 77
DarkSquirrel42 Avatar answered Oct 16 '22 04:10

DarkSquirrel42