asp.net下XML的加密和解密实现方法(2)

仔细看看<EncryptedData>元素的树形结构,你会发现<EncryptedData>元素下分解出了很多子元素。其中<KeyInfo>元素与xml数字签名中的<KeyInfo>元素是相同的。

asp.net下XML的加密和解密实现方法

EncryptedData元素被包含在“#”命名空间中。它是被加密数据的根元素。

EncryptionMethod元素指定加密数据的对称方法。做这件事需要使用一个包含了w3 url的算法属性 - “#aes256-cbc”,它指出数据是用AES(Rijndael)以256k的密钥加密的。

KeyInfo元素来自xml数字签名,它保存着对称密钥的信息,除此之外该元素还能保存更多的信息。

KeyInfo元素下的EncryptedKey元素及其子元素包含着关于被保存的密钥的信息。

KeyInfo下的EncryptionMethod元素包含的非对称加密方法用来加密对称密钥。做这件事需要把一个算法属性设置给w3 url。例如:“#rsa-1_5”说明使用了RSA非对称算法来加密对称密钥。

KeyName元素是一个标识符,用来发现密钥。稍后在我们编程的时候你将会发现它的重要性。

CipherData元素和CipherValue元素出现在EncryptedKey元素和EncryptedData元素下,它们包含着密码数据。事实上密码数据保存在CipherValue元素下的。EncryptedKey元素下保存的是被加密的密钥,EncryptedData元素下的CipherValue保存的是被加密的数据。

非对称xml加密步骤

xml加密的过程可以概括为以下五步:

1、选择xml文档中的一个元素(选择根元素的话将加密整个文档)

2、使用一个对称密钥加密元素

3、使用非对称加密来加密上面那个对称密钥(使用公开密钥)

4、创建一个EncryptedData元素,该元素下将包含被加密的数据和被加密的密钥

5、用加密后的元素替换掉初始元素。

这些步骤的大部分都可以使用.net 2.0中的类自动完成。

非对称xml解密步骤

xml解密的过程可以概括为以下四步:

1、在xml文档中选择一个EncryptedData元素

2、使用一个非对称密钥来解密密钥(使用私有密钥)

3、使用未加密的密钥来解密数据

4、把EncryptedData元素替换成未加密的元素

这些步骤的大部分都可以使用.net 2.0中的类自动完成。

命名空间

完成xml的加密,我们需要引入三个命名空间

System.Xml - 包含操作xml的类

System.Security.Cryptography - 包含生成加密密钥的类

System.Security.Cryptography.Xml - 包含完成加密任务的类

使用.net加密xml

本文提供了一个简单的加密、解密xml的应用程序,下面我们一起来看一看相关的代码。这个示例只有一些基本功能,你可以再额外加一些如选择节点之类的功能

首先加载非对称公开密钥来加密密钥

// 创建一个用于加密密钥的非对称密钥
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// 加载一个公开密钥
XmlDocument pubKeys = new XmlDocument();
pubKeys.Load(Application.StartupPath + "\\xml.dev.keys.public");
// 使用公开密钥加密密钥
rsa.FromXmlString(pubKeys.OuterXml);
 

接下来加载xml文档并选择一个需要加密的节点。下面的代码示例了如何使用一个XPath表达式来选择节点。如果不选择节点,则整个xml文档都将被加密。

// xml文档
this.xmlEncDoc = new XmlDocument();

// 给xml文档加载一些节点和数据(省略)

XmlElement encElement;
// 如果没有xpath则
if (xpath == string.Empty)
{
encElement = this.xmlEncDoc.DocumentElement;
}
else
{
XmlNamespaceManager xmlns = this.xmlCntrlr.xmlnsManager;
// 通过xpath选择出需要加密的元素
encElement = this.xmlEncDoc.SelectSingleNode(xpath, xmlns) as XmlElement;
}
 

使用EncryptedXml类去加密数据和密钥

// 完成加密xml的类
EncryptedXml xmlEnc = new EncryptedXml(this.xmlEncDoc);
// 增加一个“session”密钥,使用rsa编码
xmlEnc.AddKeyNameMapping("session", rsa);
// 使用“session”密钥来加密数据
// 这些信息被保存在KeyInfo元素下
EncryptedData encData = xmlEnc.Encrypt(encElement, "session");
 

用加密后的元素替换初始元素

// 用加密后的元素替换初始元素
EncryptedXml.ReplaceElement(encElement, encData, false);
 

使用.net解密xml

首先加载私有非对称密钥来解密密钥

// 创建一个用于解密密钥的非对称密钥
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// 加载私有密钥
XmlDocument privKeys = new XmlDocument();
privKeys.Load(Application.StartupPath + "\\xml.dev.keys.private");
// 使用私有密钥来解密密钥
rsa.FromXmlString(privKeys.OuterXml);
增加一个密钥名称并映射到被加密的文档中
// 增加一个密钥名称并映射到被加密的文档中
EncryptedXml encXml = new EncryptedXml(xmlEncDoc);
encXml.AddKeyNameMapping("session", rsa);
通过指定的密钥来解密文档的每一个EncryptedData元素
// 解密所有<EncryptedData>元素
encXml.DecryptDocument();
 

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjjxpj.html