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("2222222222222221"); 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("2222222222222221"); 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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|