生成密钥的方法:
/// <summary>生成RSA加密 解密的 密钥 /// 生成的key就是 方法EncryptByRSA与DecryptByRSA用的key了 /// </summary> /// <param name="path">要生成的密钥文件的路径(文件夹)</param> public static void getRSAKey(string path) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); string datetimestr = System.DateTime.Now.ToString("yyyyMMddHHmmss"); using (StreamWriter writer = new StreamWriter("RSA解密_PrivateKey_" + datetimestr + ".xml")) //这个文件要保密... { writer.WriteLine(rsa.ToXmlString(true)); } using (StreamWriter writer = new StreamWriter("RSA加密_PublicKey_" + datetimestr + ".xml")) { writer.WriteLine(rsa.ToXmlString(false)); } }
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
添加.net引用:System.Security.dll .net2.0及以上支持
#region 操作xml文件(加密解密xml;读取加密xml) private static string rsaKeyname = "wqras";//
//以下加密解密,密钥 就是上面getRSAKey方法生成的xml文件里面的内容了 private static string rsaKey_Encrypt = "<RSAKeyValue><Modulus>tovGC4FG9lfxrDu4+GZ9TzgdAlK4w57cOec/z4y87+2OVwPvd3eGe34a24/Q1eJBaQGHPJBq00LstnOJH19B2F+t7eHR7/WYYvpB98RPWhhwhCdirBs3scTNs3fLXmTrQf/5Xgy2X7TAjgbdQ4lEvG2VkbtcHZLh8+q3CH04lo8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; private static string rsaKey_Decrypt = "<RSAKeyValue><Modulus>tovGC4FG9lfxrDu4+GZ9TzgdAlK4w57cOec/z4y87+2OVwPvd3eGe34a24/Q1eJBaQGHPJBq00LstnOJH19B2F+t7eHR7/WYYvpB98RPWhhwhCdirBs3scTNs3fLXmTrQf/5Xgy2X7TAjgbdQ4lEvG2VkbtcHZLh8+q3CH04lo8=</Modulus><Exponent>AQAB</Exponent><P>/IZ7CU8o164bGlq6pNQvV8nx/Gw/5wALtZpE280tCTmlD6M5Wl8Bjketwqdek+Nh6qRlrdwOpFUlCxZ3girflQ==</P><Q>uQ7KhsO+hTEPV316uYKPzWQr0es++TF62bOcQGitw6hv+IVI20MuPYZ17D04Nne7nmLkFQVu6+2jQqtPATRkkw==</Q><DP>eq9bV0p+LUsJH+S0iSANYDlct6Zf5XrANZqdmaw1FSZMayyB0MYXm2h3ovptmKwABl+Yhr9C3dQAC0L/DN6HgQ==</DP><DQ>K9XZG3sakipA3BSZEYBf1+M2jg8PZ6/UzeTBynABWSt4+oF39JhBR8ml/UOzIRPTmX0LUf9reu9bkNtLZ5mliQ==</DQ><InverseQ>PGKrRI66SftCvW3qWL1gJ2yqSL9qU+SDoc1TU54dLD5swTEFwEU03kw39M6rF4YJ3XAgA7ansreIsfvRkpy82A==</InverseQ><D>qxvzpN8mHE2tLEvDA5xWQ4aOspnFtSBYwDICf1Ml2yRq8yeuNOal+WXoWPzCvWna9EnJcTzR1Xt7FT7RPsX0mfpRKJ2PmshFfjdoIx+gW+Y/zF4U+u3Dx4bbbNwKFxLRLwSQEzHVK1+Is6QIZiyCIj2NHOtOTmSGvMPgpVpEmlk=</D></RSAKeyValue>"; //读取加密过的xml文档 private static XmlDocument GetDecryptXmlDoc(string xmlpath) { XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.PreserveWhitespace = true; xmlDoc.Load(xmlpath); } catch (Exception e) { return xmlDoc; } RSA rsaKey = new RSACryptoServiceProvider(); try { rsaKey.FromXmlString(rsaKey_Decrypt); //解密xml文档 Decrypt(xmlDoc, rsaKey, rsaKeyname); //xmlDoc.Save("test.xml"); } catch (Exception e) { } finally { rsaKey.Clear(); } return xmlDoc; } //加密xml
public static void EncryptMyXml(string xmlpath) { XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.PreserveWhitespace = true; xmlDoc.Load(xmlpath); } catch (Exception e) { return; } RSA rsaKey = new RSACryptoServiceProvider(); try { rsaKey.FromXmlString(rsaKey_Encrypt); //加密某节点 Config Encrypt(xmlDoc, "Config", rsaKey, rsaKeyname); xmlDoc.Save(xmlpath); } catch (Exception e) { } finally { rsaKey.Clear(); } } //解密xml public static void DecryptMyXml(string xmlpath) { XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.PreserveWhitespace = true; xmlDoc.Load(xmlpath); } catch (Exception e) { return; } RSA rsaKey = new RSACryptoServiceProvider(); try { rsaKey.FromXmlString(rsaKey_Decrypt); //解密 Decrypt(xmlDoc, rsaKey, rsaKeyname); xmlDoc.Save(xmlpath); } catch (Exception e) { } finally { rsaKey.Clear(); } } //xml加密 public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, RSA Alg, string KeyName) { // Check the arguments. if (Doc == null) throw new ArgumentNullException("Doc"); if (ElementToEncrypt == null) throw new ArgumentNullException("ElementToEncrypt"); if (Alg == null) throw new ArgumentNullException("Alg"); //////////////////////////////////////////////// // Find the specified element in the XmlDocument // object and create a new XmlElemnt object. //////////////////////////////////////////////// XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement; // Throw an XmlException if the element was not found. if (elementToEncrypt == null) { throw new XmlException("The specified element was not found"); } ////////////////////////////////////////////////// // Create a new instance of the EncryptedXml class // and use it to encrypt the XmlElement with the // a new random symmetric key. ////////////////////////////////////////////////// // Create a 256 bit Rijndael key. RijndaelManaged sessionKey = new RijndaelManaged(); sessionKey.KeySize = 256; EncryptedXml eXml = new EncryptedXml(); byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false); //////////////////////////////////////////////// // Construct an EncryptedData object and populate // it with the desired encryption information. //////////////////////////////////////////////// EncryptedData edElement = new EncryptedData(); edElement.Type = EncryptedXml.XmlEncElementUrl; // Create an EncryptionMethod element so that the // receiver knows which algorithm to use for decryption. edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url); // Encrypt the session key and add it to an EncryptedKey element. EncryptedKey ek = new EncryptedKey(); byte[] encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, Alg, false); ek.CipherData = new CipherData(encryptedKey); ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url); // Set the KeyInfo element to specify the // name of the RSA key. // Create a new KeyInfo element. edElement.KeyInfo = new KeyInfo(); // Create a new KeyInfoName element. KeyInfoName kin = new KeyInfoName(); // Specify a name for the key. kin.Value = KeyName; // Add the KeyInfoName element to the // EncryptedKey object. ek.KeyInfo.AddClause(kin); // Add the encrypted key to the // EncryptedData object. edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek)); // Add the encrypted element data to the // EncryptedData object. edElement.CipherData.CipherValue = encryptedElement; //////////////////////////////////////////////////// // Replace the element from the original XmlDocument // object with the EncryptedData element. //////////////////////////////////////////////////// EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false); } //xml解密 public static void Decrypt(XmlDocument Doc, RSA Alg, string KeyName) { // Check the arguments. if (Doc == null) throw new ArgumentNullException("Doc"); if (Alg == null) throw new ArgumentNullException("Alg"); if (KeyName == null) throw new ArgumentNullException("KeyName"); // Create a new EncryptedXml object. EncryptedXml exml = new EncryptedXml(Doc); // Add a key-name mapping. // This method can only decrypt documents // that present the specified key name. exml.AddKeyNameMapping(KeyName, Alg); // Decrypt the element. exml.DecryptDocument(); } #endregion
参考资料:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.xml.encryptedxml?view=netframework-2.0