代码之家  ›  专栏  ›  技术社区  ›  monibius

XML中的文本元素置乱

  •  1
  • monibius  · 技术社区  · 16 年前

    如何能够获取XML文档并在.Net中扰乱所有文本元素,使其不可读?

    例如制造

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

    进入

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

    要点:

    • 我们只需要争先恐后,不必担心 加密,即非人类可读 一瞥。这不要紧,如果 用户可以在30秒内对其进行反编码 努力。
    • 我们需要在稍后对XML进行解扰,所以请演示如何进行解扰。
    • 它需要简单,例如没有预共享密钥、证书等。
    • 只有文本元素应该被置乱,而不是节点、属性等。
    7 回复  |  直到 16 年前
        1
  •  1
  •   Ward Werbrouck    16 年前
    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>
    

    编辑:清理:) edit2:删除了不扰码空格的复选框。这有时会导致解读不正确。。。

        2
  •  2
  •   Kai    16 年前

    我能想到的最简单的双向加密方法是只取每个字符的ASCII值,并向其中添加一个常量,比如3,然后通过从每个字符中减去3将其转换回来。

    原件:

    Hello this is scrambled.
    

    爬:

    Khoor#wklv#lv#vfudpeohg1
    

    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])
    
        3
  •  1
  •   user153498 user153498    16 年前

    出于好奇,你为什么要把它弄得乱七八糟,却不费吹灰之力就能让人读懂呢?

        4
  •  1
  •   Eric Petroelje    16 年前

    Convert.ToBase64String Convert.FromBase64String

        5
  •  0
  •   Baget    16 年前

    ROT13 代码。

        6
  •  0
  •   Mark Bell    16 年前

    你可以用一个 Caesar cipher

        7
  •  0
  •   itowlson    16 年前

    要标识文本元素,请将未解读的XML数据加载到XmlDocument中。然后递归地遍历ChildNodes集合,检查每个节点的XmlNode.NodeType。如果它是XmlNodeType.Text,那么它就是一段文本。

    如果您还想对属性值进行置乱,那么还要注意XmlNodeType.attribute。