Нужны тестовые векторы ГОСТ 28147-89

люди, пишу реализуцию, нужны векторы на правильность простой замены и имитовставки.



Комментарии
— unknown (15/07/2008 17:50)   
А у кого вы брали S-блоки, они ведь в стандарте не опубликованы, а откуда тогда тестовые векторы официально взять?
— Имя (16/07/2008 13:24)   
нет, мне необходимо проверить правильность реализации, официальные тестовые векторы не нужны.

таблицу замен можно использовать ту, что использует Центробанк РФ (ее описывает шнайер в Прикл. Крипт.).

можно просто зашифровать два 64-битовых блока по ГОСТ с имитовставкой по сертифицированной программе (ну можно и без сертификации) и выложить сюда.

естессно, приложите и откытый текст с ключом – а то какой-нибудь умник закинет только шифртекст :)
— SATtva (16/07/2008 13:32, исправлен 16/07/2008 13:33)   
Вы уверены, что в "любой сертифицированной реализации" будут именно цэбэшные векторы из книги Шнайера?
— unknown (16/07/2008 15:01)   








Случайный мусор вначале – это скорее всего IV – он всегда разный даже для одного ключа, равен размеру блока шифра (64 бит) и приписывается к началу шифртекста даже в режиме ECB.
А в конце – неполный блок, он всегда одинаковый для одного и тогоже ключа.

Программа несертифициорована.

ECB – это простая замена, а имитовставка – это я так понимаю CBC?



и ещё раз тот же ключ с другим IV:

— unknown (16/07/2008 15:14, исправлен 16/07/2008 15:19)   
Кстати размер ключа у ГОСТ вообще-то 256-бит, а программа в режиме задания ключа hex съедает сколько угодно шестнадцатиричных знаков, но после 32 байт их не различает так что ключи скорее всего дполняются до:

0x00..01..00 и 0x00..02..00 (256 бит)
— Имя (16/07/2008 15:39)   
имитовставка-это последовательность из L бит, где L – от 1 до 32.

в основном нужна была она, но все равно спасибо. сейчас буду разбираться что к чему.
— Имя (16/07/2008 15:45)   
кстати, какая таблица замен? Без нее проблематично все сделать. или мне подбирать 512 бит? ))
не имеет значения какая ТЗ – главное, чтобы была указаны узлы замен.
— unknown (16/07/2008 16:11)   
Посмотрите в исходниках[link1]. Скорее всего S-блоки (таблицы замен) из Большой Красной Книги Шнайера.
Гость (08/05/2010 18:47)   
В контексте комментариев /comment24232[link2] и /comment24370[link3] хотел бы задать вопрос про mcrypt vs openssl для симметричного шифрования. Вроде бы эти тулзы имеют пересекающийся функционал, и всё, что можно сделать mcrypt'ом, можно сделать и openssl'ем. В чём тогда преимущества/недостатки/ниша этих продуктов?

По поводу mcrypt: его опция -a rijndael-256 делает не то же самое, что и конвенциональный AES256. В 1ом варианте размер блока составляет 256, а во втором – 128 (причём это стандарт). Схема паддинга не полне соответствует PKCS-5. Размер ключа у обоих 256, как и должно быть. IV в mcrypt не выводят из пароля согласно PBKDF2, а генерят случайно и хранят в файле.

PS: openssl тоже может генерить шифрованные файлы без заголовка (наподобие mcrypt -b), что-то типа openssl enc -aes256 -nosalt.
Гость (15/05/2010 01:18)   
unknown, в вышеприведённом комментарии негласно подразумевалось, что Вы скажете что-нибудь по этому поводу :)
— unknown (16/05/2010 16:46)   
IV в mcrypt не выводят из пароля согласно PBKDF2, а генерят случайно и хранят в файле.


-salt use a salt in the key derivation routines. This option should ALWAYS be used unless compatibility with previous versions of OpenSSL or SSLeay is required. This option is only present on OpenSSL versions 0.9.5 or above.
-nosalt don’t use a salt in the key derivation routines. This is the default for compatibility with previous versions of OpenSSL and SSLeay.


Тогда при использовании nosalt обязательно нужно использовать:
-iv IV the actual IV to use: this must be represented as a string comprised only of hex digits. When only the key is specified using the -K option, the IV must explicitly be defined. When a password is being specified using one of the other options, the IV is generated from this password.


Иначе разные открытые тексты, зашифрованные тем же паролем будут иметь одинаковые векторы инициализации (если вообще будут иметь что-то отличное от нулевой строки).

В mcrypt опция bare по крайней мере что-то гарантирует хотя бы со слов документации. И всё равно, нужно разбираться, прежде чем например это куда-то встраивать, а в openssl такое использование штатно не предусмотрено.

openssl — это в первую очередь утилита-надстройка над соответствующей библиотекой реализации протокола ssl соответственно.
Гость (17/05/2010 02:05)   
В самом деле, у openssl с -nosalt IV генерится как однозначная ф-я ключа, но там не 0, но что-то типа PBKDF. Я, правда, не понимаю чем это страшно. У mcrypt IV генерится случайно и хранится в пакете. Понятно, что
  1. при IV=0 CBC становится ECB и это плохо,
  2. если у шифртекстов равны IV и пароли, и они имеют общие куски, то эти куски можно установить.
Можно ли еще что-то извлечь из этого?
Гость (17/05/2010 02:16)   
Вообще, если не нравится, можно использовать openssl с солью и отпиливать magic (первые 8 байт), а перед использованием запиливать обратно. Другое дело, что почему-то ни mcrypt, ни openssl не использует честную PBKDF2.
— unknown (17/05/2010 09:24)   
Проектируемая схема всегда должна быть по-возможности идеальной. Использование даже не то что постоянного и неповторяемого, а хотя бы предсказуемого IV (например по счётчику) делает схему формально уязвимой к атакам с подобранным и адаптивно-подобранным шифртекстом.
Гость (28/05/2010 23:51)   
Вообще, если не нравится, можно использовать openssl с солью и отпиливать magic (первые 8 байт), а перед использованием запиливать обратно
Вот рабочий пример:

In Summery the "openssl" command is deficient:
  • You can't create a encrypted file that included an ic
  • You can't even specify the ic for the encryption (it just 1)
  • You can't pass Key and IV other than as command line arguments! (making them visible in process listings!)
  • You can't even use the "openssl" command to just do the basic conversions of pass-phrase + salt + count --TO-> key + IV perhaps with options for base64 or base16 (hexadecimal) output. For either PBKDF 1.5 using EVP_BytesToKey() or for PBKDF 2 using PKCS5_PBKDF2_HMAC_SHA1()
At the end of the day, OpenSSL is a library, not an end-user product, and enc(1) and friends are developer utilities and "demo" tools. When you need a product, you build something useful with the library. Yes, enc(1) should be better, but it is likely not a priority relative to improving the library.
© вот так оправдываются разработчики OpenSSL (из рассылки): вопрос[link4], ответ[link5]. P.S.: Cамо pbkdf2 есть в OpenSSL, но на cli-тулзы они подзабили.
— unknown (29/05/2010 11:24)   
Да, разработку утилит они вообще хотели свернуть, оставив только либу.
— spinore (06/06/2010 04:03, исправлен 06/06/2010 04:05)   

Ещё один гвоздь в гроб OpenSSL или "wipe диска – так ли это просто?"


В контексте /comment39565[link6] для настройки полного шифрования терабайтного диска его надо было заполнить случайными данными. Казалось бы, всё просто, и неоднократные советы с форума типа "юз dd и urandom" окончательно решают проблему. Что же на самом деле? Начнём с более быстрого метода – OpenSSL:



Угарно, да? Кто не верит – попробуйте ;) После ряда тестов выясняется – дело в величине числа после rand, на которое есть фундаментальное ограничение в 231-1=2Гб. У вас диск больше 2Гб? Значит, не повезло.


shred в pkgsrc отсутствует, в базовой системе – также. Вариант отпадает.


Проблему можно решить 3мя вариантами:

  1. Писать арифметический цикл на bash для OpenSSL.
  2. Компилить прогу[link7].
  3. Самому писать на C код, использующий libc'шный random и мануально затирающий диск.

Был выбран 1ый вариант, как "самый простой" (в UNIX самый простой вариант – самый сложный, т.к., в конце концов, [типично] оказывается, что всё равно не работает, и потому надо было сразу браться за самый ручной и трудоёмкий способ). Итак, первый блин таков:



Он даже, кажется, работает, а по -SIGINFO, посылаемому dd, можно смотреть сколько записалось, только скорость... 2 недели для терабайтного диска – всё правильно? Проверяем скорость самого OpenSSL и скорость записи на диск:



USB-стэк? Хотя... если писать в файл на файловой системе – всё нормально:



Почему писать напрямую в device – намного медленее, чем на ФС? Синхронная запись? Или... здесь повлияло то, что объём был мал, и он влез в оперативную память? Оказалось, что дело совсем не в этом. Итак, было нарыто:



Магия?



Почему "block mode" такой ежовый? Итак, теперь в raw mode:



Без доброжелательности nice'а I/O будет тормозить ужасно. Оценочное время исполнения – 25 часов; не быстро, но уже приемлемо. И тут ВНЕЗАПНО:



Умный openssl закрыл канал, и dd тут же вывалилось. Цикл не работает, и вот простейший пример для демонстрации (почему-то Linux'овый dd умнее и там этой проблемы нет):



Можно попробовать и так:



или вот так:



– результат тот же. Раз уж такие сложности, не вспомнить ли про рекомендованный "более медленный /dev/urandom"?



nice почти не помогает. I/O вешается почти намертво, с компом работать невозможно, кое-как прерывается, особенно при bs=128m. Да-а, с такой скоростью долго прийдётся ждать вайпа. Не вариант. Может, хакнуть OpenSSL с его 231-1-ограничением?


Есть ещё одна идея: сделать тупой арифметический цикл с оффсетами а-ля сишный for: берем кусок в гигабайт размером, пишем в него, затем переходим к следующему... например:



и запускаем:



Полёт пока нормальный – уже 49 гигов завайплено:



Решение проблемы – 2 головы и 4 часа времени, т.е. 8 человекочасов. Страшно представить, что будет, когда до LVM дойду. Вот така убунта[link8].


Кстати, есть один быстрый алгоритм:

The Mersenne twister is a pseudorandom number generator developed in 1997 by Makoto Matsumoto and Takuji Nishimura[1] that is based on a matrix linear recurrence over a finite binary field F2. It provides for fast generation of very high-quality pseudorandom numbers, having been designed specifically to rectify many of the flaws found in older algorithms.

но его нет в системной libc, хотя имеются сторонние реализации. Способ с "15тью строчками на С", возможно, был бы быстрее.


P.S.: пора хорошим людям собраться и убить всех плохих людей написать вменяемый CLI-фронтенд к криптопримитивам, а-ля mcrypt, только поменьше костылей, помодерновее, с поддержкой хэшей, PRNG, HMAC-ов (я не знаю, что еще понадобиться может), и это должны быть именно примитивы. Или, может быть, просто перл надо знать и писать на нём свои простейшие обертки вокруг OpenSSL'ных примитивов? У перла они, наверное, самые короткие будут, да и биндинги к нему уже есть.


P.P.S: нет, не себе Ubuntu ставлю – просто попросили поставить user-friendly-Linux и настроить его для того, кто в Linux никакой, да так, чтоб всё свистело, да работало, как в сказке. Мой первый Linux... чтоб его...

— unknown (06/06/2010 20:58, исправлен 06/06/2010 21:02)   

Это некриптостойкий генератор, хотя идеально проходящий все статистические тесты.
С таким же успехом можно использовать badblocks -t random.
С другой стороны, можно сначала поднять криптораздел и перед форматированием (mkfs) через dd заполнить его не медленным dd if=/urandom, а даже /dev/zero, но натравливать именно на поднятый криптораздел, чтобы нули шифровались. Конечно, противник сможет иметь больше оснований для предположении о наличии в открытом тексте раздела избыточного количества нулей, но это несущественный теоретический аспект.


Spinore, спасибо за тшательно разобранный и записанный пример, часто людям бывает лень делать подробный отчёт как для багрепорта.

— spinore (06/06/2010 23:03)   
Всегда пожалуйста :)

