Бристоль первые 23 Cryptography

Криптография вещь 52

Номер 23: написать программу C для достижения алгоритма Монтгомери

В блоге я буду идти через фактическую реализацию алгоритма Монтгомери, чтобы дополнить теоретические аспекты нашего недельного алгоритма Монтгомери. Эта реализация в C Монтгомери алгоритм, компьютер 64 записывается в виде цифры. Модуль \ (м \) можно, и \ (2 ^ {64} -1 \) , как большой, \ (А \) и \ (В \) энергии и \ (м-1 \) в целом. Мы используем \ (R & л = 2 ^ {64} \) . В предыдущем блоге, большая часть информации , представленной поступает из [1], поэтому , пожалуйста , обратитесь к информации в настоящем документе.

После чтения последнего блог, вы знаете, нам нужны четыре шага. Для наших целей, мы называем эти три этапа.

1. НОД Операция

Эта функция выполняет двоичный расширенный алгоритм Евклида , чтобы найти \ (г ^ {- 1} \) и \ (т ^ { «} \ ) такое , что \ (р - р ^ {- 1} = 1 + мм ^ { } \) . Эти алгоритмы целое позже нужно использовать. Алгоритм \ (г ^ {- 1} \) и \ (т ^ { '} \ ) вычисляется \ (т, т ^ {'} \) , цель этого описания не бинарный блог расширенный алгоритм Евклида , Вы хотите узнать больше можно увидеть ссылку [1] и [2].

2.Transform мультипликаторов

Второй этап состоит в вычислении двух значений \ (Abar = ар \ тойт \) и \ (ш просветляющего = \ MOD т \) . Так как \ (R & л = 2 ^ {64} \) , где только 64-битный сдвиг вправо , Это выходной сигнал 128, первые 64 бита \ (а, Ь \) значения, после всего 64 0. Затем вычисляется \ (т \) модуль упругости. Эта функция принимает 64-битовую \ (X \) , получая при этом низкий 64-битный \ (Y \) и \ (т \) значения. После возвращения 64-битное значение.

uint64 modul64(uint64 x, uint64 y, uint64 z);

uint64Она определяется как:

typedef unsigned long long uint64;

3.Montgomery Умножение

Эта функция определена для получения 64-битного Abar, просветляющий, м и mprime. Затем вернитесь в 64-битовое значение.

Во- первых вычислить \ (Т * = Абар просветляющего \) . Получить 128-разрядное целое число.

Затем вычисляется \ (U = (Т + ((ТМ) ^ { «} \ Р & л MOD) * м) / Р & л \) . \ (Т \) является 128-битовым целым числом. Здесь вы можете рассчитывать. Она определяется следующим образом :

tm = tlo*mprime;
mulul64(tm,m,&tmmhi,%tmmlo);

Затем рассчитайте:

ulo = tlo + tmmlo;
uhi = thi + tmmhi;
if (ulo < tlo) uhi = uhi +1; // test for overflow from ulo and add if necessary to uhi
ov = (uhi < thi) | ((uhi == thi) & (ulo < tlo)); // check for carry

Заключительный шаг уменьшается до примерно \ (т \) .

ulo = uhi;
uhi = 0;
if(ov > 0 || ulo >= m) // test if there was overflow or ulo is higher that
             ulo = ulo – m;
return ulo;
Трансформация 4.The Inverse

Наконец вычислить \ (A * B \ тойт = Ур ^ {- 1} \ тойт \)

Перед вызовом функции.

mulul64(p, rinv, &phi, &plo); // performs multiplication and returns two 64 bit values phi and plo
p = modul64(phi, plo, m); // returns value of 128bit input mod m

Здесь \ (р \) является результатом алгоритма Монтгомери.

[1] http://www.hackersdelight.org/MontgomeryMultiplication.pdf
[2] http://www.ucl.ac.uk/~ucahcjm/combopt/ext_gcd_python_programs.pdf

рекомендация

отwww.cnblogs.com/zhuowangy2k/p/10962516.html