XOR на потоках, чтение и запись - PullRequest
0 голосов
/ 06 января 2010

Мое недавнее включение использует BinaryFormatter вместо какого-либо продукта базы данных. У меня есть идея записать простое 64-битное число в аппаратный ключ и зашифровать мои файлы с помощью простой операции XOR. Просто так, что он не может быть читаем на другом конце. Происходит ли из Stream или как?

Я знаю, что могу просто вставить это число в файл и проверить его на чтение, но ... я буду чувствовать себя лучше, если он будет полностью XORed.

Ответы [ 2 ]

2 голосов
/ 06 января 2010

Обратите внимание, что XOR будет невероятно легко сломать, если другой конец знает что-либо об исходных данных. Если он знает правильные 8 байтов в любой позиции, ваше «шифрование» немедленно нарушается. Вы действительно действительно уверены, что хотите это сделать? Создание собственной схемы шифрования - это почти всегда плохая идея - есть ли причина, по которой вы не хотите использовать один из многих алгоритмов шифрования, встроенных в платформу? Конечно, используйте аппаратный ключ для получения ключа - но затем используйте обычный CryptoStream.

Однако, если вы действительно хотите это сделать, есть два очевидных варианта:

  • Построить потоковую оболочку, да. Если бы вам не нужно было поддерживать асинхронные операции, я бы этого не сделал - это усложнит ситуацию. Записать реализацию потока, которая передает другой поток для прокси, а также значение long для XOR, а затем всякий раз, когда вы читаете или записываете данные, применяете XOR.

  • Построить реализацию ICryptoTransform. Тогда вы потенциально можете заставить CryptoStream выполнить всю тяжелую работу с точки зрения потоковой работы - вам просто нужно знать, как преобразовывать блок за раз. Я считаю, что должно быть довольно простым, но я не могу сказать, что когда-либо делал это сам.

1 голос
/ 06 января 2010

Я не собираюсь комментировать шифрование XOR, это слишком глупо. Давайте сосредоточимся на практическом руководстве для реализации вашего собственного потока. Вы должны извлечь его из Stream, чтобы он имел знакомый интерфейс для пользователя. Щелкните правой кнопкой мыши «Поток», реализуйте абстрактный класс. Вы можете оставить большинство бросков NotImplementedException на месте, так как потоки обычно калечатся. Добавьте приватного члена FileStream, он сделает тяжелую работу. Затем добавьте:

  • Конструктор, который принимает строковый аргумент, путь к файлу. Создайте FileStream с ним.
  • Реализуйте CanWrite, верните true.
  • Реализуйте метод Write (). Делайте все, что вам нужно сделать с байтом [], который передал клиент. Обычно вам нужен собственный буфер byte [], вызывайте Flush (), если он становится слишком большим. Или FileStream.Write () напрямую, если вам не нужен буфер.
  • Реализуйте метод Flush. Вызовите FileStream.Write () для вашего буфера, затем его Flush ().
  • Реализация Close и Dispose (), вызов соответствующего метода FileStream.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...