zoukankan      html  css  js  c++  java
  • .net Xml加密解密操作

    生成密钥的方法:

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

  • 相关阅读:
    【SCOI2012】滑雪
    【NOI2008】假面舞会
    ※初赛知识总结※
    【FJSC2012】足球
    【中山市选2011】杀人游戏
    【SDOI2008】洞穴勘测
    【SNOI2017】炸弹
    【LGOJ1606】白银莲花池
    int类型中为什么负数比正数多了一个数?
    utf8、utf16、utf32之间的格式
  • 原文地址:https://www.cnblogs.com/happyqiang/p/11003827.html
Copyright © 2011-2022 走看看