Skip to content

Instantly share code, notes, and snippets.

@runegri
Created September 7, 2017 07:30
Show Gist options
  • Save runegri/06d7c91f3a9cda4b2ade916bcb6e3229 to your computer and use it in GitHub Desktop.
Save runegri/06d7c91f3a9cda4b2ade916bcb6e3229 to your computer and use it in GitHub Desktop.
Encrypt and decrypt using Rsa and FromXmlString on .Net Standard 2.0
public class Encryptor
{
public static void WriteXmlForCert(string thumbprint, string fileName)
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
store.Close();
var cert = certs[0];
var rsa = (RSA)cert.PublicKey.Key;
var xml = rsa.ToXmlString2(false);
File.WriteAllText(fileName, xml);
}
public static byte[] Encrypt(string text, string xmlFileName)
{
var rsa = RSA.Create();
var xml = File.ReadAllText(xmlFileName);
rsa.FromXmlString2(xml);
var value = Encoding.UTF8.GetBytes(text);
var enc = rsa.Encrypt(value, RSAEncryptionPadding.Pkcs1);
return enc;
}
public static string Decrypt(string thumbprint, byte[] encrypted)
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true);
store.Close();
var cert = certs[0];
var privateKeyProvider = (System.Security.Cryptography.RSA)cert.PrivateKey;
var decr = privateKeyProvider.Decrypt(encrypted, RSAEncryptionPadding.Pkcs1);
return Encoding.UTF8.GetString(decr);
}
}
public static class RsaExtensions
{
public static void FromXmlString2(this RSA rsa, string xmlString)
{
RSAParameters parameters = new RSAParameters();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
if (xmlDoc.DocumentElement.Name.Equals("RSAKeyValue"))
{
foreach (XmlNode node in xmlDoc.DocumentElement.ChildNodes)
{
switch (node.Name)
{
case "Modulus": parameters.Modulus = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Exponent": parameters.Exponent = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "P": parameters.P = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "Q": parameters.Q = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DP": parameters.DP = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "DQ": parameters.DQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "InverseQ": parameters.InverseQ = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
case "D": parameters.D = (string.IsNullOrEmpty(node.InnerText) ? null : Convert.FromBase64String(node.InnerText)); break;
}
}
}
else
{
throw new Exception("Invalid XML RSA key.");
}
rsa.ImportParameters(parameters);
}
public static string ToXmlString2(this RSA rsa, bool includePrivateParameters)
{
RSAParameters parameters = rsa.ExportParameters(includePrivateParameters);
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
parameters.Modulus != null ? Convert.ToBase64String(parameters.Modulus) : null,
parameters.Exponent != null ? Convert.ToBase64String(parameters.Exponent) : null,
parameters.P != null ? Convert.ToBase64String(parameters.P) : null,
parameters.Q != null ? Convert.ToBase64String(parameters.Q) : null,
parameters.DP != null ? Convert.ToBase64String(parameters.DP) : null,
parameters.DQ != null ? Convert.ToBase64String(parameters.DQ) : null,
parameters.InverseQ != null ? Convert.ToBase64String(parameters.InverseQ) : null,
parameters.D != null ? Convert.ToBase64String(parameters.D) : null);
}
}
@runegri
Copy link
Author

runegri commented Sep 7, 2017

Extension methods stolen from here: dotnet/core#874
:-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment