Нужны тестовые векторы ГОСТ 28147-89
люди, пишу реализуцию, нужны векторы на правильность простой замены и имитовставки.Ссылки
[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
А у кого вы брали S-блоки, они ведь в стандарте не опубликованы, а откуда тогда тестовые векторы официально взять?
нет, мне необходимо проверить правильность реализации, официальные тестовые векторы не нужны.
таблицу замен можно использовать ту, что использует Центробанк РФ (ее описывает шнайер в Прикл. Крипт.).
можно просто зашифровать два 64-битовых блока по ГОСТ с имитовставкой по сертифицированной программе (ну можно и без сертификации) и выложить сюда.
естессно, приложите и откытый текст с ключом – а то какой-нибудь умник закинет только шифртекст :)
Вы уверены, что в "любой сертифицированной реализации" будут именно цэбэшные векторы из книги Шнайера?
Случайный мусор вначале – это скорее всего IV – он всегда разный даже для одного ключа, равен размеру блока шифра (64 бит) и приписывается к началу шифртекста даже в режиме ECB.
А в конце – неполный блок, он всегда одинаковый для одного и тогоже ключа.
Программа несертифициорована.
ECB – это простая замена, а имитовставка – это я так понимаю CBC?
и ещё раз тот же ключ с другим IV:
Кстати размер ключа у ГОСТ вообще-то 256-бит, а программа в режиме задания ключа hex съедает сколько угодно шестнадцатиричных знаков, но после 32 байт их не различает так что ключи скорее всего дполняются до:
0x00..01..00 и 0x00..02..00 (256 бит)
имитовставка-это последовательность из L бит, где L – от 1 до 32.
в основном нужна была она, но все равно спасибо. сейчас буду разбираться что к чему.
кстати, какая таблица замен? Без нее проблематично все сделать. или мне подбирать 512 бит? ))
не имеет значения какая ТЗ – главное, чтобы была указаны узлы замен.
Посмотрите в исходниках[link1]. Скорее всего S-блоки (таблицы замен) из Большой Красной Книги Шнайера.
В контексте комментариев /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.
unknown, в вышеприведённом комментарии негласно подразумевалось, что Вы скажете что-нибудь по этому поводу :)
Тогда при использовании nosalt обязательно нужно использовать:
Иначе разные открытые тексты, зашифрованные тем же паролем будут иметь одинаковые векторы инициализации (если вообще будут иметь что-то отличное от нулевой строки).
В mcrypt опция bare по крайней мере что-то гарантирует хотя бы со слов документации. И всё равно, нужно разбираться, прежде чем например это куда-то встраивать, а в openssl такое использование штатно не предусмотрено.
openssl — это в первую очередь утилита-надстройка над соответствующей библиотекой реализации протокола ssl соответственно.
В самом деле, у openssl с -nosalt IV генерится как однозначная ф-я ключа, но там не 0, но что-то типа PBKDF. Я, правда, не понимаю чем это страшно. У mcrypt IV генерится случайно и хранится в пакете. Понятно, что
- при IV=0 CBC становится ECB и это плохо,
- если у шифртекстов равны IV и пароли, и они имеют общие куски, то эти куски можно установить.
Можно ли еще что-то извлечь из этого?Вообще, если не нравится, можно использовать openssl с солью и отпиливать magic (первые 8 байт), а перед использованием запиливать обратно. Другое дело, что почему-то ни mcrypt, ни openssl не использует честную PBKDF2.
Проектируемая схема всегда должна быть по-возможности идеальной. Использование даже не то что постоянного и неповторяемого, а хотя бы предсказуемого IV (например по счётчику) делает схему формально уязвимой к атакам с подобранным и адаптивно-подобранным шифртекстом.
Вот рабочий пример:
© вот так оправдываются разработчики OpenSSL (из рассылки): вопрос[link4], ответ[link5]. P.S.: Cамо pbkdf2 есть в OpenSSL, но на cli-тулзы они подзабили.
Да, разработку утилит они вообще хотели свернуть, оставив только либу.
Ещё один гвоздь в гроб OpenSSL или "wipe диска – так ли это просто?"
В контексте /comment39565[link6] для настройки полного шифрования терабайтного диска его надо было заполнить случайными данными. Казалось бы, всё просто, и неоднократные советы с форума типа "юз dd и urandom" окончательно решают проблему. Что же на самом деле? Начнём с более быстрого метода – OpenSSL:
Угарно, да? Кто не верит – попробуйте ;) После ряда тестов выясняется – дело в величине числа после rand, на которое есть фундаментальное ограничение в 231-1=2Гб. У вас диск больше 2Гб? Значит, не повезло.
shred в pkgsrc отсутствует, в базовой системе – также. Вариант отпадает.
Проблему можно решить 3мя вариантами:
Был выбран 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].
Кстати, есть один быстрый алгоритм:
но его нет в системной libc, хотя имеются сторонние реализации. Способ с "15тью строчками на С", возможно, был бы быстрее.
P.S.: пора хорошим людям собраться и
убить всех плохих людейнаписать вменяемый CLI-фронтенд к криптопримитивам, а-ля mcrypt, только поменьше костылей, помодерновее, с поддержкой хэшей, PRNG, HMAC-ов (я не знаю, что еще понадобиться может), и это должны быть именно примитивы. Или, может быть, просто перл надо знать и писать на нём свои простейшие обертки вокруг OpenSSL'ных примитивов? У перла они, наверное, самые короткие будут, да и биндинги к нему уже есть.P.P.S: нет, не себе Ubuntu ставлю – просто попросили поставить user-friendly-Linux и настроить его для того, кто в Linux никакой, да так, чтоб всё свистело, да работало, как в сказке. Мой первый Linux... чтоб его...
Это некриптостойкий генератор, хотя идеально проходящий все статистические тесты.
С таким же успехом можно использовать badblocks -t random.
С другой стороны, можно сначала поднять криптораздел и перед форматированием (mkfs) через dd заполнить его не медленным dd if=/urandom, а даже /dev/zero, но натравливать именно на поднятый криптораздел, чтобы нули шифровались. Конечно, противник сможет иметь больше оснований для предположении о наличии в открытом тексте раздела избыточного количества нулей, но это несущественный теоретический аспект.
Spinore, спасибо за тшательно разобранный и записанный пример, часто людям бывает лень делать подробный отчёт как для багрепорта.
Всегда пожалуйста :)
Так любой PRNG – некриптостойкий, а заполнить диск реальным рандомом – слишком длительная процедура, да и нужна ли? Криптостойкость — защита от предсказуемости, а не от "неслучайности". Т.е. не понятно
Это интересная идея. Не додумал(ся,ись). Но он, может быть, менее случаен?
Тоже интересно. Проверил скорость (на объёмах порядка гигабайта) – 15Mb/s, т.е. в полтора раза быстрее было бы, чем используемый метод:
С другой стороны, если запускать с nice и долго ждать, то скорость записи потом постепенно снижается. Для моего метода она сейчас чуть больше 10 мегабайт; как было бы для нулей – не ясно, но, наверное, ничуть не хуже, да и технически это сделать куда проще.
Может сообщим Шнайеру и Ко, чтобы он удалил свой кандидат с конкурса SHA-3, у него же универсальный криптопримитив, в том числе со свойствами PRNG. Всем другим разработчикам PRNG тоже будет интересно знать, что PRNG бывают исключительно некриптостойкие.
В стойком PRNG на самом деле все принципы такие же, как в обычном криптоалгоритме. Он мало отличается от потокового шифра, стойкость которого задаётся ключом. Из ключа разворачивается гамма практически бесконечной длины (ну там с ограничением до 2256 байт).
Для потокового шифра достаточно, чтобы:
Или самый сильный критерий: невозможность нахождения различителя между потоковым шифром и идеализированным генератором истинно случайных чисел быстрее чем атаки грубой силой. С учётом не только простых статистических тестов, но и криптоаналитических атак на основе знания алгоритма. Ну и атаки со знанием ключа не должны показывать различие входа и выхода с идеальной моделью, куда же теперь без них. Атак на тексты нет (он тупо ксорится, как в одноразовом блокноте, поэтому анализируют только гамму).
Чтобы не было путаницы в терминологии можно привести и критерий отличия PRNG от потокового шифра:
В PRNG как такового ключа нет и не нужно (поскольку не нужно ничего расшифровывать обратно). Есть заполнение первоначального внутреннего состояния какими-то случайными данными. Это состояние регулярно необратимо перетирается. Данные о предыдущих использованных внутренних состояниях уничтожаются. Если даже произойдёт взлом, то восстановление последующей гаммы PRNG более вероятно, чем восстановление предыдущих состояний (более сильная непредсказуемость влево по сравнению с потоковым шифром). Это свойство PFS (Perfect Forward Security), а под взломом может иметься ввиду не только криптоаналитический взлом, но и то что противник получил доступ к памяти и узнал внутреннее состояние генератора. Тогда всю последующую гамму он предскажет, но всё равно не предыдущую (в отличие от потокового шифра). В отдельных случаях — малый кусок предыдущей из-за определённого размера буфера внутреннего состояния.
То есть, данные из /dev/random инициализируют /dev/urandom и в принципе /dev/urandom должен был быть криптостоек (если бы его грамотно проектировали, но к сожалению это не так[link9] ). По крайней мере это живой более-менее криптостойкий PRNG (есть практические тонкости из-за которых он может фэйлить: неправильное обновление /var/lib/urandom/random-seed, неправильный порядок запуска в скриптах загрузки при полнодисковом шифровании, чем страдали некоторые системы).
На самом деле /dev/urandom из имеющегося — лучшее, что есть и доверить ему генерацию каких-либо кратковременно действующих ключей оправданно.
Надеюсь понятно, что не оксюморон, выше дано простое определение. Но для заполнения терабайта именно криптостойкий PRNG действительно (почти) не обязателен. Однако может быть вот что: представим, что раздел заполнили некриптостойким легко взламывающимся PRNG. По фрагментам гаммы его можно различить и составить карту незаполненных и заполненных участков (где в контейнере уже что-то есть) и раздел будет выглядеть почти как если бы его и не заполняли. Т.е. истинные параноики или используют /dev/urandom перед поднятием криптораздела или /dev/zero или хотя бы слабый генератор после его поднятия (из badblocks, shred, wipe — один проход заполнения без затирания). Openssl значит здесь не нужен (и как бы провоцирует жестокий оффтопик на тему дискового шифрования), раз он валится после двух гигов.
Спасибо. Недопонимание возникло из-за того, что все PRNG условно полагались некриптостойкими (частично – вопрос непонимания, и частично – вопрос использованных неверных определений).
или /dev/random
/dev/random быстро исчерпается и не будет выдавать следующие блоки данных, пока не получит энтропии от системы (это можно посмотреть в /proc/sys/kernel/random/entropy_avail). На несколько килобайт хватит, а дальше надо ждать и стучать по клавишам.
/dev/urandom не блокируется при нехватке энтропии в системе и может работать только от предыдущих состояний.
При наличии аппаратного ГСЧ ситуация будет несколько лучше, /dev/random может выдавать поток даже быстрее, чем urandom.
причём второй способ предпочтительнее, поскольку в отсутствии идеальности возможно найти различитель криптораздела от /dev/urandom
не могу найти тестовые входной вектор, таблицу замен и блок подстановок для режима гаммирования и имитовставки.кто разобрался может сказать где и как их найти?
Искать в гугле.
Могу скинуть ссылку, но напиши тогда свою почту.
И ФИО, чтобы знать, как к тебе в письме обращаться.
Вот зачем этот сарказм?
Если пишу значит знаю о чем пишу.
Вот я решал задачку:
https://www.pgpru.com/forum/kr.....mogitesdelatjzadanie[link10]
вот еще одна
https://www.pgpru.com/forum/kr.....a/rasshifrovkateksta[link11]
и т.д.
Просто не хочу тут заниматься тупой рекламой – типа вот зайди на сайт.
И в этом плане поддерживаю админа, который удаляет левые ссылки.
А если для человека проблема зарегаить "левую" почту – то накой черт ему нужны тестовые вектора ГОСТ-89?
(сорри что в 5-ти постах
— Гость (05/11/2012 20:20) <#>
— Гость (05/11/2012 21:07) <#>
— Гость (05/11/2012 21:07) <#>
— Гость (05/11/2012 21:11) <#>
Наболело блин.
Как не зайду на какой сайт, всюду умники...
И вот каждому нужно рассказать, каждому разжевать...
"В инете кто-то не прав" :) )
Влад, сорри что добавляю тебе работенку – перенесете тогда все это во флуд.
Эм...Я не особо поняла,что Вы хотели сказать этим...Так вы скинете ,если я напишу почту?
titl_00@mail.ru
если скинете буду очень признательна
Хоть бы спасибо сказали... Вот народ пошел.
ДУмаете оно мне больше всего нужно?
вообще я Вам ответила на почту и сказала спасибо
Да ладно вам. Если вас специально просят ссылку, дали бы, не вижу никакой проблемы.
Есть вопросы по этому примеру[link12] бессигнатурного шифрования с помощью OpenSSL. Зачем заменять отрезанный заголовок рандомом? Можно ли просто вот так?
Какой существует лимит на длинну считываемого файла для команды tail -c (или вообще для команды tail без параметров)?
Там приведён один из примеров, как можно действовать. Могут быть и другие варианты. Приведённый там вариант, например, не меняет зашифрованный размеров файлов по сравнению с обычным сигнатурным OpenSSL-шифрованием (не знаю, плохо это или хорошо).
Можно и по-вашему сделать:
Думаю, что лимитов нет.
Можно ли при указываемом способе бессигн-го шифрования использовать одинаковую парольную фразу для разных шифруемых файлов? Не будет ли утечки? Спасибо.
Думаю, можно, поскольку соль используется. Во всяком случае, зашифрованные одинаковыми паролями одинаковые файлы дают в этом примере разные шифртексты. Правда, я не помню, как тут выводится ключ шифрования из пассфразы с учётом того, что pbkdf2, scrypt и т.п. KDF не используются, поэтому, как минимум, вопросы стойкости пассфразы — целиком и полностью ответственность юзера.
Всё такое нестандартное шифрование лучше дублировать конвенциональным, т.е., например, шифровать с помощью GnuPG файл, а потом, чтобы убрать сигнатуры, заворачивать его ещё в OpenSSL-слой. Нестандартные вещи могут иметь нетривиальные уязвимости, мало кем анализироваться на предмет безопасности... а здесь ещё и нетривиальные/недокументированные режимы использования софта. Всё это делается «на свой страх и риск». Если внутри конвенциональным образом шифрованный текст, максимум, что грозит в случае фейла — потеря отрицаемости (что случайные данные — шифртекст), а в ином случае это может привести и к взлому самих данных или частичной утечке информации о них.