Created
September 10, 2012 17:57
-
-
Save zachbonham/3692542 to your computer and use it in GitHub Desktop.
RSA public key encryption in C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.Security.Cryptography; | |
using System.Text; | |
namespace Crtypto | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
// generating public/private keys | |
// | |
//Debug.WriteLine("private: " + RSA.ToXmlString(true)); | |
//Debug.WriteLine("public: " + RSA.ToXmlString(false)); | |
var publicKey = | |
"<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; | |
var privateKey = | |
"<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent><P>/aULPE6jd5IkwtWXmReyMUhmI/nfwfkQSyl7tsg2PKdpcxk4mpPZUdEQhHQLvE84w2DhTyYkPHCtq/mMKE3MHw==</P><Q>3WV46X9Arg2l9cxb67KVlNVXyCqc/w+LWt/tbhLJvV2xCF/0rWKPsBJ9MC6cquaqNPxWWEav8RAVbmmGrJt51Q==</Q><DP>8TuZFgBMpBoQcGUoS2goB4st6aVq1FcG0hVgHhUI0GMAfYFNPmbDV3cY2IBt8Oj/uYJYhyhlaj5YTqmGTYbATQ==</DP><DQ>FIoVbZQgrAUYIHWVEYi/187zFd7eMct/Yi7kGBImJStMATrluDAspGkStCWe4zwDDmdam1XzfKnBUzz3AYxrAQ==</DQ><InverseQ>QPU3Tmt8nznSgYZ+5jUo9E0SfjiTu435ihANiHqqjasaUNvOHKumqzuBZ8NRtkUhS6dsOEb8A2ODvy7KswUxyA==</InverseQ><D>cgoRoAUpSVfHMdYXW9nA3dfX75dIamZnwPtFHq80ttagbIe4ToYYCcyUz5NElhiNQSESgS5uCgNWqWXt5PnPu4XmCXx6utco1UVH8HGLahzbAnSy6Cj3iUIQ7Gj+9gQ7PkC434HTtHazmxVgIR5l56ZjoQ8yGNCPZnsdYEmhJWk=</D></RSAKeyValue>"; | |
var testData = Encoding.UTF8.GetBytes("testing"); | |
using ( var rsa = new RSACryptoServiceProvider(1024)) | |
{ | |
try | |
{ | |
// client encrypting data with public key issued by server | |
// | |
rsa.FromXmlString(publicKey); | |
var encryptedData = rsa.Encrypt(testData, true); | |
var base64Encrypted = Convert.ToBase64String(encryptedData); | |
Debug.WriteLine(base64Encrypted); | |
// server decrypting data with private key | |
// | |
rsa.FromXmlString(privateKey); | |
var resultBytes = Convert.FromBase64String(base64Encrypted); | |
var decryptedBytes = rsa.Decrypt(resultBytes, true); | |
var decryptedData = Encoding.UTF8.GetString(decryptedBytes); | |
Debug.WriteLine(decryptedData); | |
} | |
finally | |
{ | |
rsa.PersistKeyInCsp = false; | |
} | |
} | |
} | |
} | |
} |
@fjsj it's good to use Base64 encoding to encode a byte sequence to a string instead of Unicode encoding, because not every byte sequence has a Unicode representation. In this example, when the RSA encrypts the input bytes you can't be sure if the output bytes have a Unicode representation, but you can be sure that they have a Base64 representation.
Thanks for code!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Why exactly do you need ToBase64String and FromBase64String?
I've seen some people saying this is necessary: http://stackoverflow.com/a/2164186/145349
Can you confirm this?