Created
September 7, 2017 07:30
-
-
Save runegri/06d7c91f3a9cda4b2ade916bcb6e3229 to your computer and use it in GitHub Desktop.
Encrypt and decrypt using Rsa and FromXmlString on .Net Standard 2.0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Extension methods stolen from here: dotnet/core#874
:-)