МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
Звіт з лабораторної роботи №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.