Криптография вещь 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