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

前端之家收集整理的这篇文章主要介绍了用对称密钥对 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

原文链接:https://www.f2er.com/xml/300174.html

猜你在找的XML相关文章