Програмування алгоритму цифрового підпису ГОСТ Р 34 жовтня 1994

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Міністерство вищої освіти Російської Федерації
Пензенський державний університет
Кафедра «Інформаційна безпека систем і технологій»
ПОЯСНЮВАЛЬНА ЗАПИСКА
курсової роботи на тему
«Програмування алгоритму цифрового підпису ГОСТ Р 34.10-94»
ПГУ 3.090105.001 ПЗ
Дисципліна КМЗІ
Група
Розробила студентка
Проект прийнятий з оцінкою
Керівник проекту
Пенза, 2006

Реферат
Пояснювальна записка 24 с., 3 джерела, 3 дод.
ЦИФРОВИЙ ПІДПИС, ПРОГРАМА, ІНТЕРФЕЙС, ФУНКЦІЯ, ФАЙЛИ, ВІДКРИТИЙ КЛЮЧ, ЗАКРИТИЙ КЛЮЧ.
Об'єкт дослідження - алгоритм цифрового підпису ГОСТ Р 34.10-94.
Метою роботи є отримання навичок у програмуванні криптоалгоритмів на прикладі алгоритму цифрового підпису ГОСТ Р 34.10-94.
У процесі роботи була розроблена програма, яка здійснює процедуру підпису повідомлення і процедуру перевірки підпису.
В результаті виконання роботи були отримані навички в програмуванні алгоритму цифрового підпису ГОСТ Р 34.10-94.

Зміст
 
Введення
1. Для користувача інтерфейс програми
2. Керівництво користувача
3. Опис алгоритмів
3.1. Алгоритм функції формування підпису
3.2. Алгоритм функції перевірки підпису
Висновок
Список використаних джерел
Блок схема алгоритму функції формування підпису
Блок схема алгоритму функції перевірки підпису
Лістинг програми

Введення
В даний час широкого поширення набули персональні комп'ютери. Вони, без перебільшення, увійшли в усі сфери людської діяльності. Це максимально полегшило людську працю. Зараз важко уявити, щоб робила людина без комп'ютера. Підприємства, фірми, офіси, банки - це ще далеко не всі області застосування персонального комп'ютера.
Без використання криптографії сьогодні немислимо рішення завдань по забезпеченню безпеки інформації, пов'язаних з конфіденційністю і цілісністю. Якщо до 1990р. криптографія забезпечувала закриття державних ліній зв'язку, то в наші дні використання криптографічних методів отримало широке поширення завдяки розвитку комп'ютерних мереж та електронного обміну даними в різних областях [3].
Володіння мовами програмування дозволяє значно розширити коло виконуваних завдань фахівцем із захисту інформації та більш повно використовувати можливості комп'ютера.
Ця курсова робота написана на мові С.
С - це універсальна мова програмування з компактним способом запису виразів, сучасними механізмами управління структурами даних і багатим набором операторів [1].
Метою курсової роботи є розробка програми, яка реалізує процедуру підпису повідомлення і процедуру перевірки підпису.

1. Для користувача інтерфейс програми
Інтерфейс - апаратна або програмна система сполучення об'єктів з різними характеристиками. Програмний інтерфейс дозволяє узгоджувати програми з різними параметрами, а також дають можливість користувачу працювати в операційному середовищі з тим або іншим ступенем комфорту.
Методи і засоби взаємодії з апаратними та програмними засобами називають користувача інтерфейсом [2]. Будь-яка програма повинна мати для користувача інтерфейсом, інакше, крім свого розробника, вона буде недоступна в розумінні особі з нею не знайомому.
Інтерфейс буває різних типів. Розроблена програма має інтерактивним інтерфейсом. Основним пристроєм управління в даному випадку є клавіатура.

2. Керівництво користувача
Програма призначена для виконання підпису повідомлення та підписи.
Після запуску програма пропонує вибрати дію:
Послідовний виклик процедур підпису повідомлення і перевірки підпису.
Підписати повідомлення.
Перевірити підпис.
Вхідні дані зберігаються у файлі initial data.txt:
р - просте число, яке задовольняє вимогу 2 509 <р <2 512;
q - просте число, яке задовольняє вимогу 2 254 <q <2 256;
a - число, яке розраховується за формулою a q (mod p) = 1 і задовольняє вимогу 1 <а <р-1;
x - закритий ключ, що задовольняє вимогу 1 <x <q;
y - відкритий ключ, який розраховується за формулою y = a x (mod p);
m - хеш-функція за алгоритмом ГОСТ Р 34.11.
Вибравши дію, програма робить необхідні дії і записує результати у файли: цифровий підпис записується в signature.txt, а результат перевірки підпису - в verification result.txt.