The Mersenne twister
Это некриптостойкий генератор, хотя идеально проходящий все статистические тесты.

Так любой PRNG – некриптостойкий, а заполнить диск реальным рандомом – слишком длительная процедура, да и нужна ли? Криптостойкость — защита от предсказуемости, а не от "неслучайности". Т.е. не понятно
  1. Почему необходим "криптостойкий PRNG" (оксюморон?) для заполнения терабайта
  2. В принципе "криптостойкие PRNG" существуют для таких объёмов информации?

С таким же успехом можно использовать badblocks -t random.

Это интересная идея. Не додумал(ся,ись). Но он, может быть, менее случаен?

С другой стороны, можно сначала поднять криптораздел и перед форматированием (mkfs) через dd заполнить его не медленным dd if=/urandom, а даже /dev/zero, но натравливать именно на поднятый криптораздел, чтобы нули шифровались.

Тоже интересно. Проверил скорость (на объёмах порядка гигабайта) – 15Mb/s, т.е. в полтора раза быстрее было бы, чем используемый метод:


С другой стороны, если запускать с nice и долго ждать, то скорость записи потом постепенно снижается. Для моего метода она сейчас чуть больше 10 мегабайт; как было бы для нулей – не ясно, но, наверное, ничуть не хуже, да и технически это сделать куда проще.
— unknown (07/06/2010 10:21, исправлен 07/06/2010 10:29)   

Может сообщим Шнайеру и Ко, чтобы он удалил свой кандидат с конкурса SHA-3, у него же универсальный криптопримитив, в том числе со свойствами PRNG. Всем другим разработчикам PRNG тоже будет интересно знать, что PRNG бывают исключительно некриптостойкие.


В стойком PRNG на самом деле все принципы такие же, как в обычном криптоалгоритме. Он мало отличается от потокового шифра, стойкость которого задаётся ключом. Из ключа разворачивается гамма практически бесконечной длины (ну там с ограничением до 2256 байт).


Для потокового шифра достаточно, чтобы:


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

Или самый сильный критерий: невозможность нахождения различителя между потоковым шифром и идеализированным генератором истинно случайных чисел быстрее чем атаки грубой силой. С учётом не только простых статистических тестов, но и криптоаналитических атак на основе знания алгоритма. Ну и атаки со знанием ключа не должны показывать различие входа и выхода с идеальной моделью, куда же теперь без них. Атак на тексты нет (он тупо ксорится, как в одноразовом блокноте, поэтому анализируют только гамму).


Чтобы не было путаницы в терминологии можно привести и критерий отличия PRNG от потокового шифра:


В PRNG как такового ключа нет и не нужно (поскольку не нужно ничего расшифровывать обратно). Есть заполнение первоначального внутреннего состояния какими-то случайными данными. Это состояние регулярно необратимо перетирается. Данные о предыдущих использованных внутренних состояниях уничтожаются. Если даже произойдёт взлом, то восстановление последующей гаммы PRNG более вероятно, чем восстановление предыдущих состояний (более сильная непредсказуемость влево по сравнению с потоковым шифром). Это свойство PFS (Perfect Forward Security), а под взломом может иметься ввиду не только криптоаналитический взлом, но и то что противник получил доступ к памяти и узнал внутреннее состояние генератора. Тогда всю последующую гамму он предскажет, но всё равно не предыдущую (в отличие от потокового шифра). В отдельных случаях — малый кусок предыдущей из-за определённого размера буфера внутреннего состояния.


То есть, данные из /dev/random инициализируют /dev/urandom и в принципе /dev/urandom должен был быть криптостоек (если бы его грамотно проектировали, но к сожалению это не так[link9] ). По крайней мере это живой более-менее криптостойкий PRNG (есть практические тонкости из-за которых он может фэйлить: неправильное обновление /var/lib/urandom/random-seed, неправильный порядок запуска в скриптах загрузки при полнодисковом шифровании, чем страдали некоторые системы).


На самом деле /dev/urandom из имеющегося — лучшее, что есть и доверить ему генерацию каких-либо кратковременно действующих ключей оправданно.


