Формування цифрового підпису згідно стандарту DSS

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2006
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Інші
Група:
КСМ

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” Кафедра ЕОМ Звіт з лабораторної роботи №2 Формування цифрового підпису згідно стандарту DSS Мета роботи: реалізувати демонстраційну програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS. Теоретичні відомості Відправник і отримувач електронного документа використовують при обчисленні великі цілі числа:  і  – прості числа,  біт кожне ;  – просте число довжиною 160 розрядів (дільник числа). Числа , ,  є відкритими і можуть бути спільними для всіх користувачів мережі. Відправник вибирає випадкове ціле число (). Число  – секретний ключ відправника для формування електронного цифрового підпису. Наступним кроком відправник обчислює значення . Число  – відкритий ключ для перевірки підпису відправника. Це число передається всім отримувачам документів. Для того, щоб підписати документ , відправник хешує його в ціле хеш-значення : , після цього відправник генерує випадкове ціле число  при умові, що , і обчислює число : . Обчисливши число  відправник обчислює за допомогою секретного ключа  ціле число : . Пара чисел  і  утворюють цифровий підпис  під документом . Таким чином, підписане повідомлення складається з трьох чисел . Отримувач підписаного повідомлення  перевіряє виконання умов ,  і відкидає підпис, якщо хоча б одна з умов не виконується. Потім отримувач обчислює значення , хеш-значення  і числа Після цього отримувач за допомогою відкритого ключа  обчислює значення  і перевіряє виконання умови . Якщо умова  виконується, тоді підпис  під документом  визнається отримувачем як справжній. Можна строго математично довести , що рівність  буде виконуватися тоді і тільки тоді, коли підпис  під документом  отриманий за допомогою того секретного ключа , з якого був обчислений відкритий ключ . Таким чином, можна твердо переконатися , що відправник повідомлення володіє даним секретним ключом  (не розкриваючи при цьому значення ключа ) і що відправник підписав даний документ . Лістинг програми # include <stdio.h> # include <conio.h> # include <math.h> # include <stdlib.h> int N=200;char text[200];unsigned short h[4];unsigned long h_e;int text_l;unsigned long p;unsigned long q;unsigned long g;unsigned long k_ a;unsigned long x;unsigned long r;unsigned long s;unsigned long y;int h_g;long easy[10000];int E=10000; void take_string(void){int i; printf("Please write string to signature.\n"); scanf("%s",text);for(i=0;i<N;i++)if(text[i]!='\0') text_l++;else i=N; } void take_H (void){ int i; int j; if((text_l%4)!=0){i=4-(text_l%4);for(j=text_l;j<text_l+i;j++) text[j]=0;text[j]='\0';} for(i=0;i<4;i++)for(j=0;j<text_l;j+=4){h[i]=h[i]^text[j+i];} h_e=(unsigned long)h[0]<<24|(unsigned long)h[1]<<16|(unsigned long)h[2]<<8|(unsigned long)h[3];} void take_p_q(void){ int i=1; int j=0; int l=0; int k; int lable; int r; for(;(i<4294000000)&&(j<E);i++){lable=1;for(k=2;k<=(int)sqrt((double)i);k++){if((i%k)==0) { k=(int)sqrt(i)+1;lable=0;}} if(lable){ easy[j++]=i;}}l=j; r = (int) ((float)(5000) * (float)rand() / (float)RAND_MAX)+200; p=easy[r]; k=p-1; for(i=r-1;i>=0;i--){ if((k%easy[i])==0) {q=easy[i];i=-1;}}j=(p-1)/q; h_g = (int) ((float)(10) * (float)rand() / (float)RAND_MAX)+1; g=((int)(pow((double)h_g,(double)j)))%p; p=8039; q=4019; h_g=5; g=25; k_a=25; x=12; y = (unsigned long )pow(g,x )% p ;} void take_key(void){ r = (g*k_a % p) % q; s = ( (unsigned long )((double)(1.0/(double)k_a) *(double)(h_e + x*r)) ) % q;printf("%X %X\n",r,s);} void test(void){ouble w;unsigned long u1;unsigned long u2;unsigned long v;w = (unsigned long)((double)(1.0/(double)s) )% q; u1 =(unsigned long) ((double) h_e* w ) % q;u2 = (unsigned long)((double)r* w ) % q;v = ((unsigned long) (pow(g,u1)*s* pow(y,u2)) % p ) % q; printf("%X %X %X %X %X\n",v,r,w,u1,u2); void main(void){srand( (unsigned)time( NULL ) );take_string();take_H();take_p_q(); take_key();printf("Program working.\n");} Результати роботи програми  Висновок: в результаті виконання лабораторной роботи я реалізувала демонстраційну програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS.
Антиботан аватар за замовчуванням

31.03.2013 15:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!