在XML中加扰文本元素

时间:2009-10-08 20:52:01

标签: c# .net xml vb.net

如何获取XML文档并在.Net中加扰所有文本元素以使其对人类不可读?

E.g。使

<root><Node1>My Name is Ben</Node1></root>

<root><Node1>klj sdlasd asdjfl</Node1></root>

点数:

  • 我们只需要争抢 加密,即不是人类可读的 乍看上去。无论如何 用户可以用30秒对其进行解码 努力。
  • 我们不知道XML的架构,因此所有文本元素都必须位于代码中。
  • 我们需要稍后对XML进行解扰 - 所以请说明一下如何做到这一点。
  • 它需要简单,例如没有预共享密钥,证书等
  • 只应对文本元素进行加扰 - 而不是节点,属性等。

7 个答案:

答案 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.ToBase64StringConvert.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。