вопрос по ГОСТ 28147-89

Тема в разделе "WASM.CRYPTO", создана пользователем metcenger, 18 сен 2008.

  1. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    прочитал статью про этот алгоритм на данном сайте от Evil's interrupt- спасибо ему за столь понятное изложение вопроса.

    Но, это только часть картины- метод простой замены. Там же есть ещё цикл выработки имитовставки и ещё что -то. Про них бы доходчиво на таком же уровне кто объяснил.

    На сколько понял из книг, при блочном шифре один и тот же блок открытого текста будет соответсвовать всегда одному и тому же блоку шифротекста.

    И тут вопрос- нельзя ли проследить тут взаимосвязь между ними? т.е. если мы просто будем заменять одни данные на другие, но при этом будет их соответствие? Просто ассоциируется с заменой букв на другие буквы в детском шифре.

    И тут уже можно выйти на истину. Или я где- то ошибаюсь?
     
  2. chAlx

    chAlx New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    74
    Насколько я помню, по ГОСТу блоки шифруются с "нахлёстом" в полблока на соседний блок. Т.е. они в зашифрованной последовательности не независимые.
     
  3. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    немного ошибся, там ключ 32*8 =256 бит. Имею ввиду, что если я этим ключом зашифрую блок данных 64 бита, то получу некую последовательность 64 бита шифротекста. Так вот, при зашифровании этим ключом одних и тех же данных 64 бита, я всегда буду получать один и тот же шифротекст.
    Вроде как используется гаммирование с обратной связью, чтобы исключить такое. Где бы так же подробненько прочитать про это?
     
  4. chAlx

    chAlx New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    74
    Смею предположить, что при шифровании одних и тех же данных любой длины любым одинаковым ключом по любому алгоритму шифрования ты будешь всегда получать одинаковый результат ;)

    Но при шифровании по ГОСТу двух последовательностей 64 бит и 64+X бит (те же плюс довесок) результаты не будут содержать одинаковый блок, отвечающий за первые биты.
     
  5. Marilyn

    Marilyn New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2008
    Сообщения:
    1
    Результаты не будут содержать одинаковых блоков. это особенность блочных шифров на сетях Фейстеля. Вообще, в этой статье написано очень мало. Лучше сразу читать статью Винокура.
     
  6. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    Да, я уже разобрался с тем, что при блочном шифровании при методе простой замены в частности, получаю одинаковые блоки на выходе при одинаковых на входе.

    Статья Винокура тяжела в понимании, хоть тут и мало написано, зато доходчиво.

    Получается, надо использовать гаммирование. Т.е. брать некий генератор ПСП, потом его шифровать по как раз этому алгоритму простой замены, затем уже полученный код накладывать на текст- так избежим данной проблемы.

    Но, как делать этот генератор ПСП? нигде не сказано толком, одни формулы...
     
  7. olegras

    olegras New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    9
    Если вы действительно хотите использовать ГОСТ-28147 - ни в коем случае нельзя "брать некий генератор ПСП". Способ формирования гаммы в стандарте указан конкретно. Иной способ формирования ПСП может (а скорее всего так и будет) резко снизить стойкость криптосистемы. В стандарте используются две 32-х разрядные константы: С1=0х01010101 и С2=0х01010104. Именно эти константы и обеспечивают период повторяемости гаммы, равной (почти) 2^64.
    Если вы разобрались с основным шагом Ц32-з, режим гаммирования понять несложно.
    1. Берем (формируем) 64-разрядное случайное число S.
    2. Шифруем S методом простой замены. S=Ц32-з(S)
    3. Разбиваем S на две 32-х разрядные части: S0 (младшая часть) и S1 (старшая).
    4. Каждую часть вычисляем отдельно, используя вышеуказанные константы:
    S0=S0+C1 (mod 2^32)
    S1=S1+C2-1 (mod (2^32)-1) + 1
    5. Склеиваем S0 и S1 обратно в S.
    6. Шифруем S методом простой замены S=Ц32-з(S).
    7. Читаем 64 бит входных данных и делаем поразрядный xor с нашим S.
    Повторяем шаги 3 - 7, пока не закончатся входные данные. Последний блок входных данных может быть меньше чем 64 бит. В этом случае поразрядный xor производится только с необходимыми разрядами S.
     
  8. chAlx

    chAlx New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    74
    olegras
    А не циклический ADD?
     
  9. mart

    mart New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    67
    Нет, именно поразрядный xor. Если топикстартер поконкретнее сформулирует свои вопросы, постараюсь ответить. Аналог режима гаммирования - режим счётчика(CTR или counter), можно использовать его. Простая замена называется по-английски ECB, также есть и другие режимы: OFB,CBC и многие другие. В гугле можно найти все необходимое или почитать Шнайера: "Практическая криптография", там все просто написано. Статья Винокурова написано на мой взляд достаточно понятно, надо просто уделить её прочтению некоторое время.
     
  10. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    спасибо, ребята, за подробное изложение. Так уже понятней. Шнайдера читал, надо перечитать этот раздел ещё раз. Винокура тоже попробую осилить. Но сначала, с вашей помощью, вникну здесь в алгоритм. Програмку по 32-3 и 32-Р я написал- замечательно шифрует по алгоритму туда и обратно, изменение одного бита на входе приводит к изменению всех бит на выходе.
    Итак, пока сходу вопросы по пунктам, или как я правильноих понял

    2. Зачем шифровать и без того случайное число?
    4. Данные константы С1 С0- именно такие, или могу произвольные использовать?
    после того, как я первый раз дошел до пункта 7, возвращаюсь к п.3, какую S во втором цикле разбиваю? От куда её беру?
     
  11. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    перечитал Шнайдера, раздел про режимы работы блочного шифра. Стало проясняться. Похоже, ГОСТ реализует СВС режим, по крайней мере, очень на него похожий.

    Про Винокура- похоже у него как минимум две статьи- одна старая, года 1995 -го, из журнала монитор, другая- свежая, 2003, редакция 2005, так вот, как раз в этой статье уже все более менее понятно. Пока читаю её, вопросы появятся- отпишусь
     
  12. olegras

    olegras New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    9
    Почитай, если актуальность вопросов останется - пиши.
     
  13. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    вопросы пока есть
    1. переменные эти две- константы именно такие. вроде так.
    2. вот это S, про которое говорится в начале Ваших пунктов- это ещё один секретный ключ для режима Гаммирование?
    3. S0=S0+C1 (mod 2^32)
    S1=S1+C2-1 (mod (2^32)-1) + 1
    эти два режима- програмно реализуются как Вы и написали? (до скобок, где S0=... S1=...)

    5. Склеиваем S0 и S1 обратно в S.
    склеиваем так же как и разбили? т.е. 64 бита разломали пополам?

    Пока все вопросы.
     
  14. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    olegras
    главный вопрос- все делаю, дохожу до пункта 7, до этого все проделал с S. XoR делаю с блоком данных 64 бита, теперь повторяю тоже самое с пункта 3, уже с новым блоком данных 64 бита...

    а резон в чем? Соль то вся где? О какой псевдо случ. послед. речь идет? Проделав пункты 3-7, я каждый раз буду получать одно и то же значение.

    или во втором цикле в роле S будут выступать мои данные с поксоренным предыдущим S
    ????????????????????????????
    тогда уже есть смысл.
     
  15. olegras

    olegras New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    9
    Первое и самое главное (на данный момент) что ты должен понять: первоначальная S, формируемая на шаге 1 - открытый параметр. Еще он называется синхропосылкой. И не зря. Соль в том, что для того чтобы Алиса и Боб (ты ведь уже прочитал Шнайера?) могли вести обмен зашифрованной информацией, они оба должны вырабатывать одну и ту же гамму синхронно относительно шифруемых блоков. Для этого у них обоих должны совпадать первоначальные S. Но как им обоим узнать об одном числе, если они находятся на разных концах канала связи? Господа из 8-го управления КГБ СССР - разработчики ГОСТа позаботились об этом. Они сказали "А пусть начальное заполнение ПСП (S) будет открытым числом. Тогда, Алиса могла бы перед началом сеанса преспокойно отправить Бобу это число, после чего они могли бы синхронно вырабатывать ПСП". Именно поэтому сформированное случайное число и шифруется, и именно зашифрованное S и является собственно первоначальным заполнением генератора. То есть на самом деле между шагами 1 и 2 как бы есть шаг 1.5: "Отправляем S получателю".
    После зашифрования - S и все его будущие производные являются секретным параметром.

    После шага 7 возвращаемся к шагу 3 именно с текущим значением нашего S. Я ведь написал
    . То есть каждый раз на шагах 3 - 6 производим операции над одной и той же переменной, и тогда ее значение никогда (за реальное время) не повторится. Я посчитал, если шифровать непрерывный 2-х Мегабитный поток Е1, гамма повторится через 18 млн лет.

    Склеиваем S1 и S0 ровно как и разбивали: S = S1 || S0, где || - обычная конкатенация.

    Именно так и реализуются. Или я не понял вопроса.
     
  16. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    olegras
    еще раз спасибо за разъяснения. Кое что я , конечно, и сам уже понял. Не знал только, что синхропосылку можно открыто отдавать.
    Значит, по шагам 3-6, значение переменной S на шаге 6 подаю на шаг 3.
    Для Е1- убедительно. А если ошибка проскочит в канале связи? На приемной стороне потеряется бит? Как восстанавливать тогда?

    Личный вопрос, если не секрет- что разрабатывали? И почему выбор на ГОСТ пал?
    В других алгоритмах шифрации, надо полагать, гамму можно эту же использовать или там своя?
     
  17. olegras

    olegras New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    9
    Во-первых, сам обмен синхропосылками - довольно серъезный вопрос. Для этого применяются специально разработанные протоколы синхронизации криптосистем. Бит может случайно или преднамеренно потеряться (измениться) не только при обмене зашифрованной информации, но и на стадии обмена синхропосылками...
    Во-вторых, в реальных системах обмен синхропосылками происходит периодически раз в заданное время, или после передачи определенного количества блоков данных.
    Наконец, необходимо установить какой-нибудь критерий по которому приемник-дешифратор определит, что принятые данные расшифровались неправильно. Ведь потеряться может не просто бит, а целые блоки данных. Такое состояние системы называется рассинхонизация криптомодулей и требует немедленной очередной пересинхронизации с формированием нового числа S и т.д.
    ...Все это я к тому, что при разработке криптосистемы, далеко не достаточно реализовать только лишь алгоритм шифрования. Есть много моментов, которые нужно тщательно продумать...

    Разрабатывал примерно то самое, о чем и идет речь. Иногда вынужденно сталкивался с ГОСТ (название "Государственный стандарт" говорит за себя).

    Эту гамму можно использовать в любых алгоритмах, в которых способ формирования гаммы строго не определен. Вообще, постарайся запомнить: с криптографией шутки плохи. Если выбрал (заказали) алгоритм - делай его строго по описанию. Тем более, если он имеет статус стандарта. Иначе это будет уже другой алгоритм, за любые последствия будешь отвечать сам и по полной программе.

    P.S. Не забывай, что и в ГОСТе это не единственный способ формирования ПСП. Существует еще один способ, применяемый в режиме гаммирования с обратной связью, в котором используются не константы, а результат наложения гаммы на входной блок предыдущего этапа. По стойкости два режима гаммирования считаются одинаковыми, поэтому разработчику (заказчику) предоставляется выбор.
     
  18. metcenger

    metcenger New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2008
    Сообщения:
    87
    olegras
    спасибо большое за консультации, теперь все стало ясно.
     
  19. kapger

    kapger New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2009
    Сообщения:
    135
    Доброго времени суток, уважаемые!

    Подскажите, где можно найти тексты программ (в части указанного ГОСТ) полностью на Си, без ассемблерных вставок? На сайте Винокурова этого нет (или я плохо искал?), письма автору не доходят (отправлялось на *@chat.ru и на *@micex.com).
     
  20. alexanderwm

    alexanderwm New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2008
    Сообщения:
    43