Calculul valorilor hash folosind functiile hash criptografice MD5, SHA1, SHA2

Pentru a intelege aplicatiile problemei coliziunilor (zilei de nastere) din Cursul 8, la atacul asupra functiilor hash criptografice, ilustram in acest notebook valorile acestor functii pe diferite blocuri de date.

Python pune la dispozitie modulul hashlib care contine functiile ce genereaza valorile hash ale unor blocuri de date prin functiile hash criptografice MD5, SHA1, SHA2.

  • MD5 este o functie hash cu valori in multimea stringurilor de 128 de biti, $\{0,1\}^{128}$.

  • SHA1 ia valori in $\{0,1\}^{160}$.

  • SHA2 consta din mai multe functii hash, cu valori pe $224, 256, 384, 512$ biti.

Pentru a ilustra ca blocuri de date de lungimi diferite sunt aplicate de o functie hash intr-un string avand acelasi numar fixat de biti, calculam mai intai valoarea hash prin MD5 a blocului de date 'anul1CTI@yahoogroups.com' si apoi a blocului mai lung, 'anul1CTI@yahoo.com grupul anului 1':


In [7]:
import hashlib
mes = hashlib.md5()#declara mes ca un obiect hash vid
mes.update('anul1CTI@yahoogroups.com')# se updateaza obiectul hash prin concatenarea unui string
s=mes.hexdigest()

print 'valoarea hash in hexa prin MD5 a adresei email este', s
print 'lungimea in biti a valorii hash este:', len(s)*4


valoarea hash in hexa prin MD5 a adresei email este 1b241c539d702b32db9c61d45984d602
lungimea in biti a valorii hash este: 128

Concatenam acum la adresa email, stringul ' grupul anului 1' si afisam valoarea hash corespunzatoare si lungimea ei in biti:


In [8]:
mes.update(' grupul anului 1')
sn=mes.hexdigest()
print 'valoarea hash in hexa prin MD5 a adresei email la care s-a concatenat un string este', sn
print 'lungimea in biti a noii  valorii hash este:', len(sn)*4


valoarea hash in hexa prin MD5 a adresei email la care s-a concatenat un string este 67ede7eb4bf93b7459c9e483788d8bbb
lungimea in biti a noii  valorii hash este: 128

Sa experimentam acum in acelasi mod functia hash SHA1:


In [9]:
m1=hashlib.sha1('anul1CTI@yahoogroups.com')
s1=m1.hexdigest()

print 'valoarea hash in hexa prin SHA1 a adresei email este', s1
print 'lungimea in biti a valorii hash este:', len(s1)*4


valoarea hash in hexa prin SHA1 a adresei email este 6676aa692b16698b50f3e72f0c335b452fd9b828
lungimea in biti a valorii hash este: 160

In [10]:
m1.update(' grupul anului 1')
s1n=m1.hexdigest()
print 'valoarea hash in hexa prin SHA1 a adresei email la care s-a concatenat un string este', s1n
print 'lungimea in biti a noii  valorii hash este:', len(s1n)*4


valoarea hash in hexa prin SHA1 a adresei email la care s-a concatenat un string este fd97c85f53695bb79a13ec3e48bac5adb19e1928
lungimea in biti a noii  valorii hash este: 160

Exemplu folosind SHA2:


In [11]:
mesaj=hashlib.sha256('Contul meu secret dintr-un paradis financiar este 6421 1345 2974 6852')
valh=mesaj.hexdigest()
print 'Valoarea hash prin SHA2 pe 256 biti este:', valh
print 'lungimea in biti a valorii hash:', len(valh)*4


Valoarea hash prin SHA2 pe 256 biti este: f64648d5b106e7705b8ecfdad65e10b6f4269387757ccce8535bcb22ed7e828f
lungimea in biti a valorii hash: 256

In [12]:
from IPython.core.display import HTML
def  css_styling():
    styles = open("./styles/custom.css", "r").read()
    return HTML(styles)
css_styling()


Out[12]: