RSA Example

mail@pastecode.io avatar
unknown
csharp
3 years ago
2.4 kB
21
Indexable
Never
using System;
using System.Security.Cryptography;

namespace RSATest
{
    class Program
    {
        public static void Main()
        {
            var (privKey, pubKey) = GenerateRSAKeys();
            var secret = BobSendSecret(pubKey);
            AliceReadSecret(secret, privKey);
        }

        public static string BobSendSecret(string pubKey)
        {
            return RSAEncrypt("foobar", pubKey);
        }

        public static void AliceReadSecret(string secret, string privKey)
        {
            var text = RSADecrypt(secret, privKey);
            Console.WriteLine(text);
        }

        public static string RSAEncrypt(string msg, string pubKey)
        {
            var csp = new RSACryptoServiceProvider();
            csp.ImportParameters(DeserializeRSAKey(pubKey));
            var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(msg);
            var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);
            return Convert.ToBase64String(bytesCypherText);
        }

        public static string RSADecrypt(string msg, string privKey)
        {
            var bytesCypherText = Convert.FromBase64String(msg);
            var csp = new RSACryptoServiceProvider();
            csp.ImportParameters(DeserializeRSAKey(privKey));
            var bytesPlainTextData = csp.Decrypt(bytesCypherText, false);
            return System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
        }

        public static (string, string) GenerateRSAKeys()
        {
            var csp = new RSACryptoServiceProvider();
            var privKey = SerializeRSAKey(csp.ExportParameters(true));
            var pubKey = SerializeRSAKey(csp.ExportParameters(false));
            return (privKey, pubKey);
        }

        public static string SerializeRSAKey(RSAParameters rsaParams)
        {
            var sw = new System.IO.StringWriter();
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, rsaParams);
            return sw.ToString();
        }

        public static RSAParameters DeserializeRSAKey(string serKey)
        {
            var sr = new System.IO.StringReader(serKey);
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            return (RSAParameters)xs.Deserialize(sr);
        }
    }
}