Цифровая подпись EC-DSA⇐ ПредыдущаяСтр 15 из 15
В целом схема аналогична классической DSA, но вместо вычислительно затратной операции модульного экспоненцирования в конечном поле большой характеристики использует умножение точки на скаляр в аддитивной группе точек эллиптической кривой. Каждый абонент системы генерирует секретный ключ Открытый ключ Y представляет собой точку эллиптической кривой: Абонент, желающий подписать сообщение M, выбирает сеансовый ключ: Подпись представляет собой пару: - первая часть подписи, не зависящая от подписываемого сообщения. R служит для неявной передачи эфемерного ключа и, ввиду независимости от подписываемого сообщения, может быть выработано заранее в фоновом режиме. - вторая часть подписи, связанная с сообщением M. Для проверки подписи необходимо вычислить два промежуточных параметра: Подпись считается верной при выполнении равенства:
Задача 5.4. Для заданной кривой E над конечным полем, ее точки P, порядка группы Q и открытого текста M, самостоятельно определить остальные параметры схемы электронно-цифровой подписи EC-DSA и осуществить подписание сообщения. Проверить правильность цифровой подписи. (При решении рекомендуется использовать программу на любом из языков программирования, реализующую сложение и удвоение точек кривой).
Пример решения [10]
Примеры листингов программ для решения задач 5.3, 5.4 приведены в приложениях 2 и 3.
Варианты заданий для пятой части
Примечания: Для задач 5.1, 5.2: , Для задач 5.3, 5.4: Q = 197, P(1, 76)
ЗАКЛЮЧЕНИЕ Учебное пособие «Криптографические методы защиты информации» содержит материалы, которые следует использовать при изучении дисциплин криптографической направленности. Изучение криптографии является одним из важнейших аспектов в специальной подготовке специалистов по защите информации [2]. Успешное освоение данного курса позволяет изучить современные методы криптографической защиты информации. Такие знания необходимы специалисту при разработке систем защиты информации на различных уровнях обеспечения информационной безопасности личности, организации и в целом Российской Федерации. Построение систем защиты информации в современных условиях становится все более актуальным ввиду того, что уровень развития средств несанкционированного добывания информации очень высок, доступность программных средств шпионского толка превращает задачу нелегального добывания информации из уникальной и рискованной операции в достаточно простую задачу. Это значительно увеличивает риск получения больших объемов информации злоумышленниками на безопасном расстоянии от её источников путем её перехвата при обработке и хранении. Практика показывает, что эффективная защита информации с учетом этих тенденций возможна при активном использовании криптографических методов и средств защиты информации. Содержание предлагаемого учебного пособия не претендует на обобщение всего многообразия вопросов криптографической защиты информации, но авторы надеются, что их работа будет с благодарностью оценена всеми, кому приходится сталкиваться с решением задач информационной безопасности в рамках профессиональной деятельности. Приложение 1. Таблица простых чисел p до 997 Примечание: темным цветом выделены p º 3 (mod 4)
Приложение 2 Листинг программы для решения задач 5.3, 5.4 на языке C# Программа реализует обобщенный алгоритм Евклида, сложение и удвоение точек.
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { public class Operations { public int Mod(int a,int p) { if (a < 0) { a = a + p; } return a; } public int Evc(int h, int k) //Алгоритм Евклида { int[,] mt = new int[20, 7];
for (int i = 0; i < 20; i++) { for (int j = 0; j < 7; j++) mt[i, j] = -1; } mt[0, 0] = 1; mt[0, 1] = 0; mt[0, 2] = h; mt[0, 3] = 0; mt[0, 4] = 1; mt[0, 5] = k; mt[0, 6] = (h - (h % k)) / k; int n = 0; while (mt[n, 5] != 0)
{ n++; int m = 0; for (m = 0; m < 3; m++) { mt[n, m] = mt[n - 1, m + 3]; } for (m = 3; m < 6; m++) { mt[n, m] = mt[n - 1, m - 3] - mt[n - 1, m] * mt[n - 1, 6]; } if (mt[n, 5] != 0) { mt[n, 6] = (mt[n, m - 4] - (mt[n, 2] % mt[n, 5])) / mt[n, 5]; } } k = mt[n - 1, 4]; if (k < 0) {k += h; } return (k); } } class Program { static void Main(string[] args) { Operations op1 = new Operations(); int x=0; int y=0; int k; int p = 199; Console.WriteLine("Если требуется удвоение, нажмите 0, если сложение 1"); k = Convert.ToInt32(Console.ReadLine()); if (k==0) //Удвоение { Console.WriteLine("Введите координаты, для удвоения"); int x1; Console.Write("x1="); x1 = Convert.ToInt32(Console.ReadLine()); int y1; Console.Write("y1="); y1 = Convert.ToInt32(Console.ReadLine()); int a; int a1 = 2*y1 % p; a1 = op1.Evc(p, a1); a = (3 * x1 * x1) % p; a = a + 1; a = (a * a1) % p; x = (a * a) % p; x = x - ((2 * x1)%p); x = op1.Mod(x, p); y = x1 - x; y = op1.Mod(y, p); y = (y * a) % p; y = y - y1; y = op1.Mod(y, p); } else //Сложение { Console.WriteLine("Введите координаты, для сложения"); int x1; Console.Write("x1="); x1 = Convert.ToInt32(Console.ReadLine()); int y1; Console.Write("y1="); y1 = Convert.ToInt32(Console.ReadLine()); int x2; Console.Write("x2="); x2 = Convert.ToInt32(Console.ReadLine()); int y2; Console.Write("y2="); y2 = Convert.ToInt32(Console.ReadLine()); int a; int a1 = x2-x1; a1 = op1.Mod(a1, p); a1 = op1.Evc(p, a1); a = y2 - y1; a = op1.Mod(a, p); a = (a * a1) % p; x = (a * a) % p; x = x - x1; x = op1.Mod(x, p); x = x - x2; x = op1.Mod(x, p); x = x % p; y = (x1 - x); y = op1.Mod(y, p); y = (y * a) % p; y = y - y1; y = op1.Mod(y, p); } Console.WriteLine("x=" + x); Console.WriteLine("y=" + y); Console.ReadKey(); } } }
Приложение 3 Листинг программы для решения задач 5.3, 5.4 на языке Pascal Программа реализует обобщенный алгоритм Евклида, сложение и удвоение точек, а также умножение точки на скаляр с использованием схемы Горнера. var a:array[1..10]of boolean; xn,yn,p,k,xk,yk,i,j,x,y:integer; function ee(pe,ae:integer):integer; var u1,u2,u3,v1,v2,v3,t1,t2,t3,q:integer; begin u1:=1; u2:=0; u3:=pe; v1:=0; v2:=1; v3:=ae; while v3>0 do begin q:=trunc(u3/v3); t1:=u1-v1*q; t2:=u2-v2*q; t3:=u3-v3*q; u1:=v1; u2:=v2; u3:=v3; v1:=t1; v2:=t2; v3:=t3; end; if u3=1 then if u2>0 then ee:=u2 else ee:=pe+u2 else ee:=0 end; procedure dub(x1,y1,pm:integer; var x3,y3:integer); var lam:integer; begin lam:=((3*x1*x1+1)mod pm)*ee(pm,(2*y1)mod pm); lam:=lam mod pm; x3:=(lam*lam)mod pm - (2*x1)mod pm; while x3<0 do x3:=x3+pm; x3:=x3 mod pm; y3:=(x1-x3)*lam - y1; while y3<0 do y3:=y3+pm; y3:=y3 mod pm; end; procedure ad(x1,y1,x2,y2,pm:integer; var x3,y3:integer); var lam,chz,znam:integer; begin chz:=y2 - y1; while chz<0 do chz:=chz+pm; znam:=x2 - x1; while znam<0 do znam:=znam+pm; lam:=(chz)*ee(pm,znam); lam:=lam mod pm; x3:=(lam*lam)mod pm - x1 - x2; while x3<0 do x3:=x3+pm; y3:=(x1-x3)*lam - y1; while y3<0 do y3:=y3+pm; y3:=y3 mod pm; end; begin write('x=');readln(xn); write('y=');readln(yn); {write('p=');readln(p);}p:=199; write('k=');readln(k); j:=0; while k>0 do begin j:=j+1; if odd(k) then a[j]:=true else a[j]:=false; k:=k div 2 end; x:=xn;y:=yn; for i:=j-1 downto 1 do begin if a[i] then begin dub(x,y,p,xk,yk);x:=xk;y:=yk; ad(x,y,xn,yn,p,xk,yk) end else dub(x,y,p,xk,yk); x:=xk;y:=yk; end; {dub(xn,yn,p,x,y); for i:=2 to k-1 do begin ad(x,y,xn,yn,p,xk,yk); x:=xk; y:=yk; end;} writeln(x,' ',y) end. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|