Рейтинг:1

Параметры смещения в BLAKE2b

флаг in

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

статическая пустота G (int roundNum, int i, int a, int b, int c, int d)
    {
        int p = (roundNum << 4) + 2 * i;
        int p0 = ЗаменитьКонстанты[p];
        int p1 = ЗаменитьКонстанты[p + 1];

        строка s = @"// G(r, i, a, b, c, d)
            а = а + b + m[" + p0 + @"];
            д ^ = а;
            d = " + RotateRight("d", 32) + @";
            с = с + д;
            б ^= с;
            b = " + RotateRight("b", 24) + @";
            а = а + b + m[" + p1 + @"];
            д ^ = а;
            d = " + RotateRight("d", 16) + @";
            с = с + д;
            б ^= с;
            b = " + RotateRight("b", 63) + @";";
        s = s.Replace ("а", "v" + а);
        s = s.Replace("b", "v" + b);
        s = s.Replace("c", "v" + c);
        s = s.Replace("d", "v" + d);
        s = s.Replace("r", roundNum.ToString());
        s = s.Replace("i", i.ToString());
        s = s.Replace("\t", "");
        Console.WriteLine(s);
        Консоль.ЗаписьЛинии();
    }

Единственная основная функция G, она вызывает RotateRight четыре раза, как и предполагалось.

статическая строка RotateRight (имя строки, смещение int)
    {
        return "((" + имя + " >>" + смещение + ")|(" + имя + " << (64-" + смещение + ")))";
    }

Я не понимаю, почему Rotate принимает параметры смещения 32, 24, 16, 63, когда нужны 16, 12, 8, 7, как показано ниже: blake2b, иллюстрация алгоритма Также по поводу этой схемы, что делать $Сsigma_r(2i+1)$ и $Msigma_r(2i)$ иметь в виду?

Мои источники:

Иллюстрация из Википедии

Официальная реализация C#

soul king avatar
флаг in
добавил ресурсы в пост
fgrieu avatar
флаг ng
@Morrolan: я признаю [это] (https://github.com/BLAKE2/BLAKE2/blob/master/csharp/Blake2Sharp/Blake2BCore-Simple.cs#L26-L42) стандартным C#. Но я не понимаю `string s = @"` часть кода вопроса. В любом случае это не по теме.
Morrolan avatar
флаг ng
@fgrieu А, я мысленно пропустил это. `@` - это просто синтаксический сахар, позволяющий дословно обрабатывать содержимое строки, то есть без специального значения, которое обычно присваивается таким символам, как `\`. Глядя на модификацию строки ниже, она, вероятно, используется для создания развернутой реализации в репо. (Не по теме, признаюсь. Хорошо, что мода нет)
Рейтинг:2
флаг ng

$G$ функция

Графика, на которую вы ссылаетесь, похоже, описывает $G$ функция BLAKE- и нет из BLAKE2b. Обратите внимание не только на разные повороты, но и на добавление констант $C_{\sigma_r(2i+1)}$ которых больше нет в BLAKE2. Оба они соответствуют определению $G$ функция BLAKE, согласно официальная документация.

Что касается BLAKE2: обратите внимание, что существует две версии BLAKE2. BLAKE2s для платформ с 8-32-битным оборудованием, BLAKE2b для платформ с 64-битным оборудованием.

BLAKE2s использует повороты на 16, 12, 8 и 7 бит соответственно, но без постоянного сложения, поэтому будет выглядеть очень похоже (но не равно!) вашей графике.

BLAKE2b, с другой стороны, использует повороты на 32, 24, 16 и 63 бита соответственно, что и реализует указанный исходный код.

Подробную информацию о BLAKE2 см. в разделе 2.4 официального Документация BLAKE2 (который, кажется, сосредоточен на изменениях с BLAKE на BLAKE2), или его RFC который дает полное описание.

В репозитории, на который вы ссылаетесь, они предоставляют только эталонную реализацию C# BLAKE2b. Однако вы можете увидеть различные реализации, сравнив эталонные реализации C БЛЕЙК2b и БЛЕЙК2с:

БЛЕЙК2с $G()$ функция

# определить G(r,i,a,b,c,d) \
  делать {                                      \
    а = а + b + m[blake2s_sigma[r][2*i+0]]; \
    d = rotr32(d ^ а, 16); \
    с = с + д; \
    b = rotr32(b ^ c, 12); \
    а = а + b + m[blake2s_sigma[r][2*i+1]]; \
    d = rotr32(d ^ а, 8); \
    с = с + д; \
    b = rotr32(b ^ c, 7); \
  } пока(0)

BLAKE2b $G()$ функция:

# определить G(r,i,a,b,c,d) \
  делать {                                      \
    а = а + b + m[blake2b_sigma[r][2*i+0]]; \
    d = rotr64(d ^ а, 32); \
    с = с + д; \
    b = rotr64(b ^ c, 24); \
    а = а + b + m[blake2b_sigma[r][2*i+1]]; \
    d = rotr64(d ^ а, 16); \
    с = с + д; \
    b = rotr64(b ^ c, 63); \
  } пока(0)

Перестановки

$\сигма$ вы спрашиваете о семействе перестановок, см., например. раздел 2.7 BLAKE2 RFC.

soul king avatar
флаг in
большое спасибо вам, теперь я понимаю. Думаю, у меня появятся новые вопросы, я задам их под вашим комментарием!

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

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