Рейтинг:2

Сравнение умножения без переноса и умножения в $GF(2^k)$

флаг tf
Tom

Я реализовал умножение без переноса, используя набор инструкций CLMUL. Это так же быстро, как простое умножение по модулю. Но вычисление результата по модулю некоторого полинома все еще очень медленно. Я делаю это так:

for (целое без знака i = 32; i-- > 0; )
{
    если (с & (1L << (i + 32)))
    {
        с ^= 1L << (i + 32);
        с ^= (uint64_t)p << я;
    }
}

Где c — 64-битный продукт без переноса, а p — некоторый неприводимый 32-битный полином. Я не уверен, что этот код правильный. Можем ли мы сделать это быстрее?

Если я прав в том, что мы все еще должны выполнять эту довольно дорогостоящую процедуру после вычисления произведения, то я начал задаваться вопросом, было бы разумно выполнять умножение без переноса только по модулю. $2^к$. Есть ли мод умножения без переноса $2^к$ сам по себе также имеет те же преимущества, что и мод полинома умножения без переноса?

Это может быть постоянное время, но равномерно ли оно распределено? В общем, умножение без переноса является разумной альтернативой умножению в $GF(2^k)$?

kelalaka avatar
флаг in
Вам нужна защита по сторонним каналам?
Tom avatar
флаг tf
Tom
@kelalaka Я не уверен. Я работаю над некоторым PRNG, основанным на умножении. В качестве альтернативы для умножения по модулю 2 ^ n продукт без переноса кажется достаточно хорошим, особенно если я усекаю или смешиваю младшие биты. Но у этого ГПСЧ есть криптографический потенциал, поскольку он работает как необратимое случайное отображение, может быть параметризован огромным пространством ключей для независимых потоков. В этом случае лучше, если он устойчив к боковым каналам.
kelalaka avatar
флаг in
Ваша цель не совсем ясна. Есть много методов достижения. Первый прием — выбрать [неприводимый многочлен с малым весом ($p$)](https://www.hpl.hp.com/techreports/98/HPL-98-135.pdf), как обсуждалось [здесь](https:/ /crypto.stackexchange.com/a/77958/18298)
Рейтинг:2
флаг ru

Во-первых, ваш код почти верен для умножения в $GF(2^{32})$ при условии, что $р$ представляет битовые коэффициенты для мономов $х^{31},х^{30},\ldots,х^2,х,1$ в неприводимом многочлене степени 32. Есть проблема с ограждением, которое $я$ должен работать от 31 до 0.

Теперь мод умножения без переноски $2^к$ соответствует не умножению в поле, а кольцу $\mathbb Z[x]/x^k\mathbb Z[x]$. Это не лучший математический объект для криптографии. Например, младший бит выходных данных является функцией только младших битов входных данных. Сравнительным умножением в $GF(2^k)$ все выходные биты являются функцией всех входных битов. Другое свойство умножения полей состоит в том, что оно обратимо для ненулевых входных данных, но в нашем кольце функция необратима для входных данных без установленного младшего бита.

Если рассматривать все пары входов, то выходы распределены неравномерно. Например, только 25% входных данных будут давать выходные данные с установленным младшим битом. Если мы зафиксируем один из входов и установим его младший бит, то выходы будут распределены равномерно, но младшие биты вывода будут зависеть только от младших битов входа. Короче не лучшая альтернатива.

Что касается вашего предыдущего вопроса, есть некоторые возможные ускорения. Если предварительно вычислить код для $с$ принимая значения 1<<32, 1<<33,..., 1<<63 и сохраняя эти значения как $x[0],\ldots,x[31]$ то код можно заменить на

для (int i = 31; i-- >= 0; )
{
    если (с & (1L << (i + 32)))
        с ^ = х[я];
}
с %= 1<<32;

Если вам нужно что-то еще более быстрое, вы можете рассмотреть альтернативные способы представления полей, такие как оптимальные нормальные базы или же Логарифмы Цеха

Tom avatar
флаг tf
Tom
Да, p представляет собой битовые коэффициенты для мономов, как вы написали. Так что в таком случае это правильно, не так ли?
Tom avatar
флаг tf
Tom
Кстати, я читал об алгоритме Герона и Кунависа, который представил эффективный способ использования pclmulqdq для сокращения 128-битных модов в GCM: https://www.sciencedirect.com/science/article/abs/pii/S002001901000092X.И теперь мне более понятно - умножение GF, особенно без pclmulqdq дорого по сравнению с обычным умножением. Даже с pclmulqdq это дорого, все равно требуется, например, 32 итерации только для мод полинома в случае 32-битных чисел. Вот почему мы используем некоторые приемы, чтобы сделать его быстрее, как в алгоритме Герона и Кунависа, со специальным полиномом GF(2^128).

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

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