а заполнить диск реальным рандомом – слишком длительная процедура, да и нужна ли? Криптостойкость — защита от предсказуемости, а не от "неслучайности". Т.е. не понятно 1. Почему необходим "криптостойкий PRNG" (оксюморон?) для заполнения терабайта

Надеюсь понятно, что не оксюморон, выше дано простое определение. Но для заполнения терабайта именно криптостойкий PRNG действительно (почти) не обязателен. Однако может быть вот что: представим, что раздел заполнили некриптостойким легко взламывающимся PRNG. По фрагментам гаммы его можно различить и составить карту незаполненных и заполненных участков (где в контейнере уже что-то есть) и раздел будет выглядеть почти как если бы его и не заполняли. Т.е. истинные параноики или используют /dev/urandom перед поднятием криптораздела или /dev/zero или хотя бы слабый генератор после его поднятия (из badblocks, shred, wipe — один проход заполнения без затирания). Openssl значит здесь не нужен (и как бы провоцирует жестокий оффтопик на тему дискового шифрования), раз он валится после двух гигов.

Гость (07/06/2010 21:01)   
Спасибо. Недопонимание возникло из-за того, что все PRNG условно полагались некриптостойкими (частично – вопрос непонимания, и частично – вопрос использованных неверных определений).
Гость (08/06/2010 09:32)   
можно сначала поднять криптораздел и перед форматированием (mkfs) через dd заполнить его не медленным dd if=/urandom, а даже /dev/zero
или /dev/random
— unknown (08/06/2010 09:53, исправлен 08/06/2010 10:01)   

/dev/random быстро исчерпается и не будет выдавать следующие блоки данных, пока не получит энтропии от системы (это можно посмотреть в /proc/sys/kernel/random/entropy_avail). На несколько килобайт хватит, а дальше надо ждать и стучать по клавишам.


/dev/urandom не блокируется при нехватке энтропии в системе и может работать только от предыдущих состояний.

— SATtva (08/06/2010 11:44)   
На несколько килобайт хватит, а дальше надо ждать и стучать по клавишам.

При наличии аппаратного ГСЧ ситуация будет несколько лучше, /dev/random может выдавать поток даже быстрее, чем urandom.
Гость (08/06/2010 11:45)   
или используют /dev/urandom перед поднятием криптораздела или /dev/zero или хотя бы слабый генератор после его поднятия (из badblocks, shred, wipe — один проход заполнения без затирания)
причём второй способ предпочтительнее, поскольку в отсутствии идеальности возможно найти различитель криптораздела от /dev/urandom
Гость (05/11/2012 13:03)   
не могу найти тестовые входной вектор, таблицу замен и блок подстановок для режима гаммирования и имитовставки.кто разобрался может сказать где и как их найти?
Гость (05/11/2012 20:20)   
Искать в гугле.
Могу скинуть ссылку, но напиши тогда свою почту.
Гость (05/11/2012 21:00)   
И ФИО, чтобы знать, как к тебе в письме обращаться.
Гость (05/11/2012 21:07)   
Вот зачем этот сарказм?

Если пишу значит знаю о чем пишу.
Вот я решал задачку:
https://www.pgpru.com/forum/kr.....mogitesdelatjzadanie[link10]
вот еще одна
https://www.pgpru.com/forum/kr.....a/rasshifrovkateksta[link11]
и т.д.
Гость (05/11/2012 21:11)   
Просто не хочу тут заниматься тупой рекламой – типа вот зайди на сайт.
И в этом плане поддерживаю админа, который удаляет левые ссылки.
Гость (05/11/2012 21:14)   
А если для человека проблема зарегаить "левую" почту – то накой черт ему нужны тестовые вектора ГОСТ-89?


