МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
Звіт з лабораторної роботи №2
Формування цифрового підпису згідно стандарту DSS
Виконала: ст. гр. КСМ-5
Львів – 2006
Мета роботи: реалізувати демонстраційну програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS.
Теоретичні відомості
Відправник і отримувач електронного документа використовують при обчисленні великі цілі числа: EMBED Equation.3 і EMBED Equation.3 – прості числа, EMBED Equation.3 біт кожне EMBED Equation.3 ; EMBED Equation.3 – просте число довжиною 160 розрядів (дільник числа EMBED Equation.3 ). Числа EMBED Equation.3 , EMBED Equation.3 , EMBED Equation.3 є відкритими і можуть бути спільними для всіх користувачів мережі.
Відправник вибирає випадкове ціле число EMBED Equation.3 ( EMBED Equation.3 ). Число EMBED Equation.3 – секретний ключ відправника для формування електронного цифрового підпису.
Наступним кроком відправник обчислює значення
EMBED Equation.3 .
Число EMBED Equation.3 – відкритий ключ для перевірки підпису відправника. Це число передається всім отримувачам документів.
Для того, щоб підписати документ EMBED Equation.3 , відправник хешує його в ціле хеш-значення EMBED Equation.3 :
EMBED Equation.3 ,
після цього відправник генерує випадкове ціле число EMBED Equation.3 при умові, що EMBED Equation.3 , і обчислює число EMBED Equation.3 :
EMBED Equation.3 .
Обчисливши число EMBED Equation.3 відправник обчислює за допомогою секретного ключа EMBED Equation.3 ціле число EMBED Equation.3 :
EMBED Equation.3 .
Пара чисел EMBED Equation.3 і EMBED Equation.3 утворюють цифровий підпис
EMBED Equation.3
під документом EMBED Equation.3 .
Таким чином, підписане повідомлення складається з трьох чисел EMBED Equation.3 .
Отримувач підписаного повідомлення EMBED Equation.3 перевіряє виконання умов
EMBED Equation.3 , EMBED Equation.3
і відкидає підпис, якщо хоча б одна з умов не виконується.
Потім отримувач обчислює значення
EMBED Equation.3 ,
хеш-значення
EMBED Equation.3
і числа
EMBED Equation.3
Після цього отримувач за допомогою відкритого ключа EMBED Equation.3 обчислює значення
EMBED Equation.3
і перевіряє виконання умови
EMBED Equation.3 .
Якщо умова EMBED Equation.3 виконується, тоді підпис EMBED Equation.3 під документом EMBED Equation.3 визнається отримувачем як справжній.
Можна строго математично довести , що рівність EMBED Equation.3 буде виконуватися тоді і тільки тоді, коли підпис EMBED Equation.3 під документом EMBED Equation.3 отриманий за допомогою того секретного ключа EMBED Equation.3 , з якого був обчислений відкритий ключ EMBED Equation.3 . Таким чином, можна твердо переконатися , що відправник повідомлення володіє даним секретним ключом EMBED Equation.3 (не розкриваючи при цьому значення ключа EMBED Equation.3 ) і що відправник підписав даний документ EMBED Equation.3 .
Лістинг програми
# 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.