» Шифровка заменой. Улучшаем алгоритм Новости. . . Блог программистов


Блог программистов






20113 Авг

Шифровка заменой. Улучшаем алгоритм

Здравствуй читатель! В моих первых двух статьях про шифрование (ссылка1, ссылка2) методом замены, было рассказано, как получить максимальную защиту информации и минимальную избыточность (точнее сказать регулируемую избыточность). Тем не менее, алгоритм обладает одним серьёзным недостатком: книгу кодов очень легко восстановить, зная примерный характер исходных данных. А если знать точное содержимое исходных данных и если размер исходных данных достаточно большой, то книга кодов моментально восстанавливается. В этой статье я попробую решить эту проблему. Всевозможных критиков, специалистов, флудеров и троллей сразу предупреждаю, что алгоритм не претендует на звание самого лучшего, возможно, когда-то он станет лучше.

   Итак, нам надо сначала вкратце разобраться, как работает алгоритм, в чём состоят его преимущества и на что надо делать упор при улучшении алгоритма. Итак, начнём.
   Во-первых, самая сильная сторона алгоритма это высокая скорость расшифровки, шифровка медленнее, чем расшифровка, но это легко оптимизируется и решается (например, через инвертирование кодовых страниц в книге кодов, но это уже совсем другая история). В связи с этим алгоритм идеален для создания высокоскоростных защищённых каналов связи.
   Во-вторых, ключ – это книга кодов, содержащая в себе 265 кодовых страниц, каждая размером 256 байт, в сумме 64 КБ. Книга кодов держится в секрете, обеими сторонами. Книга кодов может передаваться сторонами с использованием какого-либо асимметричного алгоритма шифрования, например, тем же RSA.
   В-третьих, при шифровке используется массив CPSeq, который задаёт последовательность использования кодовых страниц при шифровке/расшифровке. Данные CPSeq по сути своей представляют собой случайный массив чисел от 0-255. Данные CPSeq генерируются при шифровании и передаются вместе с файлом, чтобы другая сторона могла расшифровать файл. Данные CPSeq как раз таки и составляют так называемую «избыточность». Чем больше размер CPSeq тем больше защищённость, но при этом больше избыточность. При шифровке/дешифровке потока данных, данные CPSeq будут статическими, но будут обновляться после передачи определённого количества информации.
   Итак, мы разобрались с тремя основными тезисами алгоритма. Теперь разберёмся с основной проблемой. Если знать содержимое исходных данных, то вне зависимости от размера данных CPSeq, книга будет восстановлена в два счёта.
   Решением проблемы будет являться предварительное шифрование исходных данных, при этом не важно какая будет его криптостойкость. Цель этого шифрования повысить энтропию исходных данных и превратить их в ерунду.
   Шифровать можно обычной операцией XOR с некоторыми многобайтовым ключом, с размерностью равной массиву CPSeq. Назовём этот новый ключ PCKey (Pre Crypt Key). PCKey это просто массив байт, который будет вычисляться перед шифровкой/расшифровкой. Данные будут шифроваться следующим образом:
   Data[ i ] = Data[ i ] xor PCKey[j]
Где j – остаток от деления i на размер массива PCKey
   Очевидно, что массив данных PCKey должен обладать высокой энтропией, чтобы гарантировано повысить энтропию исходных данных.
Как будет вычисляться массив PCKey? Очевидно, что функция, вычисляющая PCKey должна принимать на входе массив CPSeq чтобы гарантировать случайность PCKey, так как данные CPSeq постоянно меняются. Но так как CPSeq передаются в открытом виде, то надо использовать ещё что-то, о чём не знает перехватчик данных, ибо толку от PCKey никакого. Разумеется, при формировании PCKey надо использовать книгу кодов. Итак, мы уже представляем себе функцию для генерации массива PCKey:

