Лекция 10
Выполнение операций над точками ЭК с использованием функций библиотеки MIRACL
E(F2m)E(Fp)
Инициализация:
BOOL. ecruve_init (int m, k3 ,k2 ,k1 ,big a, big b, BOOL check, int type);
проверка неприводимости
многочлена check==TRUE
f(t)=tm+ tk3+ tk2+ tk1+1
R2=0 => f(t)=tm+ tk3+1 – трином
TYPE – тип координат, которые используются
MR_AFFINE – аффинные координаты (x,y)
MR_projective – проективные координаты (x,y,z)
E(Fp)
Void ecurve_init(big a, big b, big P, int type);
Функции:
epoint * epoint2_init(big x, big y, big z, int tmp); - выделение памяти под структуру epoint
void epoint_free(epoint * P) - освобождение памяти
Пример:
f(t)=t4+t+1; a=1; b=0xB.
{ (0,E), (2,D) …
big a,b;
a=mirvar(1);
b=mirvar(0xB);
ecurve2_init(4,1,0,0,a,b,FALSE,MR_AFFINE);
epoint *P,*Q;
P=epoint2_init();
Q=epoint2_init();
Установление значений координат точки:
BOOL epoint2_set(big x, big y, int lsb, epoint *P); //BOOL== TRUE, если устанавливается точка, принадлежащая кривой
&x==&y, то можно найти коэффициенты
lsb – младший бит y/x
Обратная процедура получения координат x и y:
int epoint2_get(epoint *P, big x, big y) //int=> вернет младший бит y/x
&x==&y – сжатое представление точки
convert(0,a);
convert(0xE,b);
Установление значения точки:
Epoint2_set(0,b,0,P);
Дополнительные сервисные функции:
-копирование
void epoint2_copy(epoint *P, epoint *Q);
Q<=P
-сравнение
BOOL epoint2_comp(epoint *P,epoint *Q);
TRUE => P==Q
-определение порядка точки
BOOL point_at_infinity(epoint *P); //является ли точка точкой на неопределенности
TRUE=> P==I
-нормализация
BOOL epoint2_norm(epoint *P); //преобразовываем проективные координаты, чтобы z==1
Основные арифметические функции
Ограничение: точки Є ЕК (инициализация, выделение памяти)
-P+Q; 2P; dP
Ecurve2_add(epoint *P, epoint *Q);
Q<=Q+P
-вычитание
ecurve2_sub(epoint *P, epoint *Q);
Q<=Q-P
-умножение точки на скаляр
ecurve2_mult(big d, epoint *P, epoint *Q); //d<nP(меньше порядка точки)
min d => d-P=I – порядок точки
Q<=d•P;
-при проверке подписи
R=SP+rQ – одновременное двоичное скалярное умножение
P,Q Є ε
S,r – целые числа
Ecurve2_mult2(big Sepoint *P, big r, epoint *Q, epoint *R)
-одновременное многократное скалярное произведение
epoint2_multn(int n, big *d, epoint **P, epoint *Q);
Q<=d[0]•P[0]+ d[1]•P[1]+…+ d[n-1]•P[n-1]
- одновременное многократное сложение точек
ecurve2_multi_add(int n, epoint **P, epoint *Q);
Q<=P[0]+…+P[n-1], при условии, что используются аффинные координаты
P, nP. Вычисляем открытый ключ Q=d-P.
Базовая, фиксированная точка, для нее используются предвычисления.
f(t), a, b, P (nP)
Метод Биксела.
используются следующие функции:
-предвычисления (инициализация)
BOOL ebrick2_init(ebrick2*binst//указатель на структуру//, big x, big y, //координаты базовой точки// big a, big b, int m, k3, k2, k1, int d-MaxBitLen//максимальная битовая длина скалярного множителя – порядок базовой точки//);
-обратная процедура
ebrick2_end(ebrick2 *binst), освобождение памяти
-умножение точки на скаляр
int mul2_brick(ebrick2 *binst, big d, big x, big y);
Q=(x,y)=d•P, если &x=&y, то возвращается x.
Пример 1
Нужно вычислить R=SP+rQ; S=0xA, r=0xD; P≠(0,E), Q=(2,D)
big r;
big S,x,y;
S=mirvar(0xA);// выделение памяти
r=mirvar(0xD);
epoin2 *P,*Q;
P=epoint2_init();
Q= epoint2_init();// выделение памяти
x=mirvar(0);
y=mirvar(0xE);
epoint_set(x,y,0,P);
R=epoint2_init();
convert(2,x);
convert(0xD,y);
epoint2_set(x,y,0,Q);
ecurve_mult2(S,P,r,Q,R);
Пример 2
Определить порядок базовой точки
void ecurve2_point_order(epoint *P, big n)
epoint *R=epoint2_init();
epoint2_copy(P,P1);
convert(1,n);//заносим в n 1
while (!point-at-infinity(P1))
{
pncr(n,1,n);
ecurve_mult(n,P1,R);
epoint2_copy(R,P1);
}
epoint2_free(P1);
epoint2_free(R);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.