Рейтинг:2

Как сгенерировать схему для SHA-256?

флаг ie

В «Булевая схема для SHA-256» Стивена Голдфедера, автор приводит булевую схему для SHA-256. Я нахожу этот метод очень сложным.

Могу я спросить, как построить логическую схему для хеш-функции? Я имею в виду, учитывая алгоритм хеш-функции, как преобразовать его в схему, как в статье?

fgrieu avatar
флаг ng
Вопрос сосредоточен на SHA-256 (как в заголовке) или задан в целом (как в последнем предложении тела)? Требуется ли строго логическое выражение (например, вдоказательство знания значения с заданным хэшем) или что-то для кремниевой конструкции (которая, по всей вероятности, будет в определенной степени последовательной)? Также может быть полезно указать целевую длину ввода и почему считается, что связанное выражение является «очень сложным», учитывая [спецификацию SHA-256] (https://nvlpubs.nist.gov/nistpubs/FIPS/ NIST.FIPS.180-4.pdf#page=6).
user77340 avatar
флаг ie
@fgrieu да, вообще-то я спрашиваю.
Рейтинг:2
флаг ng

учитывая алгоритм хеш-функции, как преобразовать его в схему?

Самое главное, мы сначала хотим лучше сформулировать проблему

  • Какая хэш-функция?
  • Нужна ли нам схема для полной хеш-функции и ввода фиксированной длины [что, кажется, лучше всего соответствует вопросу], или для некоторой части хеш-функции [например, раунд хеш-функции с вводом одного дополненного блока сообщений в связанный материал, если я правильно прочитал]?
  • Зачем нам «схема»? Это повлияет на характер того, что мы производим.
    • Доказательство с нулевым разглашением с использованием хэша, как в связанном примере? Это приведет к выражению в виде длинной цепи ворот, ограниченных некоторыми разновидностями (здесь исключающее ИЛИ, И, и ИНВ)
    • Проверка того, как чистый SAT-решатель обрабатывает решение некоторых проблем, связанных с хешем (например, прообразом)? Выражение, как правило, будет еще более ограниченным (без XOR), с другой стороны, отрицание обычно бесплатно.
    • Оптимизированная реализация в кремнии или FPGA? Как правило, слишком глубокая чистота Логическое выражение будет бесполезным, нам потребуются промежуточные защелки, и если все это не будет глубоко конвейеризировано или хэш будет ужасно нерегулярным, у нас будет некоторая логика, повторно используемая в раундах. Я не буду это освещать.
  • В какой форме мы хотим получить результат? Для чисто булевой схемы большинство форматов будут нумеровать переменные. Я думаю, пример имеет 512 входов, пронумерованных от 0 до 511, 116246 вентилей (по одному на строку), каждый из которых производит одну новую переменную, всего 116758 переменных, и 256 выходов (это могут быть переменные от 116502 до 116757, я не уверен), с этим описанным в первых двух строках по некоторому простому соглашению. Ниже приведены одни ворота на строку, я думаю, для каждого
    • количество входов [1 для НЕ и 2 для остальных в примере]
    • количество выходов [1 в примере]
    • список входных данных
    • список [одного] выхода(ов)
    • имя ворот [XOR, AND, INV в примере]

Остальное в целом следует технике пещерного человека, чтобы съесть мамонта (по одному куску за раз) и прогрессу оттуда (инструменты).

Мы выполняем алгоритм шаг за шагом, разворачивая каждый цикл и выражая каждый шаг в виде булевых уравнений. Например, если все переменные 32-битные (как в SHA-256):

  • заявление вроде С = А ^ В может быть преобразовано в 32 новые переменные для C, выводимые 32 вентилями XOR, что требует 32 строк. Нам нужно следить за номерами, обозначающими новые переменные, присвоенные С.
  • Э = С + Д требует промежуточных переменных, поэтому больше строк. Нам нужно 30 полные сумматоры, а затем два упрощенных (без переноса для старшего бита, который, таким образом, сводится к одному XOR; без переноса для первого, который, таким образом, сводится к одному XOR и одному AND).
  • F = (Е<<3)|(Е>>29) не потребует строки, только переназначение переменных для Е.

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

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

user77340 avatar
флаг ie
Спасибо за Ваш ответ! Да, я хочу использовать его для реализации MPC, или, конкретно, я разрабатываю двухсторонний безопасный протокол вычислений, в котором доказывающая сторона должна проверить прообраз SHA256. Итак, файл в «Булевой схеме для SHA-256» Стивена Голдфедера — это то, что мне нужно. Однако схема, которую они разработали, предназначена для ввода фиксированной длины, а мне нужна схема для ввода произвольной длины. Я все еще борюсь с это Большое спасибо!
fgrieu avatar
флаг ng
@ user77340: для SHA-256 и ввода $b$ битов до $512-64-1=447$-бит ($55$-байт), есть один блок, и он получается добавлением к входу около $512-b $ битов, зависящих только от $b$, а затем применить круглые уравнения (вывести их поучительно и необходимо их проверить. Кроме того, некоторые $55$ из $512-b$ битов всегда равны $0$, увеличиваясь до $65$ за ввод, выровненный по байтам, что допускает некоторые небольшие упрощения.Для произвольной длины вам нужно добавить биты $(-65-b\bmod512)+65$ и применить $\lceil (b+65)/512\rceil$, умноженные на круглые уравнения .

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.