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

class PrivateData
{
    private RSACryptoServiceProvider RSA;
    private string keyFile = "KeyInfo.xml";

    public PrivateData()
    {
        if (File.Exists(keyFile)) {
            RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(File.ReadAllText(keyFile));
        } else {
            RSA = new RSACryptoServiceProvider(4096);
            string KeyInfo = RSA.ToXmlString(true);
            File.WriteAllText(keyFile, KeyInfo);
        }
    }

    public string EncryptString(string input)
    {
        return Encryption(Encoding.UTF8.GetBytes(input), RSA.ExportParameters(false), false);
    }
    public string DecryptString(string input)
    {
        return Decryption(Convert.FromBase64String(input), RSA.ExportParameters(false), false);
    }
    private string Encryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;
                encryptedData = RSA.Encrypt(Data, DoOAEPPadding);

            return Convert.ToBase64String(encryptedData);
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }

    public string Decryption(byte[] Data, RSAParameters RSAKey, bool DoOAEPPadding)
    {
        try
        {
            byte[] decryptedData;
                decryptedData = RSA.Decrypt(Data, DoOAEPPadding);
          
            return Encoding.UTF8.GetString(decryptedData, 0, decryptedData.Length);  ;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.ToString());
            return "";
        }
    }
}