用对称密钥对 XML 元素进行加密解密

1、使用 RijndaelManaged 类生成一个对称密钥。该密钥将被用来对 XML 元素进行加密。

RijndaelManaged key = null;

try
{
    // Create a new Rijndael key.
    key = new RijndaelManaged();
2、通过从磁盘加载 XML 文件创建  XmlDocument  对象。 XmlDocument  对象包含要加密的 XML 元素。

// Load an XML document.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load("test.xml");
3、在  XmlDocument  对象中找到指定的元素,然后创建一个新的  XmlElement  对象来表示要加密的元素。在此示例中, "creditcard"  元素要加密。

XmlElement elementToEncrypt = xmlDoc.GetElementsByTagName("creditcard")[0] as XmlElement;
4、 创建  EncryptedXml  类的新实例,并使用它通过对称密钥对  XmlElement  进行加密。 EncryptData  方法将加密的元素作为加密字节的数组返回。

EncryptedXml eXml = new EncryptedXml();

byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, Key, false);
5、 构造一个  EncryptedData  对象,然后用 XML 加密元素的 URL 标识符填充它。此 URL 标识符使解密方知道 XML 包含一个加密元素。可以使用 XmlEncElementUrl  字段指定 URL 标识符。

EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
6、创建  EncryptionMethod  对象,该对象被初始化为用来生成密钥的加密算法的 URL 标识符。将  EncryptionMethod  对象传递给  EncryptionMethod  属性。

string encryptionMethod = null;

if (Key is TripleDES)
{
    encryptionMethod = EncryptedXml.XmlEncTripleDESUrl;
}
else if (Key is DES)
{
    encryptionMethod = EncryptedXml.XmlEncDESUrl;
}
if (Key is Rijndael)
{
    switch (Key.KeySize)
    {
        case 128:
            encryptionMethod = EncryptedXml.XmlEncAES128Url;
            break;
        case 192:
            encryptionMethod = EncryptedXml.XmlEncAES192Url;
            break;
        case 256:
            encryptionMethod = EncryptedXml.XmlEncAES256Url;
            break;
    }
}
else
{
    // Throw an exception if the transform is not in the previous categories
    throw new CryptographicException("The specified algorithm is not supported for XML Encryption.");
}

edElement.EncryptionMethod = new EncryptionMethod(encryptionMethod);
7、 将加密的元素数据添加到  EncryptedData  对象中。

edElement.CipherData.CipherValue = encryptedElement;
8、 用  EncryptedData  元素替换原始  XmlDocument  对象中的元素。

EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);


例:

实现代码:

添加System.Security引用
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;


1、在程序中添加两个方法:
        //加密方法
        public void Encrypt(XmlDocument Doc, string ElementName, SymmetricAlgorithm Key)
        {
            XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementName)[0] as XmlElement;
            EncryptedXml eXml = new EncryptedXml();
            byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, Key, false);
            EncryptedData edElement = new EncryptedData();
            edElement.Type = EncryptedXml.XmlEncElementUrl;
            string encryptionMethod = null;

            if (Key is TripleDES)
            {
                encryptionMethod = EncryptedXml.XmlEncTripleDESUrl;
            }
            else if (Key is DES)
            {
                encryptionMethod = EncryptedXml.XmlEncDESUrl;
            }
            if (Key is Rijndael)
            {
                switch (Key.KeySize)
                {
                    case 128:
                        encryptionMethod = EncryptedXml.XmlEncAES128Url;
                        break;
                    case 192:
                        encryptionMethod = EncryptedXml.XmlEncAES192Url;
                        break;
                    case 256:
                        encryptionMethod = EncryptedXml.XmlEncAES256Url;
                        break;
                }
            }
            edElement.EncryptionMethod = new EncryptionMethod(encryptionMethod);
            edElement.CipherData.CipherValue = encryptedElement;
            EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
        }

        //解密方法
        public void Decrypt(XmlDocument Doc, SymmetricAlgorithm Alg)
        {
            XmlElement encryptedElement = Doc.GetElementsByTagName("EncryptedData")[0] as XmlElement;
            EncryptedData edElement = new EncryptedData();
            edElement.LoadXml(encryptedElement);
            EncryptedXml exml = new EncryptedXml();
            byte[] rgbOutput = exml.DecryptData(edElement, Alg);
            exml.ReplaceData(encryptedElement, rgbOutput);
        }

2、加密
        //加密
        private void 加密_Click(object sender, EventArgs e)
        {
            RijndaelManaged key = new RijndaelManaged();
            //设置密钥:key为32位=数字或字母16个=汉字8个
            byte[] byteKey = Encoding.Unicode.GetBytes("1111111111111111");
            key.Key = byteKey;
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("test.xml");//加载要加密的XML文件
            Encrypt(xmlDoc, "items", key);//需要加密的节点
            if (key != null)
            {
                key.Clear();
            }
            xmlDoc.Save("etest.xml");//生成加密后的XML文件
            MessageBox.Show("OK");
        }

3、解密
        //解密
        private void 解密_Click(object sender, EventArgs e)
        {
            RijndaelManaged key = new RijndaelManaged();
            //设置密钥:key为32位=数字或字母16个=汉字8个
            byte[] byteKey = Encoding.Unicode.GetBytes("1111111111111111");
            key.Key = byteKey;
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load("etest.xml");//加载要解密的XML文件
            Decrypt(xmlDoc, key);
            if (key != null)
            {
                key.Clear();
            }
            xmlDoc.Save("eotest.xml");//生成解密后的XML文件
            MessageBox.Show("OK");
        }

参考MSDN:http://msdn2.microsoft.com/zh-cn/library/sb7w85t6(VS.80).aspx



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值