.net Xml加密解密操作
阅读原文时间:2023年07月13日阅读:1

生成密钥的方法:

///

生成RSA加密 解密的 密钥 /// 生成的key就是 方法EncryptByRSA与DecryptByRSA用的key了 ///
/// 要生成的密钥文件的路径(文件夹)
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 = "tovGC4FG9lfxrDu4+GZ9TzgdAlK4w57cOec/z4y87+2OVwPvd3eGe34a24/Q1eJBaQGHPJBq00LstnOJH19B2F+t7eHR7/WYYvpB98RPWhhwhCdirBs3scTNs3fLXmTrQf/5Xgy2X7TAjgbdQ4lEvG2VkbtcHZLh8+q3CH04lo8=AQAB";
private static string rsaKey_Decrypt = "tovGC4FG9lfxrDu4+GZ9TzgdAlK4w57cOec/z4y87+2OVwPvd3eGe34a24/Q1eJBaQGHPJBq00LstnOJH19B2F+t7eHR7/WYYvpB98RPWhhwhCdirBs3scTNs3fLXmTrQf/5Xgy2X7TAjgbdQ4lEvG2VkbtcHZLh8+q3CH04lo8=AQAB

/IZ7CU8o164bGlq6pNQvV8nx/Gw/5wALtZpE280tCTmlD6M5Wl8Bjketwqdek+Nh6qRlrdwOpFUlCxZ3girflQ==

uQ7KhsO+hTEPV316uYKPzWQr0es++TF62bOcQGitw6hv+IVI20MuPYZ17D04Nne7nmLkFQVu6+2jQqtPATRkkw==eq9bV0p+LUsJH+S0iSANYDlct6Zf5XrANZqdmaw1FSZMayyB0MYXm2h3ovptmKwABl+Yhr9C3dQAC0L/DN6HgQ==K9XZG3sakipA3BSZEYBf1+M2jg8PZ6/UzeTBynABWSt4+oF39JhBR8ml/UOzIRPTmX0LUf9reu9bkNtLZ5mliQ==PGKrRI66SftCvW3qWL1gJ2yqSL9qU+SDoc1TU54dLD5swTEFwEU03kw39M6rF4YJ3XAgA7ansreIsfvRkpy82A==qxvzpN8mHE2tLEvDA5xWQ4aOspnFtSBYwDICf1Ml2yRq8yeuNOal+WXoWPzCvWna9EnJcTzR1Xt7FT7RPsX0mfpRKJ2PmshFfjdoIx+gW+Y/zF4U+u3Dx4bbbNwKFxLRLwSQEzHVK1+Is6QIZiyCIj2NHOtOTmSGvMPgpVpEmlk=";

    //读取加密过的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