[翻译]xml的加密和解密

XML 文件加密与解密 做这个小程序实属无奈,客户担心文件泄露,要求我们加密,其实都不是什么重要的文件,纯属是客户给我们加工作量,但是也算是学到了一些东西,因此博主对客户的感情掺杂这爱与恨吧。下面看看我的程序吧,其实很简单,主要是用WPF做的。 加密解密文件当然要有相关的加密解密函数: public void Decrypt(string filename)//解密函数 { ... 阅读详情
原文地址: http://dotnetslackers.com/articles/xml/XMLEncryption.aspx
[原文源码下载]


[翻译]xml的加密和解密


原文发布日期:2006.12.15
作者: Derek Smyth
翻译: webabcd


xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留。


介绍
我们有3个加密xml的方法

1、仅仅使用对称加密的方法加密xml
这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密的xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取。

2、使用对称加密和非对称加密相结合的方法来加密xml
这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存在xml文档中。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。

本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。

(译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。)

3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。


方法
不管xml加密是如何完成的,保存加密数据总是用两种方法之一。
1、加密后所有的元素都被命名为<EncryptedData>
2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

这种微妙的变化是非常重要的。例如:

如果你的xml文档中包括被称为<employee>的根元素,该根元素有一个下存储了一段详细信息的被称做<WrittenWarning>的子元素。如果你发送这个xml,并且想<WrittenWarning>这个元素被保护起来,那么使用第1中方法的话<WrittenWarning>将被替换为<EncryptedData>,你不会从加密后的文档中获取到任何可读的信息。

如果使用第2种方法,那么<WrittenWarning>元素仍然被保留,只用数据会被加密。任何得到这个文档的人虽然不能知道该元素下的详细信息,但仍然知道有一些事情发生在这个雇员身上。另外,<WrittenWarning>元素的所有属性也不会被加密。

所以,如果没有特殊需求,我们一般都用第1种方法。在.net 2.0中你可以通过修改一个Boolean值的属性,便可以非常简单的选择使用哪种方法。

xml加密的例子
下面这个xml加密的例子使用的是非对称加密法,把xml文档的author元素下的内容加密并把author元素用<EncryptedData>给替换掉。

xml文档
<? xml version="1.0" standalone="no" ?>
< article >
  
< articleinfo >
    
< title > XPath Queries on XmlDocument objects in .NET 1.1 </ title >
    
< abstract >
      
< para > This article covers the basics. </ para >
    
</ abstract >
    
< author >
      
< honorific > Mr. </ honorific >
      
< firstname > George </ firstname >
      
< surname > James </ surname >
      
< email > gjames@doman.com </ email >
    
</ author >
  
</ articleinfo >   
</ article >

XPath表达式为/article/articleinfo/author

被加密后的xml文档
<? xml version="1.0" standalone="no" ?>
< article >
  
< articleinfo >
    
< title > XPath Queries on XmlDocument objects in .NET 1.1 </ title >
    
< abstract >
      
< para > This article covers the basics. </ para >
      
< para > This article does not cover. </ para >
    
</ abstract >
    
< EncryptedData  Type ="http://www.w3.org/2001/04/xmlenc#Element"  
        xmlns
="http://www.w3.org/2001/04/xmlenc#" >
      
< EncryptionMethod             Algorithm ="http://www.w3.org/2001/04/xmlenc#aes256-cbc"   />
      
< KeyInfo  xmlns ="http://www.w3.org/2000/09/xmldsig#" >
        
< EncryptedKey  xmlns ="http://www.w3.org/2001/04/xmlenc#" >
          
< EncryptionMethod                 Algorithm ="http://www.w3.org/2001/04/xmlenc#rsa-1_5"   />
          
< KeyInfo  xmlns ="http://www.w3.org/2000/09/xmldsig#" >
            
< KeyName > session </ KeyName >
          
</ KeyInfo >
          
< CipherData >
            
< CipherValue > r4f7SI1aZKSvibb… </ CipherValue >
          