(сорри что в 5-ти постах
— Гость (05/11/2012 20:20) <#>
— Гость (05/11/2012 21:07) <#>
— Гость (05/11/2012 21:07) <#>
— Гость (05/11/2012 21:11) <#>

Наболело блин.
Как не зайду на какой сайт, всюду умники...
И вот каждому нужно рассказать, каждому разжевать...
"В инете кто-то не прав" :) )
Гость (05/11/2012 21:17)   
Влад, сорри что добавляю тебе работенку – перенесете тогда все это во флуд.
Гость (05/11/2012 23:39)   
Эм...Я не особо поняла,что Вы хотели сказать этим...Так вы скинете ,если я напишу почту?
Гость (06/11/2012 00:13)   
titl_00@mail.ru
если скинете буду очень признательна
Гость (06/11/2012 01:05)   
Хоть бы спасибо сказали... Вот народ пошел.
ДУмаете оно мне больше всего нужно?
Гость (06/11/2012 13:38)   
вообще я Вам ответила на почту и сказала спасибо
Гость (06/11/2012 15:44)   
Просто не хочу тут заниматься тупой рекламой – типа вот зайди на сайт.
Да ладно вам. Если вас специально просят ссылку, дали бы, не вижу никакой проблемы.
— Yellow (21/06/2015 18:42)   
Есть вопросы по этому примеру[link12] бессигнатурного шифрования с помощью OpenSSL. Зачем заменять отрезанный заголовок рандомом? Можно ли просто вот так?



Какой существует лимит на длинну считываемого файла для команды tail -c (или вообще для команды tail без параметров)?
— pgprubot (21/06/2015 19:21, исправлен 21/06/2015 19:23)   

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


Можно и по-вашему сделать:

$ echo 'content' > tfile
$ (openssl enc -aes-256-cbc -salt -in tfile | tail -c +9) > tfile.out
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
$ cat tfile.out |hexdump -Cv
00000000  91 f7 17 73 1b 2d 6d ce  90 1c 25 49 75 80 42 cf  |...s.-m...%Iu.B.|
00000010  36 0d 7d 57 1e 55 0d 58                           |6.}W.U.X|
00000018
$ (echo -n 'Salted__' && cat tfile.out ) \
  | openssl enc -d -aes-256-cbc -salt -out tfile.dec
enter aes-256-cbc decryption password:
$ cat tfile.dec 
content



Думаю, что лимитов нет.

— Yellow (21/06/2015 19:59, исправлен 21/06/2015 20:01)   

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

— pgprubot (21/06/2015 20:20, исправлен 21/06/2015 20:22)   

Думаю, можно, поскольку соль используется. Во всяком случае, зашифрованные одинаковыми паролями одинаковые файлы дают в этом примере разные шифртексты. Правда, я не помню, как тут выводится ключ шифрования из пассфразы с учётом того, что pbkdf2, scrypt и т.п. KDF не используются, поэтому, как минимум, вопросы стойкости пассфразы — целиком и полностью ответственность юзера.


Всё такое нестандартное шифрование лучше дублировать конвенциональным, т.е., например, шифровать с помощью GnuPG файл, а потом, чтобы убрать сигнатуры, заворачивать его ещё в OpenSSL-слой. Нестандартные вещи могут иметь нетривиальные уязвимости, мало кем анализироваться на предмет безопасности... а здесь ещё и нетривиальные/недокументированные режимы использования софта. Всё это делается «на свой страх и риск». Если внутри конвенциональным образом шифрованный текст, максимум, что грозит в случае фейла — потеря отрицаемости (что случайные данные — шифртекст), а в ином случае это может привести и к взлому самих данных или частичной утечке информации о них.


Ссылки
[link1] http://packages.debian.org/source/etch/mcrypt

[link2] https://www.pgpru.com/comment24232

[link3] https://www.pgpru.com/comment24370

[link4] http://www.mail-archive.com/openssl-users@openssl.org/msg59486.html

[link5] http://www.mail-archive.com/openssl-users@openssl.org/msg59487.html

[link6] https://www.pgpru.com/comment39565

[link7] http://hungrycats.org/~zblaxell/projects/randstream/randstream.html

[link8] http://lurkmore.ru/Отака_хуйня,_малята

[link9] https://www.pgpru.com/novosti/2006/0325konceptualjnajanestojjkostjgpschvlinux

[link10] https://www.pgpru.com/forum/kriptografija/poomogitesdelatjzadanie

[link11] https://www.pgpru.com/forum/kriptografija/rasshifrovkateksta

[link12] https://www.pgpru.com/comment39520