VOID GetPCKey(
      PVOID CodeBook, 	
      PVOID CPSeq, 
      int CPSeqSize, 
      PVOID PCKey);	


   Следующий вопрос: как формировать массив PCKey? В контексте данной статьи способ формирования PCKey не имеет большого значения. Более важно обговорить требования к этой функции. Требования к ней почти такие же, как и к любой хеш-функции:

  • Необратимость операции
  • Невозможность по PCKey восстановить книгу кодов
  • При изменении входных данных, выходные данные должны меняться таким образом чтобы невозможно было понять что именно изменилось в входных данных
  •    Отличие функции GetPCKey от хеш-функции состоит только лишь в том, что она принимает два буфера (один буфер фиксированного размера, второй переменного), и выдать она должна данные не фиксированного размера, а размера равного размеру второго буфера.
       Теперь возникает резонный вопрос: после шифровки буфера с помощью PCKey, зачем дополнительно шифровать заменой получившиеся данные? Всё очень просто, если зашифровать буфер только с помощью PCKey, то если известно содержимое некоторой части исходных данных, шифровка по-прежнему уязвима, так как можно будет восстановить массив PCKey и расшифровать оставшуюся часть данных. Если после шифровки с помощью PCKey, произвести шифровку с помощью замены, то даже если полностью знать содержимое исходных данных, то всё равно будет невозможно восстановить ни PCKey, ни книгу кодов, так как промежуточное содержимое данных неизвестно. Массив PCKey нельзя будет восстановить, потому что данные будут зашифрованы с помощью книги кодов. Книгу кодов нельзя будет восстановить, потому что с помощью неё будут зашифрованы не исходные данные, а данные «пропущенные» через PCKey, которые неизвестны криптоаналитику, потому что он не знает PCKey.
       Для повышения криптостойкости можно генерировать несколько ключей PCKey, и производить предварительную шифровку несколько раз. Аналогично несколько раз можно производить шифровку заменой с помощью книги кодов. При этом скорость шифровки/расшифровки почти не пострадает.
       Вот собственно и всё что я хотел сказать.
    Скачать библиотеку rclib build 600 beta, исходник и описание
    Скачать программу-пример использующую библиотеку rclib

    Обсуждение алгоритма и библиотеки на форуме (так же описание алгоритма получения PCKey)

    Комментарии

    1. 19 августа, 2011 | 11:03

      И все же без исходника тяжело разобраться. Пример реализации будет?

    2. rpy3uH
      22 августа, 2011 | 13:19

      Файлы здесь :
      http://programmersforum.ru/showthread.php?p=864539
      (библиотека rclib и программа-пример)

    3. 22 августа, 2011 | 13:22

      Спасибо, попробую разобраться

    4. 27 октября, 2011 | 11:00

      Интересно — будем пробовать

    5. petrj
      22 марта, 2012 | 16:20

      как отправить личное сообщение автору?

    6. petrj
      22 марта, 2012 | 16:23

      рабочего характера ))))

    7. rpy3uH
      20 апреля, 2012 | 14:47

      пишите на мыло: gruzino.abhaz [-DOG-] gmail.com

    8. 3 октября, 2012 | 17:51

      Полезна статья

    9. 3 октября, 2012 | 17:52

      Полезная статья

    10. 19 ноября, 2012 | 15:07

      Любопытные факты в статье, надо будет поэкспериментировать

    11. 3 мая, 2013 | 22:52

      Очевидно, что массив данных PCKey должен обладать высокой энтропией, чтобы гарантировано повысить энтропию исходных данных.

    12. Ser
      15 июля, 2013 | 16:02

      Радует, что есть специалисты в этой области не только за бугром ) Правда, разработками автора я не пользовался, не хватает знаний, шифрую скайп, файло и почту уже готовой программой для шифрования cybersafe, но почитать интересно для общего развития.

    13. vasiatka
      19 февраля, 2014 | 20:55

      Бред

    14. ITkhazeplov
      17 мая, 2015 | 11:11

      Что с сайтом, у меня отображаются иероглифы вместо русских букв!?
      http://www.programmersclub.ru/main/