</ CipherData >
        
</ EncryptedKey >
      
</ KeyInfo >
      
< CipherData >
        
< CipherValue > sGNhKqcSovipJdOFCFKYEEMRFd… </ CipherValue >
      
</ CipherData >
    
</ EncryptedData >
  
</ articleinfo >
</ article >

author元素及其子元素都将被<EncryptedData>给替换掉,另外还包括其他一些元素,如加密算法,密钥等。

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


EncryptedData元素被包含在“http://www.w3.org/2001/04/xmlenc#”命名空间中。它是被加密数据的根元素。

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

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

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

KeyInfo下的EncryptionMethod元素包含的非对称加密方法用来加密对称密钥。做这件事需要把一个算法属性设置给w3 url。例如:“http://www.w3.org/2001/04/xmlenc#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();


总结
xml加密(XML Encryption)是w3c加密xml的标准。加密后的文档仍然是xml格式。我们使用非对称和对称算法来加密xml,对称算法用于加密数据,非对称算法用于加密对称算法中的密钥,加密后的数据被保存在EncryptedData元素下。EncryptedData元素包含着一些列用于描述算法的子元素,同时也包含着密钥信息。


参考
W3C Encryption Standard


下载
[原文源码下载]


译者补充:
.net 2.0下加密和解密web.config文件中的某个section

aspnet_regiis –pef appSettings C:/Inetpub/wwwroot/website

aspnet_regiis –pdf appSettings C:/Inetpub/wwwroot/website
DocuTranslator技术原理解析 本文详细介绍了DOCX文件英译中的技术实现方案,核心是保持原始格式不变。系统采用三层架构:DocxWorkflow读取文件、DocxTranslator处理翻译、Docx2DocxExporter输出结果。关键技术包括: 文档解析:基于XML层操作,递归遍历文档结构,智能处理段落、表格、页眉页脚等元素,过滤非文本标签。 文本分片策略:将Run元素按显著格式分组(如高亮、下划线),保持语义完整性;超长文本按行拆分后合并翻译结果。 阅读详情

相关推荐

微信本地聊天记录解密与解析:从SQLCipher加密到数据提取实战

数据加密与本地存储是保障用户隐私和信息安全的核心技术,其中SQLCipher作为SQLite的透明加密扩展,广泛应用于各类桌面和移动应用。其原理是通过AES-256算法对数据库文件进行加密,确保未经授权无法直接访问。这项技术的工程价值在于,它允许开发者在应用层实现强安全性的同时,保持数据的可移植性。对于普通用户和开发者而言,理解本地加密数据的结构,能够在数据备份、迁移或合规性审计等场景下,实现对自有数据的有效管理和利用。例如,在个人聊天记录归档或工作凭证整理的需求中,掌握对加密数据库的解密与解析方法,就变得

weixin_30263277的博客 342

XML加密/解密/签名

用Java数字签名提供XML安全 Apache Santuario

来啊 快活啊 5911

XML加密和数字签名

XMLCipher:XMLCipher 类是 javax.xml.crypto.dsig.XMLSignature 包中的主要类,用于执行 XML 加密和解密操作。它提供了加密和解密 XML 数据的功能。EncryptedData:EncryptedData 类用于表示加密的 XML 数据。它包含加密数据和加密算法的信息。KeyInfo:KeyInfo 类用于表示与密钥相关的信息,如密钥的类型、密钥的值等。在 XML 加密中,它通常包含用于解密的密钥信息。

ldk99_的博客 1328

【转】[翻译]xml的加密和解密

From:http://www.cnblogs.com/webabcd/archive/2007/02/03/639164.html 原文地址:http://dotnetslackers.com/articles/xml/XMLEncryption.aspx[原文源码下载] [翻译]xml的加密和解密 原文发布日期:2006.12.15作者:Derek Smyth翻译:webabcdxml加...

weixin_30527551的博客 96

xml加密解密工具XMLEncryption

xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留。 介绍 我们有3个加密xml的方法 1、仅仅使用对称加密的方法加密xml 这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥。因为这个密钥不会在被加密的xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取。 2、使用对称加密和非对称加密相结合的方法来加密xml 这种方法需要一个用于加密数据的对称密钥和一个用于保护这个对称密钥的非对称密钥。被加密的对称密钥和被加密的数据一起保存在xml文档中。当用私有非对称密钥解密密钥的时候要用公开非对称密钥对密钥进行加密。 本文就将使用这种方法。想学到其他更多的方法请参看MSDN等到更多的信息。 (译者注:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。) 3、使用X.509加密xml,这种方法是用X.509作为非对称密钥,它由诸如VeriSign之类的第三方提供。 方法 不管xml加密是如何完成的,保存加密数据总是用两种方法之一。 1、加密后所有的元素都被命名为 2、加密后只有数据被替换,而元素名称仍然是可读的,不会发生变化。

10位PWM能否满足电梯±5mm平层精度?4位扩展法让10位PWM达到14位精度

电梯平层精度直接关系乘坐舒适性与安全性,而PWM分辨率是决定精度的关键因素之一。10位PWM能否满足±5mm的平层精度要求?本文从分辨率与物理量的对应关系出发,结合工程精度需求与实战对比,给出明确的选型结论与解决方案,请参考优快云博客《4位扩展法:基于ATtiny816的高精度PWM软件扩展方法》和《低成本高精度PWM:4位扩展法原理、实现和工程实践》。10位PWM的分辨率为 $2^{10} = 1024$ 级。

m0_73354873的博客 243

Convert.NET语言代码转换及翻译工具

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34293902的博客 317

LaTeX参考文献格式apsrev4-1,增加文献标题

