// ***********************************************************************
//
// AgileWebs
//
// ***********************************************************************
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
using System.Security.Cryptography;
using System.Text;
namespace Core.Cerberos.Adapters.Helpers
{
///
/// Handles all methods related to RSA encryption"/>.
///
public class RsaHelper
{
private readonly RSACryptoServiceProvider _privateKey;
private readonly RSACryptoServiceProvider _publicKey;
private readonly string keysFolder = "Keys\\";
private readonly string exeDirectory = AppContext.BaseDirectory;
///
/// Initializes a new instance of .
///
public RsaHelper()
{
exeDirectory = exeDirectory + keysFolder;
_publicKey = GetPublicKeyFromPemFile();
_privateKey = GetPrivateKeyFromPemFile();
}
///
/// Encrypts a text using RSA algorithm.
///
/// The text to be encrypted.
/// The encrypted text.
public string Encrypt(string text)
{
byte[] dataBytes = Encoding.UTF8.GetBytes(text);
var encryptedBytes = _publicKey.Encrypt(Encoding.UTF8.GetBytes(text), true);
return Convert.ToBase64String(encryptedBytes);
}
///
/// Decrypts a text using RSA algorithm.
///
/// The encrypted text to be decrypted.
/// The decrypted text.
public string Decrypt(string encrypted)
{
var decryptedBytes = _privateKey.Decrypt(Convert.FromBase64String(encrypted), true);
return Encoding.UTF8.GetString(decryptedBytes, 0, decryptedBytes.Length);
}
///
///Obtains the private key from a file.
///
/// The private key.
private RSACryptoServiceProvider GetPrivateKeyFromPemFile()
{
using (TextReader privateKeyTextReader = new StringReader(File.ReadAllText(Path.Combine(exeDirectory, "HeathPrivateKey.pem"))))
{
AsymmetricCipherKeyPair readKeyPair = (AsymmetricCipherKeyPair)new PemReader(privateKeyTextReader).ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)readKeyPair.Private);
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.ImportParameters(rsaParams);
return csp;
}
}
///
///Obtains the public key from a file.
///
/// The public key.
public RSACryptoServiceProvider GetPublicKeyFromPemFile()
{
using (TextReader publicKeyTextReader = new StringReader(File.ReadAllText(Path.Combine(exeDirectory, "HeathPublicKey.pem"))))
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)new PemReader(publicKeyTextReader).ReadObject();
RSAParameters rsaParams = DotNetUtilities.ToRSAParameters((RsaKeyParameters)publicKeyParam);
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.ImportParameters(rsaParams);
return csp;
}
}
}
}