用对称密钥对 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、在 对象中找到指定的元素,然后创建一个新的 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 对象传递给 属性。

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、 元素替换原始 对象中的元素。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