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

  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/happyqiang/p/11003827.html
Copyright © 2011-2022 走看看