5 程序实现
自从XML数字签名的规范发布以来,许多机构都对其进行深入研究并提供了解决方案,同时XML加密的规范也已经成型。但大多数签名与加密是基于Java平台的,包括IBM和NEC的签名库。为了打破Java“一统天下”的局面,本文采用C#语言在Visual Studio.Net 2003环境下实现XML电子病历的加密与签名。
微软公司在其.NET 2003平台中改进了XML的内核结构,对XML实现了完全的内部支持,可以使用其类库来编程。
5.1 XML Schema 检验的实现
在.NET Framework中,与XML Schema相关的类在 System.Xml.Schema下。
XmlTextReader reader = new XmlTextReader(flieName);
XmlValidatingReader objXValRead = new
XmlValidatingReader(reader);
objXValRead.ValidationType = ValidationType.Schema;
while(objXValRead.Read()){}
return true;
如果While语句为真,说明XML文档的结构符合Shema的描述。
5.2 XML加密的实现
在.NET Framework 中,与XML 加密相关的类集中在System.Security.Cryptography 和System.xml命名空间下,所以程序必须包含这两个命名空间。
步骤1: 生成RSA密钥对
利用.NET Framework下的Cryptography.RSA类来生成RSA非对称密钥,并分别将私钥与公钥保存为XML文档:
RSA Key = RSA.Create();
strPrivateKeyXML = Key.ToXmlString(true);
srrPublicKeyXML = Key.ToXmlString(false);
XmlDocument privateKeyXML,,publicKeyXML = new XmlDocument();
privateKeyXML.LoadXml(strPrivateKeyXML);
publicKeyXML.LoadXml(srrPublicKeyXML);
步骤2 : 通过Xpath语句判断加密次数,逐个加密:
nodes = doc.SelectNodes(strXpath);
nodeCount = nodes.Count;
for(int i=0;i<nodeCount;i++)
{
XmlNode currentNode = nodes.Item(i);
// EncrypXMLString方法是加密的具体实现
XmlElement xmlEncryptElement =
EncrypXMLString(currentNode.InnerXml,strKeyName);
} 通过Xpath语句可能找到多个节点,下面的步骤介绍EncrypXMLString方法的内容。
|