16 Kasım 2018

C# RSA Kullanımı

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace RsaDemo
{
    public class RsaUtilities
    {
        public static void CreatePublicAndPrivateKeys()
        {
            using (var csp = new RSACryptoServiceProvider())
            {
                //Generate Key 
                //True:Public and Private Key, False: Just Public Key
                csp.ExportParameters(true);

                //Write Private Key 
                var publicKey = csp.ToXmlString(true);
                File.WriteAllText("private", publicKey);
                Console.WriteLine("Private key generated and saved to disk as 'private'");
                //Write Public Key
                var privateKey = csp.ToXmlString(false);
                File.WriteAllText("public", publicKey);
                Console.WriteLine("Public key generated and saved to disk as 'public'");
            }
        }
        private static string m_PublicKeyXml = string.Empty;
        public static string PublicKeyXml
        {
            get
            {
                if (string.IsNullOrWhiteSpace(m_PublicKeyXml))
                {
                    if (!File.Exists("public"))
                        throw new FileNotFoundException("public key not found for encrypting", "public");
                    else m_PublicKeyXml = File.ReadAllText("public");
                }
                return m_PublicKeyXml;   
            }
        }
        private static string m_PrivateKeyXml = string.Empty;
        public static string PrivateKeyXml
        {
            get
            {
                if (string.IsNullOrWhiteSpace(m_PrivateKeyXml))
                {
                    if (!File.Exists("private"))
                        throw new FileNotFoundException("private key not found for encrypting", "private");
                    else m_PrivateKeyXml = File.ReadAllText("private");
                }
                return m_PrivateKeyXml;
            }
        }

        public static string Encrypt(string plainText)
        {
            byte[] encryptedByteArray;

            using (var csp = new RSACryptoServiceProvider())
            {                
                csp.FromXmlString(PublicKeyXml);

                encryptedByteArray = csp.Encrypt(Encoding.UTF8.GetBytes(plainText), false);
            }
            return Convert.ToBase64String(encryptedByteArray);
        }

        public static string Decrypt(string encryptedText)
        {
            using (var csp = new RSACryptoServiceProvider())
            {
                csp.FromXmlString(PrivateKeyXml);
                var encryptedByteArray = Convert.FromBase64String(encryptedText);
                var decryptedByteArray = csp.Decrypt(encryptedByteArray, false);
                return Encoding.UTF8.GetString(decryptedByteArray);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // RsaUtilities.CreatePublicAndPrivateKeys();
            string plainText = "foobar";
            Console.WriteLine($"Plain Text: {plainText}");
            string encryptedText = RsaUtilities.Encrypt(plainText);
            Console.WriteLine($"Encrypted Text: {encryptedText}");
            string decryptedText = RsaUtilities.Decrypt(encryptedText);
            Console.WriteLine($"Decrypted Text: {decryptedText}");

        }
    }
}