Hash funksionet

**Hash Funksionet** janë funksione matematikore që përdoren për enkodimin e shënimeve në Kompjuterikë. Këto funksione(alogritme) për dallim nga algoritmet për enkriptim, nuk kanë çelës për enkriptim e as për dekriptim. Hash Funksionet mund të themi se janë si rezultat i problemit që ishte me nënshkrimet digjitale. Problemi ishte se për një dokument shumë të gjatë, nënshkrimi duhet të ishte shumë i gjatë. Por me Hash Funksionet ky problem është zgjidhur sepse përmes tyre(Hash Funksioneve), për çfarëdo teksti që merret si hyrje për *Hash Algoritmet*(sinonim për Hash Funksion), rezultati është fiks. Përveç te nënshkrimet digjitale, Hash Funksionet përdoren shumë edhe në fusha tjera të Kriptografisë.

## *Hash Funksionet në praktikë*
Një shembull i përdorimit të Hash Funksioneve është që të veriikohet përmbajtja e një dokumenti i gjindet Hash-i dhe krahasohet me Hash-in e tij. Kjo përdoret te protokolli **TCP** me Checksum, ku gjindet Hash Vlera e mesazhit që do të dërgohet përmes Hash Funksioneve, dhe pranuesi e verifikon përmbajtjen duke e gjetur Hash Funksionin e mesazhit të pranuar. Nëse nuk janë të njëjtë, kjo nënkupton se ka pasur gabime në transmetim, nëse Hash vlerat janë të njëjta, kjo nënkupton se mesazhi i pranuar është i saktë.

## *Çka janë Hash Funksionet*

Hash Funksionet mund t'i kuptojmë përmes vetive të tyre. Ato (Hash Funksionet) janë:

* Jo reverzibile
:Kjo nënkupton se nuk ekziston inverzi i tyre, pra janë funksione njëkahore.

* Collision Resistant
:Kjo veti e tyre nënkupton se për dy hyrje të ndryshme, nuk do të duhej që të jetë dalja e njëjtë. Pra, Për M dhe M‘ => H(M) != H(M‘).

* Dalje Fikse
:Për çfarëdo gjatësie të mesazhit, dokumentit, apo në përgjithësi tekstit, si dalje fitohet një tekst me gjatësi 16, 20, … bajt varësisht nga lloji i Hash Funksionit.

## *Parimi i funksionimit të Hash Funksioneve*

Një skemë e thjeshtë e funksionimit të Hash Funksioneve është paraqitur më poshtë:

Hash Algoritmi

## *Llojet e Hash Funksioneve*

Disa nga llojet e Hash Funksioneve janë SHA-1, MD5, etj.

### *MD5(Message Digest versioni i 5-të)*
Message Digest (MD) versioni 5 është dizajnuar nga Ron Rivest (MIT). Ka si rezultat hash-n 128-bitësh. MD5 i plotëson të 2 kushtet e funksioneve njëkahëshe?!?!

#### *Si funksionon?*
MD5  i ndan mesazhet në blloqe 512-bitëshe. Pra, dalja është bashkim i 4 blloqeve 32 bitëshe(4*32=128)
Si hyrje merr mesazhin me gjatësi që është shumëfish i 512, e nëse nuk është i tillë, e bën mbushjen e tij - padding. Ekzistojnë disa mënyra për të mbushur boshllëkun:

*Bit padding, ku biti i parë që shtohet bëhet 1, ndërsa tjerët që shtohen janë 0
*Zero padding, ku të gjithë bitat e padding bëhen 0. kjo metodë nuk është e standardizuar për enkriptim.

MD5 i ka 4 variabla fillestare: A, B, C, D secila 32-bitëshe. Ka 4 Funksione me hyrje (3 x 32) bitëshe dhe një dalje 32-bitëshe:
– F(X, Y, Z) = (X^Y) v ((¬X)^Z)
– G(X, Y, Z) = (X^Y) v (Y ^(¬Z))
– H(X, Y, Z) = X xor Y xor Z
– I(X, Y, Z) = Y xor (X v (¬Z))

Kryhen gjithsej 4 operacione: FF,GG,HH,II. Këto funksione janë jo-lineare.

*Me gjithë këto, MD5 nuk është i sigurtë që nga 2008, kur ka ndodhur një rast që e bën MD5 që ta thejë parimin e Collision Resistant.*

### *SHA-1(Secure Hash Algorithm 1)*
Secure Hash Algorithm 1 është dizajnuar nga NSA.

#### *Si funksionon?*
SHA-1 si rezultat jep hash-in 160-bitësh, për dallim nga MD5 që ka hash-in 128-bitësh. Padding e bën në blloqe 512-bitëshe(njëjtë me MD5). Ka 4 runde me 20 operacione(MD5 ka 4 runde me 16 operacione).
SHA-1 funksionet jolineare:
– F
t(X,Y,Z)=(X^Y) v ((¬X)^Z) ; 0
**(I)**Hash Funksionet nuk kanë çelës.

**(II)**Parimet kryesore për Hash Funksione janë:
:#Të jenë njëkahore
:#Janë Collision Resistant(shiko më lart vetitë e Hash Funksioneve)

**(III)**Hash funksionet duhet të kenë daljen së paku 160-bit të gjatë në mënyrë që t'i mbijetojnë Sulmeve të Collision. Për siguri afatgjatë preferohet dalje 256-bitëshe.

## Referimet
## Lidhje të jashtme 
* Understanding Cryptography
* Cryptool
* Agjencia Shtetërore për Mbrojtjen e të Dhënave Personale 
* National Security Agency