Скремблирование текстовых элементов в XML - PullRequest
1 голос
/ 09 октября 2009

Как можно взять документ XML и в .Net зашифровать все текстовые элементы, чтобы сделать их нечитаемыми для человека?

например. Сделайте

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

В

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

Очки:

  • Нам нужно только не карабкаться шифрование, т.е. не читаемое человеком с одного взгляда. Неважно, если пользователь может расшифровать его за 30 секунд усилие.
  • Мы не знаем схему XML, поэтому все текстовые элементы должны быть расположены в коде.
  • Нам нужно расшифровать XML позже - поэтому, пожалуйста, покажите, как это сделать тоже.
  • Это должно быть просто, например без предварительного обмена ключами, сертификатами и т. д.
  • Следует шифровать только текстовые элементы, а не узлы, атрибуты и т. Д.

Ответы [ 7 ]

2 голосов
/ 09 октября 2009

Самое простое двустороннее шифрование, которое я могу придумать, - это просто взять значение 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 голос
/ 09 октября 2009
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();
        }

    }
}
* +1001 * Выход:
<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>

Вы всегда можете использовать другой алгоритм скремблирования. Сам по себе скремблирование - перевод на C # ответа Кая на Python.

редактировать: уборка :) edit2: убрал флажок, чтобы не скремблировать пробелы. Это может привести к неправильной расшифровке в разы ...

1 голос
/ 09 октября 2009

Просто используйте Convert.ToBase64String и Convert.FromBase64String

Имеет дополнительное преимущество: вам не нужно беспокоиться о экранировании символов, хотя это немного увеличивает длину строк.

1 голос
/ 09 октября 2009

Было бы проще просто использовать встроенные классы шифрования в .NET Framework, если вы пытаетесь его запутать, чем создавать класс шифрования. Если вас не интересует безопасность, просто напишите пароль и вектор инициализации.

Из любопытства, зачем ты его зашифруешь, только чтобы он был читаемым человеком без особых усилий?

0 голосов
/ 09 октября 2009

Чтобы идентифицировать текстовые элементы, загрузите расшифрованные XML-данные в XmlDocument. Затем рекурсивно пройдитесь по коллекции ChildNodes, проверяя XmlNode.NodeType каждого узла. Если это XmlNodeType.Text, то это фрагмент текста.

Если вы также хотите зашифровать значения атрибутов, обратите внимание и на XmlNodeType.Attribute.

0 голосов
/ 09 октября 2009

Вы можете просто использовать Цезарь для содержимого каждого узла.

0 голосов
/ 09 октября 2009

вы можете реализовать свой собственный код ROT13 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...