3. Опис алгоритмів
3.1 Алгоритм функції формування підпису
Функція формування підпису signature формує підпис, використовуючи початкові параметри, розташовані у файлі initial data.txt. Початкові параметри повинні відповідати таким вимогам:
просте число р: 2 509 <р <2 512;
просте число q: 2 254 <q <2 256;
a: 1 <а <р-1, a q (mod p) = 1;
закритий ключ x: 1 <x <q;
відкритий ключ y: y = a x (mod p);
хеш-функція h (M) = m за алгоритмом ГОСТ Р 34.11.
Для формування підпису необхідно обчислити:
r = ak (mod p)
r '= r (mod q)
s = xr '+ km (mod q)
Таким чином, цифровий підпис для повідомлення М є: <r'>||< s>.
Алгоритм функції формування підпису наведений у Додатку А.
3.2 Алгоритм функції перевірки підпису
Функція перевірки підпису verify перевіряє підпис, використовую параметри:
цифровий підпис повідомлення М;
відкритий ключ;
хеш-функцію;
прості числа р і q.
Для перевірки підпису необхідно обчислити:
v = m q-2 (mod q)
z 1 = sv (mod q)
z 2 = (qr ') v (mod q)
u = (a z1 y z2 (mod p)) (mod q)
Якщо умова r '= u виконано - підпис справжній. Результат перевірки підпису знаходиться у файлі verification result.txt.
Алгоритм функції перевірки підпису наведений у Додатку Б.

4. Налагодження і перевірка працездатності програми
Програма була откомпилирован та налагоджена.
Для перевірки працездатності програми був запущений файл sign. Exe, були обрані дії, які необхідно виконати. Наприклад, необхідно сформувати цифровий підпис і перевірити її достовірність.

Текст вхідного файлу initial data.txt:

Текст вихідного файлу signature.txt:

Текст вихідного файлу verification result.txt:

Оцінка результатів показала, що програма працює правильно.
Лістинг програми наведено у Додатку В.

Висновок
Розроблена програма написана на мові Сі. Програма здійснює формування цифрового підпису за алгоритмом ГОСТ Р 34.10-94 і перевірку цифрового підпису.
Таким чином, завдання на курсову роботу виконано в повному обсязі.

Список використаних джерел
1. Керніган Б., Рітчі Д. Мова програмування Сі Пер. з англ., 3-е изд., испр. - СПб.: «Невський діалект», 2001. - 352с.
2. Інформатика: Базовий курс \ С.В. Симонович та ін - СПб,: Питер, 2001. - 640 с.
3. Алфьоров А.П., Зубов А.Ю., Кузьмін А.С., Черьомушкін А.В. Основи криптографії: Навчальний посібник, 2-е вид., Испр. І доп. - М.: Геліос АРВ, 2002. - 480с., Іл.

ДОДАТОК А
Блок схема алгоритму функції формування підпису


ДОДАТОК Б
Блок схема алгоритму функції перевірки підпису


ДОДАТОК У
Лістинг програми
Sign.cpp
# Include <stdio.h>
# Include <conio.h>
# Include <stdlib.h>
# Include "Interfs.h"
# Include "function.h"
# Define LOWORD (T) ((unsigned short) (T))
# Define HIWORD (T) ((unsigned short) (T>> 16))
# Define MAKELONG (a, b) ((((unsigned long) (a)) <<16) + b)
# Define S 32
/ * Addition * /
void add (unsigned short add_a [], unsigned short add_b [], unsigned short add_c [], int add_l_a_b)
{Unsigned long T;
unsigned short d;
d = 0;
for (int i = 0; i <= (add_l_a_b-1); i + +)
{T = (unsigned long) add_a [i] + (unsigned long) add_b [i] + d;
add_c [i] = LOWORD (T);
d = HIWORD (T);}
add_c [add_l_a_b] = d;}
void sub (unsigned short sub_a [], unsigned short sub_b [], unsigned short sub_c [], int sub_l_a_b)
{Unsigned long T;
unsigned short d;
d = 0;
for (int i = 0; i <= (sub_l_a_b-1); i + +)
{T = (unsigned long) sub_a [i] - (unsigned long) sub_b [i]-d;
sub_c [i] = LOWORD (T);
if (HIWORD (T) == 0) d = 0;
else d = 1;}
sub_c [sub_l_a_b] = d;}
/ * Multiplication c = a * b * /
void mul (unsigned short mul_a [], unsigned short mul_b [], unsigned short mul_c [], int mul_l_a, int mul_l_b)
{Unsigned long T;
unsigned short d;
for (int z = 0; z <= (mul_l_a-1); z + +)
{Mul_c [z] = 0;}
for (int i = 0; i <= (mul_l_a-1); i + +)
{D = 0;
for (int j = 0; j <= (mul_l_b-1); j + +)
{T = (unsigned long) mul_c [i + j] + (unsigned long) mul_a [i] * (unsigned long) mul_b [j] + d;
mul_c [i + j] = LOWORD (T);
d = HIWORD (T);}
mul_c [i + mul_l_b] = d;}}
/ * C = (a * b) mod m * /
void mul_mod (unsigned short mm_a [], unsigned short mm_b [], unsigned short mm_n [], unsigned short mm_ost [], unsigned short w1 [], int mm_l_a_b_n, int t)
{Unsigned short * mm_d;
mm_d = new (unsigned short [mm_l_a_b_n + t]);
mul (mm_a, mm_b, mm_d, mm_l_a_b_n, t);
Div (mm_d, mm_n, w1, mm_ost, mm_l_a_b_n * 2, mm_l_a_b_n);}
/ * C = a (exp b) mod n * /
void exp_mod (unsigned short exp_mod_a [], unsigned short exp_mod_b [], unsigned short exp_mod_n [], unsigned short exp_mod_c [], unsigned short w1 [], int exp_mod_l_a_n, int exp_mod_l_b)
{Unsigned short * exp_mod_c_dop;
exp_mod_c_dop = new (unsigned short [exp_mod_l_a_n]);
int e;
for (int l = 1; l <= (exp_mod_l_a_n-1); l + +)
{Exp_mod_c [l] = 0;
exp_mod_c_dop [l] = 0;}
exp_mod_c_dop [0] = 1;
exp_mod_c [0] = 1;
for (e = (16 * exp_mod_l_b-1); e> = 0; e -)
{Mul_mod (exp_mod_c, exp_mod_c, exp_mod_n, exp_mod_c_dop, w1, exp_mod_l_a_n, exp_mod_l_a_n);
if (exp_mod_b [e/16] & (1 <<(e% 16)))
{Mul_mod (exp_mod_a, exp_mod_c_dop, exp_mod_n, exp_mod_c, w1, exp_mod_l_a_n, exp_mod_l_a_n);}
else
{For (int h = 0; h <= exp_mod_l_a_n-1; h + +)
{Exp_mod_c [h] = exp_mod_c_dop [h ];}}}}
/ * Порівняння * /
int comp (unsigned short a [], unsigned short p [], int S1)
{Int x = 1;
for (int i = 0; i! = S1; i + +)
{If (a [i]! = P [i]) x = 0;}
if (x == 0) return 1;
else return 0;}
/ * Читання з файлу * /
int file_read (unsigned short t [], long curpos, int sz)
{FILE * fp;
unsigned short k;
fp = fopen ("initial data.txt", "r");
for (int i = 0; i <sz; i + +)
{Fseek (fp, curpos, SEEK_SET);
fscanf (fp, "% x", & k);
t [i] = k;
curpos = curpos +5;}
fclose (fp);
return curpos;}
/ * Запис у файл * /
int file_write (unsigned short t [], long curpos, int sz)
{FILE * fp;
fp = fopen ("signature.txt", "w");
for (int i = 0; i <sz; i + +) fprintf (fp, "% x", t [i]);
fclose (fp);
return curpos;}
unsigned short sign [S];
int main ()
{FILE * fp1;
unsigned short p [S];
unsigned short a [S];
unsigned short q [S / 2];
unsigned short x [S / 2];
unsigned short m [S / 2];
unsigned short k [S / 2];
unsigned short y [S];
long curpos = 3;
long cp = file_read (p, curpos, S);
curpos = cp +7;
cp = file_read (a, curpos, S);
curpos = cp +7;
cp = file_read (q, curpos, S / 2);
curpos = cp +7;
cp = file_read (x, curpos, S / 2);
curpos = cp +7;
cp = file_read (m, curpos, S / 2);
curpos = cp +7;
cp = file_read (k, curpos, S / 2);
curpos = cp +7;
cp = file_read (y, curpos, S);
char symb;
int c;
printf ("----------------------------------------------- ------------- \ n ");
printf ("| Select action: | \ n");
printf ("| 1.Serial calling rountines \" Get signature \ "and \" Verify signature \ ". | \ n");
printf ("| 2.Get signature | \ n");
printf ("| 3.Verify signature | \ n");
printf ("| Press 0 to exit | \ n");
printf ("----------------------------------------------- ----------- \ n \ n ");
do
{Symb = getch ();
c = atoi (& symb);
int rs;
switch (c)
{Case 0:
return 0;
case 1:
signature (p, a, q, x, m, k, sign);
file_write (sign, 0, S);
rs = verify (p, a, q, y, m, sign);
fp1 = fopen ("verification result.txt", "w +");
if (fp1 == NULL) printf ("Error: couldn't open file");
if (rs == 0) fprintf (fp1, "Verification successful: u = r ', signature is authentic \ n");
else fprintf (fp1, "WARNING: verification unsuccessful: u! = r ', signature is non-authentic \ n");
printf ("Operations complete. Result of operation writed to \" verification result.txt \ "\ n");
fclose (fp1);
break;
case 2:
signature (p, a, q, x, m, k, sign);
file_write (sign, 0, S);
printf ("Operation complete. Result of operation writed to \" signature.txt \ "\ n");
break;
case 3:
verify (p, a, q, y, m, sign);
rs = verify (p, a, q, y, m, sign);
if (rs == 0) fprintf (fp1, "Verification successful: u = r ', signature is authentic \ n");
else fprintf (fp1, "WARNING: verification unsuccessful: u! = r ', signature is non-authentic \ n");
printf ("Operation complete. Result of operation writed to \" verification result.txt \ "\ n");
break;
default: printf ("Wrong number. Try again \ n"); break;}}
while (1);}
Function.cpp
# Include "function.h"
# Include "INTERFS.h"
void signature (unsigned short sign_p [], unsigned short sign_a [], unsigned short sign_q [], unsigned short sign_x [], unsigned short sign_m [], unsigned short sign_k [], unsigned short sign [])
{Unsigned short w [S * 2];
unsigned short res [S];
unsigned short result [S];
unsigned short tmp [S / 2];
unsigned short tmp1 [S / 2];
unsigned short sum [S +1];
unsigned short s [S +1];
exp_mod (sign_a, sign_k, sign_p, res, w, S, S / 2);
Div (res, sign_q, result, tmp, S, S / 2);
mul (sign_x, tmp, res, S / 2, S / 2);
mul (sign_k, sign_m, result, S / 2, S / 2);
add (res, result, sum, S);
Div (sum, sign_q, s, tmp1, S, S / 2);
for (int i = S/2-1, j = S-1; i> = 0; i -, j -)
{Sign [j] = tmp [i];
sign [j-16] = tmp1 [i];}}
int verify (unsigned short p [], unsigned short a [], unsigned short q [], unsigned short y [], unsigned short m [], unsigned short sign [])
{Unsigned short v [16];
unsigned short q_2 [16];
unsigned short w [S];
unsigned short s [S / 2];
unsigned short tmp [S];
unsigned short tmp_ [S];
unsigned short tmp_1 [S * 2];
unsigned short tmp_2 [S * 2];
unsigned short tmp1 [S / 2];
unsigned short z1 [S / 2];
unsigned short z2 [S / 2];
unsigned short r_ [S / 2];
for (int i = S/2-1; i> = 0; i -) q_2 [i] = q [i];
q_2 [0] = q_2 [0]-0x0002;
exp_mod (m, q_2, q, v, w, S / 2, S / 2);
for (int b = S/2-1, j = S-1; b> = 0; b -, j -)
{S [b] = sign [b];
r_ [b] = sign [j];}
mul (s, v, w, S / 2, S / 2);
Div (w, q, tmp, z1, S, S / 2);
sub (q, r_, tmp1, S / 2);
mul (tmp1, v, w, S / 2, S / 2);
Div (w, q, tmp, z2, S, S / 2);
exp_mod (a, z1, p, tmp, w, S, S / 2);
exp_mod (y, z2, p, tmp_, w, S, S / 2);
mul (tmp, tmp_, tmp_1, S, S);
Div (tmp_1, p, tmp_2, tmp, S * 2, S);
Div (tmp, q, tmp_, s, S, S / 2);
return comp (s, r_, S / 2);}
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
27.9кб. | скачати


Схожі роботи:
Застосування електронного цифрового підпису
Поняття електронно-цифрового підпису
Правові основи використання електронного цифрового підпису в цивіл
Правові основи використання електронного цифрового підпису в цивіл
Проблеми документаційного забезпечення управління та використання електронного цифрового підпису
Правові основи використання електронного цифрового підпису в цивільному обігу
Знаходження мінімального остовом дерева Порівняння алгоритму Прима і алгоритму Крускала
Облікова ставка НБУ в 1994-98 рр
Система сертифікації ГОСТ Р
© Усі права захищені
написати до нас