当前位置 : 主页 > 网页制作 > xml >

.net Xml加密解密操作

来源:互联网 收集:自由互联 发布时间:2021-06-13
生成密钥的方法: /// summary 生成RSA加密 解密的 密钥 /// 生成的key就是 方法EncryptByRSA与DecryptByRSA用的key了 /// /summary /// param name="path" 要生成的密钥文件的路径(文件夹) /param public static vo

生成密钥的方法:

/// <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

网友评论