如何获取XML文档并在.Net中加扰所有文本元素以使其对人类不可读?
E.g。使
<root><Node1>My Name is Ben</Node1></root>
向
<root><Node1>klj sdlasd asdjfl</Node1></root>
点数:
答案 0 :(得分:2)
我能想到的最简单的双向加密方法是只取每个字符的ASCII值并为其添加一个常量,比如3.然后通过从每个字符中减去3将其转换回来。
原件:
Hello this is scrambled.
加扰:
Khoor#wklv#lv#vfudpeohg1
Python代码因为我太喜欢Python了:
def scramble(str):
return ''.join([chr(ord(c)+3) for c in str])
def unscramble(str):
return ''.join([chr(ord(c)-3) for c in str])
答案 1 :(得分:1)
如果你试图对它进行模糊处理,那么在.NET框架中使用内置的加密类比构建一个加扰类更简单。如果您不关心安全性,那么只需对密码和初始化向量进行硬编码。
出于好奇,你为什么要争抢它,只是为了让它具有人性化的可靠性?
答案 2 :(得分:1)
只需使用Convert.ToBase64String
和Convert.FromBase64String
还有一个额外的好处,即确保你不必担心转义字符,虽然它确实会增加字符串的长度。
答案 3 :(得分:1)
using System;
using System.Linq;
using System.Xml.Linq;
using System.Collections.Generic;
namespace App
{
class Scrambler
{
public static void ScrambleTextNodes(XContainer xml)
{
foreach (XText textNode in GetDescendantTextNodes(xml))
textNode.Value = Scramble(textNode.Value);
}
public static void UnScrambleTextNodes(XContainer xml)
{
foreach (XText textNode in GetDescendantTextNodes(xml))
textNode.Value = UnScramble(textNode.Value);
}
public static IEnumerable<XNode> GetDescendantTextNodes(XContainer xml)
{
return xml.DescendantNodes().Where(node => node.NodeType == System.Xml.XmlNodeType.Text);
}
public static string Scramble(string s)
{
var a = s.Select(ch => (char)(ch + 3)).ToArray();
return new string(a);
}
public static string UnScramble(string s)
{
var a = s.Select(ch => (char)(ch - 3)).ToArray();
return new string(a);
}
}
class Program
{
static void Main(string[] args)
{
var doc = XDocument.Parse("<a><b>this</b><b><c>is</c><c><d>a test</d></c></b></a>");
Scrambler.ScrambleTextNodes(doc);
Console.WriteLine(doc.ToString());
Scrambler.UnScrambleTextNodes(doc);
Console.WriteLine(doc.ToString());
Console.ReadLine();
}
}
}
输出:
<a>
<b>wklv</b>
<b>
<c>lv</c>
<c>
<d>d whvw</d>
</c>
</b>
</a>
<a>
<b>this</b>
<b>
<c>is</c>
<c>
<d>a test</d>
</c>
</b>
</a>
您可以随时使用其他一些加扰算法。加扰本身是对Kai的Python答案的C#的翻译。
编辑:清理:) edit2:删除了检查以不加扰空格。这会导致解密有时不正确......
答案 4 :(得分:0)
您可以实施自己的ROT13代码。
答案 5 :(得分:0)
您可以在每个节点的内容上使用Caesar cipher。
答案 6 :(得分:0)
要识别文本元素,请将未加扰的XML数据加载到XmlDocument中。然后递归地向下走下ChildNodes集合,检查每个节点的XmlNode.NodeType。如果它是XmlNodeType.Text,那么它就是一段文字。
如果您还想加扰属性值,那么也要注意XmlNodeType.Attribute。