Professional Documents
Culture Documents
S.I.P.C
Lucrare de laborator 7
Tema : Algoritmul pentru semnturi digitale - DSA
a efectuat :
st.gr. TI-071 Chian O.
a verificat : l.s. Potaru A.
Chiinu 2010
Cuprins
Cuprins..................................................................................................................................................3
1 Algoritm pentru semnaturi digitale...................................................................................................4
Generarea cheii.................................................................................................................................4
Semnare............................................................................................................................................4
Verificarea .......................................................................................................................................4
Corectitudine.....................................................................................................................................5
Securitate..........................................................................................................................................5
Implementarea algorimului DSA.........................................................................................................6
Concluzie..............................................................................................................................................8
Bibliografie...........................................................................................................................................9
Anexa A codul surs...........................................................................................................................10
Generarea cheii
1. Se alege q, astfel nct el este prim i are o dimensiune de 160 de bii (2159 < q < 2160).
2. Se alege p, astfel nct el este prim i p = 2qz+1 (2512 < p < 21024).
a. Ultimele reglementri specific faptul c p ar trebui s fie pe fix 1024 de bii, ceea
ce nseamn c z trebuie s fie pe 864 de bii.
3. Se alege
4.
5. Se alege arbitrar
, unde
6. Se calculeaz
Semnare
1. Se alege arbitrar
.
2. Se calculeaz x=SHA-1(mesaj), cu x pe 160 de bii; SHA-1 este funcia de hash, care
realizeaz rezumatul mesajului (returneaz un numr n funcie de coninutul mesajului).
3. Se calculeaz
4. Se calculeaz
.
a. Dac vreuna dintre cele dou valori ( sau ) este egal cu zero, atunci se reia
calculul cu generarea unui alt k.
5. Cheia de semnare este
Verificarea
1. Se calculeaz
2. Se calculeaz
.
.
4
3. Se calculeaz
4. Se calculeaz
5. Semntura este valid dac i numai dac
.
.
Corectitudine
Algoritmul este corect n sensul c destinatarul va accepta ntotdeauna doar semnturi originale.
Acest lucru poate fi demonstrat dup cum urmeaz:
Din
rezult
Deoarece
Expeditorul calculeaz
Deci
Securitate
Acest algoritm este considerat imposibil de spart, datorit siguranei mari asigurate de cteva
puncte, cum ar fi generarea aleatoare a lui p, q, a i k. Pentru a se afla k, de exemplu, ar trebui rezolvat o
problem de tipul logaritmilor discrei, care este o problem "dificil", n sensul c ajungerea la o soluie
poate dura cteva luni.
TForm1
(f rom C++ Rev erse Engineered)
MessageBoxSignMemo : TMemo *
MessageBoxVerifyMemo : TMemo *
PublicKeyMemo : TMemo *
PrivateKeyMemo : TMemo *
GenKeyBtn : TButton *
qpnParamMemo : TMemo *
SignatureMemo : TMemo *
SendBtn : TButton *
SignBtn : TButton *
ValidateBtn : TButton *
HashSignMemo : TMemo *
HashVerifyMemo : TMemo *
+p_com
<<struct>>
p_parameters
int p
int q
int n
+semn
GenKeyBtnClick()
SignBtnClick()
ValidateBtnClick()
SendBtnClick()
putere()
putere1()
Hash()
TForm1()
<<struct>>
Signature
int r
int s
Concluzie
n urma efecturii lucrrii de laborator am studiat algoritmul de semnare digital a mesajelor DSA. Am studiat cele trei faze prin care trece algoritmul i am realizat aplicaia care implementeaz
algorimul dat. Pot spune c spargerea acestui algorim ar duce la rezolvarea unei probleme de tipul
logaritmilor discrei care este foarte dificil.
Bibliografie
1. Algoritm pentru Semnturi Digitale - http://ro.wikipedia.org/wiki/DSA
2. Jeffrey Walton - Cryptographic Interoperability: Digital Signatures http://www.codeproject.com/KB/security/CryptoInteropSign.aspx
10
}
//--------------------------------------------------------------------------int TForm1::putere1(m,d,n){
int i;
if(d==-1){
for(i=1;i<=n;i++)
if((i*m)%n==1) return i;
}
return -1;
}
//--------------------------------------------------------------------------void __fastcall TForm1::SignBtnClick(TObject *Sender)
{
int k,r,s,k1;
int h,c,i;
h=1;
for(i=1;i<=MessageBoxSignMemo->Text.Length();i++)
11
c=MessageBoxSignMemo->Text.operator [](i);
h=Hash(c,h);
}
HashSignMemo->Text=h;
a:
k=random(p_com.q);
if(k==0) goto a;
r=putere(p_com.g,k,p_com.p)%p_com.q;
k1=putere1(k,-1,p_com.q);
if(k1==-1) ShowMessage("In algoritm sunt baguri!");
s=((h+kpriv*r)*k1)%p_com.q;
if((r==0)||(s==0)) goto a;
semn.r=r;
semn.s=s;
SignatureMemo->Text="(r,s)=(";
SignatureMemo->Text=SignatureMemo->Text+semn.r+",";
SignatureMemo->Text=SignatureMemo->Text+semn.s+")";
}
//--------------------------------------------------------------------------void __fastcall TForm1::ValidateBtnClick(TObject *Sender)
{
int w,u1,u2,v;
int h,c,i;
h=1;
for(i=1;i<=MessageBoxVerifyMemo->Text.Length();i++)
{
c=MessageBoxVerifyMemo->Text.operator [](i);
h=Hash(c,h);
}
HashVerifyMemo->Text=h;
w=putere1(semn.s,-1,p_com.q)%p_com.q;
u1=(h*w)%p_com.q;
u2=(w*semn.r)%p_com.q;
v=((putere(p_com.g,u1,p_com.p)*putere(kpub,u2,p_com.p))%p_com.p)%p_com.q;
if(v==semn.r)
{
Label10->Caption="The message is valid";
Label10->Font->Color=clBlue;
}
else
{
Label10->Caption="The message is invalid" ;
Label10->Font->Color=clRed;
}
}
//--------------------------------------------------------------------------int TForm1::Hash(int c,int h)
{
return putere(c,h,30711);
}
void __fastcall TForm1::SendBtnClick(TObject *Sender)
{
int i;
MessageBoxVerifyMemo->Clear();
for(i=1;i<=MessageBoxSignMemo->Text.Length();i++)
MessageBoxVerifyMemo->Text=MessageBoxVerifyMemo->Text+MessageBoxSignMemo>Text.operator [](i);
}
//---------------------------------------------------------------------------
12