APS的LaTeX参考文献格式apsrev4-1是隐藏标题的,如果想要出现标题,需要更改apsrev4-1.bst文件内容 在apsrev4-1.bst文件靠后部分,定义不同类型文献格式的地方,将article类型的内容替换为, FUNCTION {article} { output.bibitem format.authors booktitle empty$ { "author" output.check }{ output } if$ author format.

loading1234567的博客 5031

xml的加密和解密

[翻译]xml的加密和解密原文地址:http://dotnetslackers.com/articles/xml/XMLEncryption.aspx[原文源码下载]原文发布日期:2006.12.15作者:Derek Smyth翻译:webabcdxml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,

GSE的成长之路 2745

论文学习| PoseDiffusion: 通过扩散辅助的束调整解决姿态估计问题

解决的问题:相机姿态估计,这是计算机视觉中的一个经典问题。提出的方法:一种新的方法,PoseDiffusion,它将Structure from Motion(SfM,从运动中构建结构)问题整合到概率扩散框架中。优势模拟捆绑调整的迭代过程。整合来自极线几何的几何约束。在具有挑战性的场景中(如视角稀疏、基线宽的情况)表现良好。能够为多张图片预测内外参。结果:在现实世界数据集上,PoseDiffusion超越了经典的SfM管道和学习型方法,在不同数据集上具有跨数据集的泛化能力,无需进一步训练。

麻辣小香郭的博客 1990

百度网盘开放平台OAuth 2.0授权全流程解析

本文详细解析了百度网盘开放平台OAuth 2.0授权全流程,包括创建应用、获取凭证、授权码模式详解以及access_token的使用与刷新。通过实际案例和代码示例,帮助开发者快速掌握接口调用技巧,避免常见错误,确保安全高效地接入百度网盘API。

wind6的博客 1264

xml的加密和解密--SOA必备

[翻译]xml的加密和解密 原文地址:http://dotnetslackers.com/articles/xml/XMLEncryption.aspx [原文源码下载] 原文发布日期:2006.12.15 作者:Derek Smyth 翻译:webabcd xml加密(XML Encryption)是w3c加密xml的标准。这个加密过程包括加密xml文档的元素及其子元

程序亦人生 1100

C#利用最小二乘法拟合任意次函数曲线

给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。因此,我们需要一种新的逼近原函数的手段: ①不要求过所有的点(可以消除误差影响);②尽可能表现数据的趋势,靠近这些点。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小 [1],其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达,具体可以查阅相关资料。最小二乘法(又称最小平方法)是一种数学技术。

qq_30725967的博客 3755

硬解密和软解码的区别_快速:编码,解码,加密,解密和散列

硬解密和软解码的区别 编码方式 (Encoding) Encoding is a process of conversion of data from one format to another. It includes the utilization of a code to change unique information into a structure that can be utili...

weixin_26722031的博客 1200

5、高级综合技术:从调度到优化的全面解析

本文深入解析了高级综合技术,涵盖从控制/数据流图构建、调度算法、分配绑定策略到编译器优化的全流程。通过案例分析和对比,探讨了不同优化策略对性能和资源利用的影响,并总结了关键要点及未来发展趋势,为高效利用FPGA实现数字设计提供了全面指导。

night的博客 117

yolov5-6.0的稀疏化训练、结构化剪枝、微调

YOLOv5的BN剪枝、微调

qq_41920323的博客 4394

Solid Table 虚拟化渲染实战指南:用 TanStack Table + Solid Virtual 构建高性能虚拟表格

本指南围绕 TanStack Table(Solid 适配层 `@tanstack/solid-table`)与 `@tanstack/solid-virtual` 的配合使用,系统讲解在 Solid 应用中实现虚拟化行、虚拟化列、无限滚动以及动态行高测量等高性能表格渲染方案。你将掌握:为什么虚拟化是"渲染策略"而非"表格功能"、虚拟化表格的标准搭建模式、两个虚拟化器(行/列)的协作方式,以及官方

gitblog_01425的博客 691

YOLOv11 模型改进:利用新型损失函数实现精度跃升(含代码全解析)

在目标检测领域,损失函数的选择直接决定模型的精度上限。某自动驾驶公司将 YOLOv11 原有损失替换为新型损失后,障碍物检测 mAP 提升 10%,夜间场景误检率降低 22%;某物流分拣项目中,采用新损失的 YOLOv11 模型对小包裹的识别准确率从 82% 升至 96%。如果你也在为模型精度瓶颈、样本不平衡问题困扰,这篇教程将带你掌握 YOLOv11 损失函数的进阶技巧,真正帮你在检测性能上实现突破。损失函数是模型训练的“指南针”,它定义了模型“学习的方向”。传统损失(如 BCE、Focal Loss)在

m0_71589036的博客 713

spring boot 配置 jasypt 加密配置

<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>1.14</version> </dependency> 1 简介 在上一篇文章中,介绍了Jasypt及其用法,具体细节可以查.

m0_37588079的博客 1628

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Clawdbot汉化版灰盒测试:Postman构造企业微信加密消息→验证gateway解密逻辑

本文介绍了如何在星图GPU平台上自动化部署Clawdbot 汉化版 增加企业微信入口镜像,实现企业微信加密消息的接收、解密与AI响应闭环。该镜像专为国内办公场景优化,支持在企业微信中直接调用本地大模型处理会议纪要生成、审批协助、周报撰写等任务,兼顾数据隐私与工作流无缝集成。

weixin_35732273的博客 443

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

加密与解密入门

Base64百度百科: Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Ba

bin的专栏 3297

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jsx加密详解

JSX解密技术主要应用于Adobe插件开发和前端开发领域,用于还原加密或混淆的代码逻辑。解密方法包括变量名还原、函数结构分析和第三方库执行,其中Adobe插件JSX通常涉及文件/图层操作API,而前端加密则可能使用CryptoJS等库。关键工具有ExtendScript Toolkit调试工具和CryptoJS加解密库。该技术可帮助开发者理解代码功能、修复问题或进行二次开发,特别适用于处理批量操作的混淆脚本。

mxd01848的博客 403
上一篇: 扩展GridView控件(9) - 给数据行增加右键菜单
下一篇: 扩展GridView控件(10) - 自定义分页样式
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值