使用EncryptedXml加密XML指定节点是.NET标准做法:先定位目标节点,用EncryptData加密其InnerXml,再用ReplaceElement替换为结构。

使用 EncryptedXml 加密 XML 文件中**指定节点**(而非整个文档)是 .NET 提供的标准做法,核心在于:先定位目标 XmlNode,用 EncryptedXml.EncryptData 加密其内部内容(如 InnerXml),再用 EncryptedXml.ReplaceElement 将原节点替换成 结构。
1. 准备密钥和待加密的 XML 节点
必须有对称密钥(如 Aes)或非对称密钥(如 RSA)。加密部分节点通常推荐用对称密钥——效率高、适合加密数据块。确保密钥安全保管,不要硬编码。
- 创建
Aes实例并生成随机密钥/IV(用于后续加密) - 加载 XML 文档,用 XPath 或
GetElementsByTagName定位要加密的节点(例如) - 注意:该节点不能是文档根节点(
EncryptedXml不支持直接加密 DocumentElement)
2. 加密节点内容并生成 EncryptedData 元素
调用 EncryptedXml.EncryptData 对节点的 InnerXml 字节进行加密,返回加密后的字节数组;再用 EncryptedXml.CreateEncryptedData 和 EncryptKey 包装密钥(若需密钥加密),最终构造出标准的 元素。
intense图片全屏浏览插件(jQuery),当鼠标点击图片时,可以全屏幕浏览图片,移动鼠标可以查看图片不同的部分,适合相册展示图片细节。兼容主流浏览器,php中文网推荐下载! 使用方法: 1、head区域引用文件styles.css及intense.js 2、在文件中加入区域代码 3、复制images文件夹
- 示例关键步骤:
byte[] encryptedBytes = encryptedXml.EncryptData(targetNode, aes, false);
EncryptedData ed = new EncryptedData();
ed.Type = EncryptedXml.XmlEncElementUrl;
ed.Id = "EncryptedNode1";
ed.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url);
ed.CipherData.CipherValue = encryptedBytes; - 若用 RSA 加密会话密钥,需额外调用
encryptedXml.EncryptKey并设置ed.KeyInfo
3. 替换原节点并保存结果
调用 EncryptedXml.ReplaceElement(targetNode, ed, aes) —— 这一步会自动把原节点替换成 ,同时将密钥信息(如 )注入到父级或指定位置(取决于参数)。
- 替换后,原节点从 DOM 中移除,
成为其父节点的子节点 - 调用
xmlDoc.Save("out.xml")即可持久化含加密片段的 XML - 解密时用相同密钥和
EncryptedXml.DecryptDocument()可全自动还原所有节点
4. 注意事项与常见问题
加密后 XML 仍保持格式良好,但内容不可读;实际应用中需关注密钥分发、IV 管理和签名配合(防篡改)。
-
不要加密空节点或只含空白文本的节点——
EncryptData可能抛出异常 -
加密前建议规范化节点(如
targetNode.Normalize()),避免因文本节点拆分导致加密不完整 -
若 XML 含命名空间,务必在加载时保留
XmlNameTable,否则EncryptedXml解密可能失败 - 调试时可用
EncryptedXml.GetDecryptionKey自定义密钥解析逻辑(如从证书或配置读取)









