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