0% found this document useful (0 votes)
153 views

VHDL Realisation of SHA-256 Algorithm

VHDL implementation of a SHA-256 IP core, with defined input, output, theory background, VHDL code and simulation results
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
153 views

VHDL Realisation of SHA-256 Algorithm

VHDL implementation of a SHA-256 IP core, with defined input, output, theory background, VHDL code and simulation results
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 59

Univerzitet u Beogradu

Elektrotehnički fakultet

Aleksandar Žujović, 319/2010

VHDL realizacija kriptografskog algoritma


SHA–256
diplomski rad

mentor:
doc. dr Jelena Popović-Božović

Beograd, jul 2014.


Sažetak

U ovom radu predstavljena je ideja realizacije kriptografskog SHA-256 alo-


ritma pisana u VHDL (VHSIC Hardware Description Language) jeziku i
rezultati simulacija osmišljenog sistema. Pored toga, opisani su algoritmi za
sažimanje, odnosno hash algoritmi SHA-1 i SHA-256 (Secure Hashing Algo-
rithm). Glavna ideja kod ovih algoritama je da na osnovu ulaza tj.poruke,
koja može biti proizvoljne dužine, napravi izlaz konstante dužine, odnosno
sažetak poruke ili hash poruke, pri čemu se u slučaju promene makar jednog
bita ulazne poruke novodobijeni hash u potpunosti razlikuje od onog koji se
dobija za ispravnu poruku. Ovi algoritmi se koriste u verifikaciji transakcija,
softverskih paketa kod nekih Linux operativnih sistema, kod nekih kripto-
valuta (npr.bitcoin) u okviru njihovih Proof-of-Work šema. . . Prikazano je i
komentarisano poređenje u pogledu efikasnosti i kompleksonsti ovih algori-
tama.

Ključne reči: Kriptografski algoritmi, hash funkcije, SHA-1, SHA-2,


VHDL
Sadržaj

1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Hash algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1 Kriptografski hash algoritmi . . . . . . . . . . . . . . . . . . . 6
2.2 Uvod u SHA funkcije . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 SHA-256 algoritam . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Pregled algoritma . . . . . . . . . . . . . . . . . . . . . 11
2.3.2 Opis algoritma . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Poređenje SHA-1 i SHA-256 . . . . . . . . . . . . . . . . . . . 17

3 Realizacija SHA-256 algoritma . . . . . . . . . . . . . . . . . . 20


3.1 VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Softverski paket . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 Realizacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3.1 Modul ConstantsROM . . . . . . . . . . . . . . . . . . 23
3.3.2 Modul Counter64 . . . . . . . . . . . . . . . . . . . . . 23
3.3.3 Modul MainLoop . . . . . . . . . . . . . . . . . . . . . 24
3.3.4 Top Module SHA256 . . . . . . . . . . . . . . . . . . . 24

4 Simulacije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.1 Modul Constants ROM . . . . . . . . . . . . . . . . . . . . . . 28
4.2 Modul Counter64 . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Modul MainLoop . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.4 Top Module SHA256 . . . . . . . . . . . . . . . . . . . . . . . 31
4.4.1 Simulacija obrade 1 bloka poruke . . . . . . . . . . . . 31
4.4.2 Simulacija obrade 2 bloka poruke . . . . . . . . . . . . 35

1
5 Zaključak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Prilog - Izvorni kôd . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

2
Slike

2.1 Prikaz pripremanja poruke . . . . . . . . . . . . . . . . . . . . 11


2.2 Dijagram pripremanja reda poruka Wj . . . . . . . . . . . . . 14
2.3 Slikoviti prikaz izvršavanja j-te iteracije funkcije kompresije. . 16

3.1 Blok šema sistema . . . . . . . . . . . . . . . . . . . . . . . . 22


3.2 Dijagram stanja FSM, modul SHA256 . . . . . . . . . . . . . 25

4.1 Vremenski dijagram: simulacija ConstantsROM modula . . . . 28


4.2 Vremenski dijagram: brojač dostiže vrednost 15 . . . . . . . . 29
4.3 Vremenski dijagram: završeno brojanje brojača . . . . . . . . . 29
4.4 Vremenski dijagram: simulacija ROM-a povezanog na brojač . 30
4.5 Vremenski dijagram: simulacija modula MainLoop . . . . . . . 30
4.6 Vremenski dijagram: simulacija modula SHA256 - početak ob-
rade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.7 Vremenski dijagram: simulacija modula SHA256 - učitan prvi
blok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.8 Vremenski dijagram: simulacija modula SHA256 - kraj obrade 34
4.9 Vremenski dijagram: simulacija modula SHA256 - kraj obrade
prvog bloka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.10 Vremenski dijagram: simulacija modula SHA256 - kraj obrade
drugog bloka . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3
Tabele

2.1 Pregled SHA funkcija . . . . . . . . . . . . . . . . . . . . . . . 11


2.2 Notacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Inicijalne vrednosti međurezultata . . . . . . . . . . . . . . . . 13
2.4 Korišćene konstante . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Logičke funkcije . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Proširena poruka „abc” . . . . . . . . . . . . . . . . . . . . . . 16
2.7 Proširena poruka „acb” . . . . . . . . . . . . . . . . . . . . . . 17

3.1 Portovi modula ConstantsROM . . . . . . . . . . . . . . . . . 23


3.2 Portovi modula Counter64 . . . . . . . . . . . . . . . . . . . . 24
3.3 Portovi modula MainLoop . . . . . . . . . . . . . . . . . . . . 24
3.4 Portovi modula SHA256 . . . . . . . . . . . . . . . . . . . . . 27

4.1 Vrednosti a, b, ..., h u prvim iteracijama glavne petlje . . . . . 31


4.2 Vrednosti a, b, ..., h u iteracijama 14–17 glavne petlje . . . . . 34
4.3 Proširena poruka „abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlm-
nomnopnopq” . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.4 Vrednosti a, b, ..., h na početku obrade drugog bloka poruke
„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq” 37

4
Glava 1

Uvod

Zbog naglog razvoja informacionih i komunikacionih tehnologija tokom


poslednjih decenija, današnje društvo se svakodnevno oslanja u sve većoj
meri na vidove moderne komunikacije i razmene podataka kao što su mo-
bilna telefonija i internet servisi. Internet se rasprostire u sve većoj meri oko
nas, počevši od PC računara, notebook i netbook računara, pa čak i moblinih
telefona pogotovu tokom poslednjih godina za vreme revolucije smartphone
telefona. Vidovi komunikacije obuhvataju glasovne i video pozive, SMS i
MMS poruke, elektronsku poštu, i kao takvi, podaci koje razmenjujemo ko-
risteći globalnu mrežu, tj. Internet, često su privatni i spadaju u domen
poverljivih informacija. Zbog toga se javlja potreba za pronalaženjem ade-
kvatnog načina za zaštitu ovih podataka. Kriptografija, kao nauka koja se
bavi mnogim aspektima zaštite informacija, predstavlja pogodno rešenje.
Od postanka i početka korišćenja kriptografije, ona se smatrala umetno-
šću tajnog pisanja, odnosno skrivanja prave poruke u naizgled nerazumnom
tekstu, tako da je samo odgovarajući pojedinci mogu pročitati. Međutim sa
naglim razvojem informacionih i komunikacionih tehnologija i kriptografija je
evoluirala u višedisciplinarnu nauku zaštite podataka. U ovom radu pažnja
je posvećena kriptografskim hash algoritmima, osobito SHA-1 i SHA-256.

5
Glava 2

Hash algoritmi

Uopšteno, hash funkcija je bilo koja funkcija koja mapira podatke pro-
izvoljne veličine u podatke fiksne veličine. Vrednost koju vraćaju funkcije,
odnosno ti izlazni podaci zovu se često sažetak poruke, hash poruke, hash
suma, hash vrednost ili samo hash. Hash može da služi kao referenca na
originalni podatak. Uopštene hash funkcije ne moraju biti sigurne, čak po-
stoji zahtev da hash funkcija mapira slične ulazne vrednosti u slične izlazne
vrednosti, što je kontradiktorno sa osnovnim zahtevom kriptografskih i si-
gurnih/bezbednih hash funkcija.

2.1 Kriptografski hash algoritmi


Kao što je rečeno ranije, osnovna osobina bilo koje hash funkcije je da
od ulazne poruke promenljive dužine napravi izlaz, tj. hash, fiksne dužine.
Sažetak poruke, ili hash, predstavlja jedinstveni komprimovani prikaz date
poruke. Za razliku od njih, kriptografska hash funkcija mora da ispunjava
i neke dodatne zahteve. Osnovni zahtevi kriptografskih hash funkcija mora
da ispunjava su:

• Funkcija mora biti deterministička, odnosno za dati ulaz funkcija mora


praviti uvek isti hash

• Funkcija bi trebalo da je što više uniformna u svom opsegu izlaznih


vrednosti

6
• Preimage otpornost, funkcija treba da bude ireverzibilna

• Second preimage otpornost

• Collision otpornost
Ova svojstva između ostalog podrazumevaju da ulazni podaci ne mogu
biti modifikovani a da se pri tome ne promeni hash vrednost poruke. Dakle,
ako dve poruke imaju isti hash sa velikom pouzdanošću možemo pretpostaviti
da su one iste. To podrazumeva da hash funkcija bude u velikoj meri otporna
na koliziju (collision resistant), što znači da treba da bude neizvodljivo naći
više različitih podataka koji generišu isti hash. Otpornost na koliziju delom
se postiže generisanjem velikih hash vrednosti, npr. SHA-1 generiše hash
dužine 160 bita dok SHA-256 generiše hash dužine 256 bita. Kriptografske
hash funkcije moraju biti što otpornije na napade na integritet podataka.
Neke vrste „napada” na kriptografske hash funkcije su:
• Pre-image napad, predstavlja napad kome je cilj da pronađe poruku
koja ima određenu hash vrednost. Definišu se dve otpornosti na ovaj
napad: preimage resistance i second preimage resistance. Preimage
resistance se ogleda u tome da je za gotovo svaki predodređen izlaz,
računski neizvodljivo naći ulaz koji, primenom hash funkcije, rezultuje
istim hash-om. Drugim rečima, ako nam je poznat hash h neke poruke,
neizvodljivo je naći originalnu poruku x takvu da je h = hash(x). Zbog
postojanja kolizije podataka, definiše se i second preimage resistance što
označava da je računski neizvodjivo naći poruku različitu od originalne
poruke ali takvu da je njen hash isti kao i hash originalne poruke.

• Collision napad, ili sudar, je napad koji pokušava da pronađe dve ula-
zne vrednosti koje daju isti hash. Za razliku od Pre-image napada, kod
collision napada hash nije specificiran.

• Man-in-the-middle napad, je vrsta napada kada napadač „prisluškuje”


razmenu podataka između pojedinih žrtvi. Žrtve su ubeđene da komu-
niciraju direktno, dok zapravo napadač posreduje u njihovoj komuni-
kaciji tako što presreće svaku poruku, odnosno niz poruka, menja ih i
prosleđuje dalje.

7
• Birthday attack je napad koji je baziran na matematičkom problemu
Birthday problem ili Bithday paradox po čemu je i imenovan.

• Brute-force napad, je vrsta napada koja se, u teoriji, može koristiti pro-
tiv bilo kog enkriptovanog podatka. Često se koristi kada je nemoguće
iskoristiti neke slabosti enkripcionog algoritma. Ovaj napad je zapravo
isprobavanje svih mogućih kombinacija kod pogađanja šifre ili ključa, i
njegovo izvršavanje mnogo zavisi od dužine pogađane šifre

• Rainbow table je tabela za „inverziju” hash funkcije, obično za razbi-


janje hash vrednosti šifri. Ove tabele se koriste za pronalaženje šifre
određene dužine i ograničenog seta karaktera u obliku čitljivog teksta.
Koristi manje procesorskog vremena od Brute-force napada, ali više
memorijskih resursa. Vrednosti u tabeli su zapravo hash vrednosti svih
šifri određenih setom karaktera i dužinom šifre.

Postoji veliki broj kriptografskih hash algoritama. Najčešće korišćene hash


funkcije pripadaju familijama MD (Message Digest), RIPEMD (RACE In-
tegrity Primitives Evaluation Message Digest) i SHA Secure Hash Algorithm
algoritama, ali postoje i drugi. Neki od najčešće koriščenih hash algoritama
su:

• MD4, MD5, razvio ih je Ron Rivest 1990 tj. 1994 godine

• SHA-0, SHA-1, razvila ih je NSA (National Security Agency) 1993 tj.


1995 godine

• RIPEMD-160, 1996 godine

• SHA-2 familija, koja obuhvata SHA-224, SHA-256, SHA-385 i SHA-512


algoritme, 2002 godine

• Whirlpool

• Tiger

• GOST-3411

8
• SHA-3

• ...

Ovi algoritmi nalaze svoje mesto u raznim primenama. Verifikacija inte-


griteta fajlova ili poruka se svodi na proveru da li je fajl, odnosno poruka,
promenjena u toku prenosa. Ova provera se može vršiti npr. poređenjem
hash-a fajla pre i posle slanja. Nekad se hash vrednosti postavljaju na web
sajtove ili forume kako bi se dozvolila verifikacija. Još jedna primena ovih
algoritama je verifikacija šifri. Čuvanje šifri u obliku čitljivog teksta može
rezultovati velikim sigurnosnim probojem ukoliko taj fajl padne u pogrešne
ruke. Stoga se kao jedno od rešenja nameće čuvanje samo hash vrednosti
svake šifre. Tada se provera izvršava na sledeći način: šifra koju korisnik
unosi se obrađuje pogodnom hash funkcijom i zatim se dobijeni hash poredi
sa sačuvanim hash-om. Mana ovog pristupa je to što zaboravljena šifra ne
može biti povraćena, obzirom da su hash funkcije ireverzibilne.
Jedna od zanimljivijih primena hash algoritama, tačnije SHA-256 algoritma,
je kod verifikacije transakcija kod kriptovalute Bitcoin. Transakcije su digi-
talno potpisani (digital signature) zapisi koji prebacuju vlasništvo Bitcoin-a
na nove adrese. Transakcije imaju ulaze, zapisi koji referenciraju sredstva
od prethodnih transakcija, i izlaze, zapisi koji određuju novog vlasnika pre-
nošenog Bitcoin-a koji će biti smatran kao ulaz u budućim transakcijama
kako se sredstva ponovo troše. Svaki ulaz mora imati kriptografski digitalni
potpis koji „otključava” sredstva iz prethodne transakcije. Jedino osoba koja
poseduje odgovarajući privatni ključ može proizvesti odgovarajući potpis, i
ovo omogućava da se sredstva mogu trošiti samo od strane njihovih pravih
vlasnika. Svaki izlaz određuje koja Bitcoin adresa je prijemnik sredstava.

2.2 Uvod u SHA funkcije


Secure Hash Algorithm je skup kriptografskih funkcija objavljen od strane
NIST-a (National Institute of Standards and Technology) kao standard Ujed-
ninjenih Amerkičkih Država pod nazivom FIPS (Federal Information pro-
cessing Standard ). Ovaj standard obuhvata, za sad, četiri podgrupe SHA
algoritama:

9
• SHA-0: prvobitna verzija SHA algoritma koja je imala 160-bitne hash
vrednosti. Objavila ga je NSA 1993 pod imenom „SHA”, ali je ubrzo
povučena iz upotrebe zbog značajne mane koja nije otkrivena javnosti
i zamenjena modifikovanom verzijom pod imenom „SHA-1”.

• SHA-1: je 16-bitna hash funkcija koja podseća na MD5 verziju hash


algoritma. Osmislila ga je NSA kao deo algoritma za digitalne potpise
(Digital Signature Algorithm). Vremenom su otkrivene određene sla-
bosti ovog algoritma pa on nije više preporučljiv u večini kriptografskih
primena od 2010.

• SHA-2: je zapravo familija koja se sastoji od dve slične hash funkcije,


SHA-256 i SHA-512, kao i njihovih skraćenih verzija, SHA-224 i SHA-
384. Razlika između ovih algoritama je u dužini reči odnosno veličini
bloka, SHA-256/224 koriste 32-bitne reči, dok SHA-512/384 koriste 64-
bitne reči, dok su algoritmi praktično isti.

• SHA-3: je hash funkcija, prvobitno poznata pod imenom KECCAK,


koja je 2012 izabrana na javnom takmičenju kao novi SHA standard, tj.
SHA-3. Dužina hash-a je ista kao kod SHA-2 familije, dok se struktura
algoritma bitno razlikuje od ostatka SHA algoritama.

U tabeli 2.1 dato je kratko poređenje osobina pojedinih SHA algoritama


u vidu veličine hash sume, bloka, korišćenih aritmetičkih i logičkih operacija
i broja bita za meru sigurnosti.
Sigurne hash funkcije (SHA) pravljene su prvenstveno u cilju autentika-
cije podataka a ne enkripcije. Za ove potrebe funkcije se koriste u smislu
verifikacije identiteta izvora poruke, verifikacije da poruka nije menjana od
trenutka slanja do trenutka prijema, verifikacija sekvenci poruka tj. da po-
rukama nije menjan redosled kao i da nije došlo do brisanja postojećih ili
ubacivanja novih poruka. Koriste se često kod kriptografskih algoritama sa
javnim ključem, u vidu čuvanja šifri i digitalnih potpisa, provera integriteta
sadržaja i autentikacije sigurnih web konekcija.

10
Tabela 2.1: Pregled SHA funkcija

Veličina Broj bita


Izlaz Blok Broj
Funkcija poruke Operacije za
(bit) (bit) iteracija
(bit) bezbednost

add (mod 232 ),


SHA-0 160 512 264 − 1 80 <80
and, or, xor, rot
add (mod 232 ),
SHA-1 160 512 264 − 1 80 <80
and, or, xor, rot
add (mod 232 ), shr,
SHA-256 256 512 264 − 1 64 128
and, or, xor, rot
add (mod 264 ), shr,
SHA-512 512 1024 2128 − 1 80 256
and, or, xor, rot
SHA-3
d(arbitrary) 1088 ∞ 24 and, not, xor, rot min(d/2, 128)
(SHAKE256)

2.3 SHA-256 algoritam


2.3.1 Pregled algoritma
SHA funkcije su ireverzibilne (jednosmerne) kriptografske hash funkcije
koje od podataka proizvoljne dužine prave sažetak fiksne dužine. Ovo je
omogućeno tako što se originalna poruka podeli na blokove fiksne dužine
(slika 2.1), i onda se ti blokovi zasebno obrađuju, nakon čega se kombinuju
u rezultantni hash poruke.
N×512 bita (L×32 bita, L reči)

l bita Dužina originalne


poruke
Popunjavanje
ORIGINALNA PORUKA
1÷512 bita

512 bita 512 bita 512 bita 512 bita


(16 reči) (16 reči) (16 reči) (16 reči)
M1 M2 M3 M(N)

Slika 2.1: Prikaz pripremanja poruke

11
Da bi se poruka podelila u blokove fiksne dužine, najpre se mora dopuniti
odgovarajućim brojem bita. U slučaju SHA-256 funkcije, dodaje se jedan bit
vrednosti „1”, zatim se dopunjava bitima sa vrednošću „0” tako da preostane
64 bita do celobrojnog umnoška 512. Preostala 64 bita označavaju binarnu
predstavu dužine originalne poruke. Zatim se tako dobijena poruka podeli
na blokove od po 512 bita (M (1) , M (2) ...M (N ) ), i blokovi se obrađuju pojedi-
načno. Počevši računanje od fiksne inicijalne vrednosti međurezultata H (0)
sračunava se iterativno

H (i) = H (i−1) + CM (i) (H (i−1) )

gde je C funkcija kompresije SHA-256, + označava sabiranje reči po modulu


232 , a H (N ) je hash vrednost bloka M .

2.3.2 Opis algoritma


Detaljan opis algoritma SHA-256, kao i SHA-512 i SHA-384, može se
naći u [1]. Funkcija kompresije SHA-256 radi sa 512-bitnim blokovima i 256-
bitnim međurezultatima hash vrednosti. U suštini to je 256-bitni block cipher
algoritam (više o block cipher u [2]) koja vrši enkripciju nad međurezultatom
hash vrednosti koristeći blok poruke kao ključ. U daljem tekstu opisana je
funkcija kompresije i raspored poruka.

Definicije
Korišćena je notacija prikazana u tabeli 2.2. Sve operacije podrazumevaju
32-bitne operande.

Tabela 2.2: Notacija


L
V — XOR nad bitovima
W — AND nad bitovima
— OR nad bitovima
¬ — NOT nad bitovima
+ — sabiranje po modulu 232
Rn — shift u desno za n bita
S n — rotiranje u desno za n bita

12
Inicijalna hash vrednost H (0) je predstavljena u tabeli 2.3. Ove 32-bitne
vrednosti su predstavljene u heksadecimalnom zapisu i predstavljaju razlo-
mljeni deo kvadratnog korena prvih 8 prostih brojeva.

Tabela 2.3: Inicijalne vrednosti međurezultata


(0)
H0 = 6a09e667
(0)
H1 = bb67ae85
(0)
H2 = 3c6ef372
(0)
H3 = a54ff53a
(0)
H4 = 510e527f
(0)
H5 = 9b05688c
(0)
H6 = 1f83d9ab
(0)
H7 = 5be0cd19

Pored inicijalnih vrednosti međurezultata, koriste se još i 64 konstante,


K0 , ..., K63 , koje predstavljaju prva 32 bita razlomljenih delova kubnih korena
prva 64 prosta broja (počevši od 2 i zaključno sa 311). Oni su prikazani u
heksadecimalnom zapisu u tabeli 2.4.

Tabela 2.4: Korišćene konstante


428a2f98 71374491 b5c0fbcf e9b5dba5 3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3 72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc 2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7 c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13 650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3 d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208 90befffa a4506ceb bef9a3f7 c67178f2

U procesu hash-ovanja poruka potrebno je prerasporediti pojedine blo-


kove. Formiraju se pomoćni, prošireni, blokovi W0 , ..., W63 , a oni se sračuna-
vaju na sledeći način:
(i)
Wj = Mj , za j = 0, 1, ..., 15 i
Wj = σ1 (Wj−2 ) + Wj−7 + σ0 (Wj−15 ) + Wj−16 , za j = 16, ...63
Dijagram funkcije pripremanja poruka prikazan je na slici 2.2. Registri
na dijagramu predstavljaju vrednosti Wj iz prethodnih 16 iteracija.

13
σ1 σ0 W j

Slika 2.2: Dijagram pripremanja reda poruka Wj

U SHA-256 algoritmu koristi se šest logičkih funkcija. Svaka od ovih


funkcija koristi 32-bitne operande i daje 32-bitne rezultate. Definicije logičkih
funkcija koje se koriste u funkciji kompresije i formiranju reda poruka date
su u tabeli 2.5.

Tabela 2.5: Logičke funkcije


Ch(x, y, z) = (x ∧ y) ⊕ (¬x ∧ z)
M aj(x, y, z) = (x ∧ y) ⊕ (x ∧ z) ⊕ (y ∧ z)
Σ0 (x) = S 2 (x) ⊕ S 13 (x) ⊕ S 22 (x)
Σ1 (x) = S 6 (x) ⊕ S 11 (x) ⊕ S 25 (x)
σ0 (x) = S 7 (x) ⊕ S 18 (x) ⊕ R3 (x)
σ1 (x) = S 17 (x) ⊕ S 19 (x) ⊕ R10 (x)

Pripremanje poruke
Kao što je rečeno ranije, pre početka sračunavanja hash vrednosti, poruka
se najpre mora pripremiti. To podrazumeva:

1. Poruka se popunjava dodatnim bitima. Pretpostavimo da je dužina


poruke M jednaka l bita. Dodaje se bit „1” na kraj poruke, a zatim
k bita sa vrednošću „0”, gde k biramo tako da zadovoljava jednačinu
(l + 1 + k)mod512 = 448, odnosno k treba da je takvo da nam preostane
još 64 slobodna bita u poruci do celobrojnog umnoška 512. Preostala 64
bita koja se dodaju predstavljaju binarnu predstavu broja l, odnosno
dužine poruke. Ovaj broj bita efektivno ograničava maksimalnu dužinu
poruke na 264 . Dužina proširene poruke celobrojni umnožak broja 512.

14
2. Poruka se deli u blokove od po 512 bita M (1) , M (2) , ..., M (N ) . Ovaj
postupak je već prikazan na slici 2.1. Prva 32 bita bloka i označavaju
(i) (i) (i)
se M0 , naredna 32 bita su M1 , sve do M15 . Koristi se big endian
format, odnosno u svakoj 32-bitnoj reči bit na skroz levoj poziciji je bit
najveće težine.

Glavna petlja
Sračunavanje hash vrednosti se nastavlja po sledećem postupku:
For i = 0 to N − 1 (N = broj blokova u proširenoj poruci)
{

• Inicijalizacija registara a, b, c, d, e, f , g, h sa vrednošću (i − 1)-og


(i−1)
međurezultata hash vrednosti Hx (kada je i = 1 uzima se inicijalna
vrednost međurezultata prikazana u tabeli 2.3) •
(i−1)
a ← H0
..
.
(i−1)
h ← H7

• Nakon toga se primenjuje funkcije kompresije SHA-256 za ažuriranje


registara a, . . . , h •
For j = 0 to 63
{
Sračunava se Ch(e, f, g), M aj(a, b, c), Σ0 (a), Σ1 (e), i Wj , a zatim:
T1 ← h + Σ1(e) + Ch(e, f, g) + Kj + Wj
T2 ← Σ0 (a) + M aj(a, b, c)
h←g
g←f
f ←e
e ← d + T1
d←c
c←b
b←a
a ← T1 + T2
}

15
• Sračunava se i-ti međurezultat hash vrednosti H (i) •
(i) (i−1)
H1 ← a + H0
(i) (i−1)
H2 ← b + H1
..
.
(i) (i−1)
H8 ← h + H7

}
(N ) (N ) (N )
Sada je H (N ) = (H0 , H1 , . . . , H7 ) hash poruke M .
Dijagram funkcije kompresije, odnosno glavne petlje, prikazan je na slici 2.3.

a b c d e f g h

∑0 Maj(a,b,c) ∑1 Ch(e,f,g)

Wj+Kj
Slika 2.3: Slikoviti prikaz izvršavanja j-te iteracije funkcije kompresije.

Primer
Uzmimo za primer prostu poruku „abc”. Karakteri su u ASCII formatu
pa poruka ima 24 bita. Proširenja poruka predstavljena je u tabeli 2.6 (u
heksadecimalnoj predstavi).

Tabela 2.6: Proširena poruka „abc”


61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018

Hash vrednost poruke „abc” je:

ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad

16
Uzmimo kao drugi primer poruku „acb”, iste dužine i istih karaktera ali
malo promenjenog redosleda. Proširena poruka predstavljena je u tabeli 2.7.

Tabela 2.7: Proširena poruka „acb”


61636280 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018

Hash poruke „acb” je:


8e976608 3b3bfc20 03f791c9 853941b0 ea035d16 379bfec1 6b72d376 e272fa57

Ovim primerima je pokazano da čak i najmanja promena u poruci, kao


što je zamena dva karaktera, rezultuje generisanjem znatno drugačije hash
vrednosti.

2.4 Poređenje SHA-1 i SHA-256


SHA-1 algoritam je preteča SHA-2 familije algoritama. Dugo je smatran
sigurnim algoritmom i kao takav često je i korišćen sve do 2005 godine kada
je otkriven napad koji pronalazi koliziju sa manje od 269 operacija (Brute
Force napad bi zahtevao 280 operacija). Kasnije je ovaj broj sveden na 251
operacija [4].
SHA-1 algoritam je veoma sličan njegovom sledbeniku SHA-256. Postu-
pak sračunavanja je relativno isti:
1. Vrši se dopunjavanje poruke na isti način kao kod SHA-256

2. Poruka se deli u blokove od po 512 bita


(0) (0)
3. Postavljaju se inicijalne hash vrednosti za međurezultat, H0 , ..., H4
For i 1 to N
{
4. Priprema se red poruka, {Wt }:

M (i) 0 ≤ t ≤ 15
t
W (t) =
ROT L1 (W ⊕ Wt−8 ⊕ Wt−14 ⊕ Wt−16 ) 16 ≤ t ≤ 79.
t−3

17
5. Inicijalizacija 5 radnih registara, a, b, ... , e sa vrednošću međurezultata
iz prethodne iteracije
(i−1)
a ← H0
..
.
(i−1)
e ← H4

6. For i 1 to N
{
T ← ROT L5 (a) + ft (b, c, d) + e + Kt + Wt
e←d
d←c
c ← ROT L30 (b)
b←a
a←T
}

7. Sračunava se i-ti međurezultat hash vrednosti H (i) •


(i) (i−1)
H0 ← a + H0
(i) (i−1)
H1 ← b + H1
..
.
(i) (i−1)
H4 ← h + H4
(N ) (N ) (N )
i hash vrednost se dobija kao H (N ) = (H0 , H1 , . . . , H4 ).

SHA-1 funkcija ima 80 iteracija za sračunavanje hash vrednosti, i koristi 4


različite 32-bitne konstante (za razliku od SHA-256 koji ima 64). Konstante
SHA-1 algoritma:




 5a827999 0 ≤ t ≤ 19


20 ≤ t ≤ 39

6ed9eba1
Kt =


 8f1bbcdc 40 ≤ t ≤ 59


60 ≤ t ≤ 79

ca62c1d6

SHA-1 se razlikuje od SHA-256 i u logičkim funkcijama koje koristi. Te

18
funkcije zavise od trenutne iteracije:



 Ch(x, y, z) = (x ∧ y) ⊕ (¬x ∧ z) 0 ≤ t ≤ 19


P arity(x, y, z) = x ⊕ y ⊕ z

20 ≤ t ≤ 39
ft (x, y, z) =
M aj(x, y, z) = (x ∧ y) ⊕ (x ∧ z) ⊕ (y ∧ z)

 40 ≤ t ≤ 59


P arity(x, y, z) = x ⊕ y ⊕ z)

60 ≤ t ≤ 79

Rezultantna hash vrednost SHA-1 funkcije je 160 bita, što je znazno


manje nego kod SHA-256. Algoritam SHA-256 je veoma malo složeniji od
SHA-1, ali daje daleko bolje rezultate u pogledu sigurnosti podataka.

19
Glava 3

Realizacija SHA-256 algoritma

Algoritam je realizovan u VHDL jeziku. Kao uputstvo za pisanje VHDL


kôda korišćen je dokument „VHDL Primer” [6], [7].

3.1 VHDL
VHDL je jezik za opis hardvera koji se koristi u elektronskom dizajnu za
opis digitalnih sistema i sistema mešovitih signala kao što su FPGA (Field
Programmable Gate Array) čipovi i integrisana kola. VHDL se takođe može
koristiti kao opštenamenski jezik za paralelno (konkurentno) programiranje.
Standardizovan je od strane IEEE (Institute of Electrical and Electronics
Engineers) kao standard 1076 [5], na koji se vremenom nadovezuje veliki
broj dodatnih standarda.
VHDL je originalno osmišljen na inicijativu Ministarstva Odbrane Uje-
dinjenih Američkih država (U.S Department of Defense) kako bi proizvođači
jednoznačno dokumentovali ponašanje ASIC (Application Specific Integrated
Circuit) čipova ugrađivanih u uređaje. Sama ideja o mogućnosti simuliranja
ASIC čipova na osnovu ove dokumentacije je očigledno bila atraktivna da
su vremenom razvijeni logički simulatori koji mogu da čitaju VHDL kôd.
Naredni korak je bio razvijanje sofisticiranih alata za sintezu za VHDL kôd
koji proizvodi fizičku implementaciju opisanog kola (dizajn na nivou logičkih
gejtova).
Velika prednost VHDL, pri korišćenju za dizajn sistema, je to što je mo-

20
guće da se sistem opiše (modeluje) na nivou ponašanja, simulira i verifikuje
pre sinteze. Takođe velika prednost što VHDL omogućava opis konkurent-
nog sistema. VHDL je dataflow language za razliku od proceduralnih jezika
(„C”, assembler . . . ) kod kojih se instrukcije izvršavaju sekvencijalno, jedna
instrukcija u jednom trenutku. Projekat pisan u VHDL jeziku je portabilan
i ne zavisi od tehnologije.

3.2 Softverski paket


Za pisanje VHDL kôda, test bench-ove i simulacije korišćen je „ISE Design
Suite v14.6”. ISE (Integrated Software Environment) je softverski paket kom-
panije Xilinx [8]. Ovo je višenamenski alat, i kao takav koristi se za pisanje
kôda, sintezu i analizu HDL dizajna. Daje mogućnost sintetisanja dizajna,
izvršavanja vremenskih analiza, pregled RTL (Register Transfer Level ) di-
jagrama, simuliranje ponašanja sistema na razne pobude kao i konfiguracija
ciljnih sistema pomoću programatora. Plaćena verzija softvera podržava sve
komponente koje pravi Xilinx, dok besplatna verzija podržava samo low-cost
Spartan familiju FPGA čipova, kao i neke CPLD (Complex Programmable
Logic Device) komponente.

3.3 Realizacija
Realizacija algoritma se sastoji iz više VHDL modula. Korišćena su 2
hijerarhijska nivoa. Na nižem hijerarhijskom nivou nalaze se 3 modula, dok
je na višem nivou modul koji ih objedinjuje, i svojim dodatnim funkcional-
nostima obezbeđuje pravilno izvršavanje algoritma. Hijerarhijski niži moduli
su opisani modelom ponašanja (behavioral model ), dok je hijerarhijski viši
nivo (top module) opisan mešovitim modelom, tj. i strukturnim (structural
model )i modelom ponašanja. Definisani su i opisani sledeći moduli sistema:

• „ConstantsROM ” - ROM komponenta koja ima 64×32-bitne lokacije, i


služi za čuvanje konstanti koje se koriste pri izračunavanju hash vredno-
sti. Modul je nižeg hijerarhijskog nivoa i opisan je modelom ponašanja.
Više o ovom modulu u poglavlju ConstantsROM.

21
• „Counter64 ” - Brojač po modulu 64 koji se koristi za praćenje broja
iteracija pri izračunavanju hash vrednosti, kao i za adresiranje lokacija
u ROM-u. Modul je nižeg hijerarhijskog nivoa i opisan je modelom
ponašanja. Više o ovom modulu u poglavlju Counter64.

• „MainLoop” - Komponenta koja predstavlja glavnu petlju algoritma.


Pomoću nje se primenjuje funkcija kompresije ovog algoritma. Modul
je nižeg hijerarhijskog nivoa i opisan je modelom ponašanja. Više o
ovom modulu u poglavlju MainLoop

• „SHA256 ” - Top Module, odnosno modul najvišeg hijerarhijskog nivoa,


i kao takav opisan je mešovitim modelom. U njemu se instanciraju i
povezuju komponente nižeg hijerarhijskog nivoa, vrši prijem poruka i
generisanje izlaza. Više o ovom modulu u poglavlju ConstantsROM.

Na slici 3.1 prikazana je blok šema sistema, sa koje se vidi da je SHA256


modul najvišeg hijerarhijskog nivoa i da sadrži ostale module. Naizgled „vi-
seći” ulazi/izlazi modula nižeg hijererhijskog nivoa su povezani sa unutra-
šnjim signalima modula SHA256 i te veze nisu prikazane radi preglednosti.

Slika 3.1: Blok šema sistema

Pored ovih modula, za potrebe projektovanog sistema napravljen je i


VHDL paket (VHDL package) u kom se nalaze definicije korisnički definisa-

22
nih tipova i korišćenih konstanti. Definisan je tip „state” koji, sa svoje tri
moguće vrednosti (idle, hashing i output) predstavlja stanja kroz koja prolazi
konačna mašina stanja (Finite State Machine) opisana u modulu SHA256.
Takođe, radi lakšeg manipulisanja signalima, definisani tipovi „ArrayOfVec-
tors” (niz od 8 vektora tipa std_logic_vector dužine 32 bita) za potrebe
signala H0 , ..., H7 i a, b, ...h, kao i „MsgSchedule” (niz od 16 vektora tipa
std_logic_vector dužine 32 bita) za potrebe reda poruka, odnosno signala
koji pamti prethodnih 16 delova poruka (Wj ) kao što je prikazano u pogla-
vlju Definicije. Definisana je i vrednost konstante H_Init, odnosno inicijalna
vrednost signala H0 , ..., H7 kao što je prikazano u tabeli 2.3. VHDL kôd ovog
paketa može se videti u prilogu.

3.3.1 Modul ConstantsROM


Za čuvanje potrebnih konstanti (date u tabeli 2.4) predviđen je jedan
ROM koji ima 64 lokacije po 32bita. ROM modul je asinhron, i za ulaz ima
6-bitni vektor address(5..0) kojim se adresira željena konstanta, i 32-bitni
izlaz const(31..0) koji predstavlja adresiranu konstantu, što se može videti u
tabeli 3.1. Izvorni VHDL kôd ove komponente može se videti u prilogu.

Tabela 3.1: Portovi modula ConstantsROM


Ime porta Smer Broj linija Značenje
address Ulazni 6 Adresa lokacije u ROM-u
const Izlazni 32 Konstanta sa adresirane lokacije

3.3.2 Modul Counter64


Ovaj brojač po modulu 64 koristi se za adresiranje konstanti koje se na-
laze u ROM-u kao i za praćenje iteracija pri izvršavanju funkcije kompresije.
Portovi modula se mogu videti u tabeli 3.2. Ulazi u modul su taktni signal
clk i signal reseta brojača reset. Izlazni signali su 6-bitni vektor count(5..0),
done_15 koji označava da je brojač stigao do vrednosti 15 i done_63 koji
označava da je brojač završio brojanje. Signali done_15 i done_63 koriste
se u glavnom modulu kao „flag-ovi” dostizanja određenog stanja i služe za
upravljanje tôkom izvršavanja algoritma (određivanje naredne vrednosti za

23
smeštanje u red poruka, narednih vrednosti a, b, ..., h). U glavnom modulu
(Top Module) brojač je instanciran i povezan sa ROM komponentom. Izvorni
VHDL kôd za opis ove komponente može se videti u prilogu.

Tabela 3.2: Portovi modula Counter64


Ime porta Smer Broj linija Značenje
clk Ulazni 1 Signal takta u brojaču
reset Ulazni 1 Signal asinhronog reseta brojača
count Izlazni 6 Trenutna vrednost brojača
done_15 Izlazni 1 Signal koji označava dostizanje vrednosti 15
done_63 Izlazni 1 Signal koji označava završeno brojanje

3.3.3 Modul MainLoop


U MainLoop modulu se izvršava funkcija kompresije algoritma SHA-256
nad odgovarajućim delom poruke, što podrazumeva izračunavanje vredno-
sti logičkih funkcija Ch(e, f, g), M aj(a, b, c), Σ0 (a) i Σ1 (e) na osnovu ulaza
a, b, ..., h, W i K. Najpre se sračunavaju vrednosti pomenutih logičkih funk-
cija, a zatim se ažuriraju vrednosti signala a, b, ..., h u skladu sa pravilima
opisanim u poglavlju Glavna Petlja, i oni se, kao izlazni signali ovog modula,
prosleđuju modulu višeg hijerarhijskog nivoa. Modul je asinhron, a spisak
njegovih portova može se videti u tabeli 3.3. Izvorni VHDL kôd za opis ove
komponente može se videti u prilogu.

Tabela 3.3: Portovi modula MainLoop


Ime porta Smer Broj linija Značenje
W Ulazni 32 Deo poruke za trenutnu iteraciju
K Ulazni 32 Konstanta iz ROM-a za trenutnu iteraciju
a_h_in Ulazni 7×32 Vrednosti a, b, ..h u trenutnoj iteraciji
a_h_out Izlazni 7×32 Vrednosti a, b, ..h za narednu iteraciju

3.3.4 Top Module SHA256


Kao što je već rečeno, ovo je modul najvišeg hijerarhijskog nivoa, i u
njemu su instancirana i povezana preostala 3 modula. U ovom modulu defi-
nisana je mašina stanja čiji se dijagram stanja prikazan na slici 3.2.

24
init=’1’
reset inače

idle hashing

block_done=’1’
(bezuslovno, and
posle 1clk) last=’1’

output

Slika 3.2: Dijagram stanja FSM, modul SHA256

Stanje FSM je tipa state definisanog u VHDL paketu i može imati sledeće
vrednosti:

• „idle” - Ovo je stanje mirovanja FSM. FSM prelazi u ovo stanje nakon
reseta sistema, kao i iz stanja „output” nakon završetka hash-ovanja
poruke. Izlazak iz ovog stanja određen je postavljanjem signala init na
vrednost „1”, nakon čega se prelazi u stanje „hashing”. Kako se u ovom
stanju ne vrše nikakve operacije, brojač je zaustavljen postavljanjem
njegovog resetnog signala na vrednost „1”, a u MainLoop modul se ne
šalju nikakvi korisni podaci.

• „hashing” - Ovo stanje FSM označava da su delovi poruke počeli da pri-


stižu. Prvi deo prvog bloka poruke pristiže sa aktivnim signalom init,
dok poslednji deo poslednjeg bloka poruke pristiže sa aktivnim signa-
lom last. U ovom stanju se aktivira brojač deaktiviranjem njegovog
resetnog signala a u modul MainLoop se prosleđuju podaci u skladu
sa pravilima algoritma. Kada je FSM u ovom stanju, na kraju svakog
taktnog ciklusa preuzimaju se nove vrednosti a, b, ..., h iz modula Ma-

25
inLoop, i one se koriste za ažuriranje reda poruka, i signala H0 , ..., H7
ukoliko je završena obrada jednog bloka. Ako se pri završetku obrade
jednog 512bitnog bloka detektuje aktivan signal last prelazi se u stanje
„output”, dok se u suprotnom ostaje u ovom stanju i očekuje se pri-
jem prvog dela poruke narednog bloka. Završetak obrade jednog bloka
naznačava se aktiviranjem signala block_done.

• „output” - U ovo stanje se stiže isključivo iz stanja „hashing” i to samo


ako se po završetku obrade bloka detektuje aktivan signal last. Po
ulasku u ovo stanje vrednosti H0 , ..., H7 se nadovezuju i prosleđuju na
izlaz iz modula, signal hash, i aktivira se signal hash_valid. Trajanje
signala hash_valid, kao i same hash vrednosti je 1clk, nakon čega se
bezuslovno prelazi u stanje „idle”.

Za ovu mašinu stanja definisana su 2 procesa, sekvencijalni proces koji


ažurira mašinu stanja na svaku uzlaznu ivicu signala takta kao i kombinacioni
proces koji sadrži logiku za određivanje narednog stanja, generisanje izlaza i
upravljanje sistemom.
Pored opisane mašine stanja, definisani su i neki dodatni procesi. Oni
služe za ažuriranje vrednosti H0 , ..., H7 (koje se čuvaju u vidu niza tipa Ar-
rayOfVectors, H_out) po završetku obrade svakog bloka, ažuriranje vred-
nosti a, b, ..., h (koje se čuvaju u vidu niza tipa ArrayOfVectors, a_h_prev)
posle svake iteracije glavne petlje i za ažuriranje reda poruka Wj (koji je
predstavljen u vidu niza tipa MsgSchedule) u koji se smešta pristigla 32bitna
vrednost poruke, ukoliko je stanje brojača manje od 15, ili vrednost signala
Wc (Wc = σ1 (Wj−2 ) + Wj−7 + σ0 (Wj−15 ) + Wj−16 ) ukoliko je vrednost brojača
veća od 15. Pored ovih procesa, u modulu postoje i naredbe za izračunavanje
vrednosti σ1 (Wj−2 ) i σ0 (Wj−15 ).
Za ovaj sistem, predviđeno je da se poruka učitava u delovima od po
32bita, preko linija ulaznog porta msg(31..0). Početak učitavanja poruka
određen je aktivnom vrednošću signaloa init. Nakon prijema poslednjeg
32bitnog dela poruke, što je određeno aktivnom vrednošću signala last, čeka
se još 48 perioda signala takta kako bi se obrada primljene poruke završila,
i nakon toga se na izlazu hash(255..0) pojavljuje hash vrednost, uz aktivan

26
signalhash_valid. Spisak portova ovog modula dat je u tabeli 3.4, a izvorni
VHDL kôd za opis ove komponente može se videti u prilogu.

Tabela 3.4: Portovi modula SHA256


Ime porta Smer Broj linija Značenje
clk Ulazni 1 Sistemski takt signal
reset Ulazni 1 Signal asinhronog reseta
msg Ulazni 32 Deo poruke koji se učitava u trenutnoj iteraciji
init Ulazni 1 Pristizanje prvog 32bitnog dela poruke
last Ulazni 1 Pristizanje poslednjeg 32bitnog dela poruke
blockd one Izlazni 1 Završetak obrade poslednjeg 512bitnog bloka
hash Izlazni 256 Izlazni hash signal
hashv alid Izlazni 1 Hash-vanje završeno, rezultat se može čitati

27
Glava 4

Simulacije

Nakon pisanja izvornog kôda za opis modula, za testiranje sistema na-


pisano je mnoštvo Test Bench-ova. Testirani su svi moduli zasebno, kao i
ceo sistem u celini. U narednim poglavljima prikazani su, i komentarisani,
rezultati simulacija. Svi moduli su detaljno istestirani, a prikazane su samo
ključne situacije koje pokazuju ispravnu funkcionalnost sistema.

4.1 Modul Constants ROM


Za potrebe prikaza rezultata simulacija ConstantsROM modula napisan
je kratak Test Bench. Radi preglednosti, u simulaciji je adresirano nekoliko
lokacija. Izabrane su lokacije sa rednim brojem koji celobrojni umnožak broja
8. Na slici 4.1. Ispravnost ove komponente se može potvrditi poređenjem
vrednosti na dijagramu sa vrednostima iz tabele 2.4.

Slika 4.1: Vremenski dijagram: simulacija ConstantsROM modula

28
4.2 Modul Counter64
Za potrebe prikaza rezultata simulacija ConstantsROM modula napisan
je kratak Test Bench. Radi preglednosti, na vremenskim dijagramima pri-
kazano je samo nekoliko takt signala, odnosno nekoliko promena vrednosti
brojača koje prikazuju način funkcionisanja ovog modula, što se može videti
na slikama 4.2 i 4.3. Na prvoj slici prikazan je slučaj u kom brojač dostiže
vrednost 15, i njegov izlaz done_15, a na drugoj slici slučaj kada brojač
završi brojanje, i aktivira se njegov izlaz done_63.

Slika 4.2: Vremenski dijagram: brojač dostiže vrednost 15

Slika 4.3: Vremenski dijagram: završeno brojanje brojača

Na slici 4.4 prikazani su vremenski dijagrami signala dodatnog modula


koji je napravljen isključivo za potrebe testiranja i ne koristi se u modulu
najvišeg hijerarhijskog nivoa. U ovom modulu su povezani ROM i brojač.
Ulazi su clk i reset, signal koji povezuje module je izlaz iz brojača i vodi se
na adresne ulaze ROM-a, a izlazi su 32-bitne konstante.

29
Slika 4.4: Vremenski dijagram: simulacija ROM-a povezanog na brojač

4.3 Modul MainLoop


Za testiranje modula MainLoop napisan je Test Bench pomoću kog se
simulira izvršavanje funkcije kompresije nad početkom poruke „abc” (proši-
rena poruka „abc” u heksadecimalnom zapisu prikazana je u tabeli 2.6). Na
slici 4.5 prikazan je vremenski dijagram simulacije ovog modula.

Slika 4.5: Vremenski dijagram: simulacija modula MainLoop

Sa slike se može videti da ulazni signal W uzima vrednosti koje odgova-


raju početku proširene poruke „abc”. Ulazni signal K predstavlja konstantu
koja se koristi u trenutnoj iteraciji glavne petlje. Obzirom da se simuliraju

30
prve dve iteracije obrade poruke „abc”, signal K uzima prve dve vredno-
sti konstanti iz ROM-a (ove vrednosti mogu se uporediti sa vrednostima iz
tabele 2.4). Signali a, b, ..., h (predstavljeni nizom a_h_in(0..7)) uzimaju
inicijalnu hash vrednost (tabela 2.3), obzirom da se simulira početak obrade
poruke. Signal plave boje na slici, a_h_out(0..7), predstavlja nove vrednosti
a, b, ..., h, odnosno vrednosti koje će se koristiti u narednoj iteraciji.
Radi poređenja sa rezultatima simulacija prikazanih na slici, u tabeli 4.1
prikazane su vrednosti a, b, ..., h u prvih nekoliko iteracija glavne petlje. Pre-
gled ovih vrednosti pri izvršavanju sve 64 iteracije glavne petlje pri obradi
poruke „abc”, i prikaz krajnje hash vrednosti može se videti u [1].

Tabela 4.1: Vrednosti a, b, ..., h u prvim iteracijama glavne petlje


a b c d e f g h
init: 6a09e667 bb67ae85 3c6ef372 a54ff53a 510e527f 9b05688c 1f83d9ab 5be0cd19
t = 0 5d6aebcd 6a09e667 bb67ae85 3c6ef372 fa2a4622 510e527f 9b05688c 1f83d9ab
t = 1 5a6ad9ad 5d6aebcd 6a09e667 bb67ae85 78ce7989 fa2a4622 510e527f 9b05688c
.
. .
. .
. .
. .
. .
. .
. .
.
t = 2 . . . . . . . .

4.4 Top Module SHA256


Za prikaz rezultata simulacija kompletnog sistema, odnosno modula SHA256,
napisana su 2 Test Bench-a. U prvoj simulaciji prikazan je način funkcio-
nisanja sistema kada se obrađjuje kratka poruka (početna dužina poruke je
24 bita), koja nakon proširenja ima dužinu 512 bita, odnosno predstavlja 1
blok. U drugoj simulaciji prikazan je način funkcionisanja sistema kada se
obrađuje nešto duža poruka (početna dužina poruke je 448 bita), koja nakon
proširenja ima dužinu 1024 bita, odnosno predstavlja 2 bloka, koja se zasebno
obrađuju, pa se njihove hash vrednosti sabiraju.

4.4.1 Simulacija obrade 1 bloka poruke


U ovoj simulaciji prikazana je obrada poruke „abc” čija je dužina 24 bita.
Nakon proširenja, poruka je dugačka 512 bita (izgled proširene poruke može
se videti u tabeli 2.6). Na slici 4.6 prikazani su vremenski dijagrami signala
pri simulaciji obrade ove poruke. Da bi se započelo učitavanje, a samim tim

31
i obrada, najpre se postavlja na aktivnu vrednost signal init, a prva 32 bita
proširene poruke se postavlja na linije signala mblock koji je na slici označen
tamno plavom bojom.

Slika 4.6: Vremenski dijagram: simulacija modula SHA256 - početak obrade

Na slici se primećuje da na prvu uzlaznu ivicu signala takta, dok je sig-


nal init aktivan, FSM modula SHA256 prelazi u stanje „hashing”, vredno-
sti signala a, b, ...h (na slici a_h_main(0..7), signali zelene boje) koje se
vode u M ainLoop modul dobijaju inicijalne hash vrednosti, a kombinaciona
mreža modula M ainLoop generiše signale a, b, ...h za sledeću iteraciju (na
slici a_h_new(0..7), signali svetlo plave boje). Kako je u pitanju jedna od
prvih 16 iteracija, vrednost W (na slici W main, signali narandžaste boje)
koji se prosleđuju u M ainLoop uzimaju vrednost tek primljene poruke. Vred-
nost signala H0 , ..., H7 (na slici hout(0..7), signali zelene boje) se ne menjaju
dok se ne obradi ceo blok poruke. Na narednu uzlaznu ivicu signala takta,
FSM ostaje u istom stanju, signali a_h_main(0..7) uzimaju vrednost od
a_h_new(0..7) iz prethodnog taktnog intervala, dok M ainLoop modul ge-
neriše nove vrednosti za signale a_h_new(0..7).
**** Digresija: Kako su u simulacijama a, b, ..., h predstavljeni u obliku
niza a_h_xxx(0..7), bilo bi nepregledno prikazati svih 8 elemenata niza, pa
je vidljiv samo prvi element a_h_xxx(0) koji odgovara vrednosti a u opisu
algoritma, jer jedino on (pored vrednosti e) dobija dobija sasvim nove vred-
nosti u svakoj iteraciji, dok ostali signali (b, c, d, f, g, h) dobijaju vrednosti od

32
elemenata niza koji im prethode, pa je nepotrebno prikazivati ih. Ovo će se
primenjivati i na preostale vremenske dijagrame u poglavlju. ****
Na slici 4.7 prikazani su vremenski dijagrami iste simulacije, pri učitava-
nju poslednja 32 bita poruke (u trenutku t = 235ns, signal narandžaste boje,
W main, uzima vrednost 0x00000018 sa ulaza mblock koji nije prikazan radi
preglednosti). Kada brojač stigne do vrednosti „15” (trenutak t = 235ns) nje-
gov izlaz done15 postaje aktivan, a signal W c (na slici signal zelene boje) do-
bija rezultat funkcije kompresije (Wc = σ1 (Wj−2 )+Wj−7 +σ0 (Wj−15 )+Wj−16 )
koja je u ovom slučaju 0x61626380, i počevši od naredne uzlazne ivice signala
takta (trenutak t=245ns) signal W main počinje da uzima vrednosti signala
W c. Signal hout(0..7) (tamno plava boja) i dalje ostaje nepromenjen.

Slika 4.7: Vremenski dijagram: simulacija modula SHA256 - učitan prvi blok

Radi poređenja sa rezultatima simulacija prikazanih na slici, u tabeli 4.2


prikazane su vrednosti a, b, ..., h u iteracijama 14–17 glavne petlje. Pregled
ovih vrednosti pri izvršavanju sve 64 iteracije glavne petlje pri obradi poruke
„abc”, i prikaz krajnje hash vrednosti može se videti u [1].
Na slici 4.8 prikazan je završetak obrade poruke „abc”. U trenutku t =
725ns brojač završava brojanje, i aktivira svoj izlaz done63, dok njegov izlaz
postaje „0”. Takođe se aktivira i izlazni signal ovog modula block_done.
Potreban je još jedan taktni interval da se ažuriraju vrednosti H0 , ..., H7
(predstavljeni nizom 32bitnih signala hout(0..7) plave boje).

33
Tabela 4.2: Vrednosti a, b, ..., h u iteracijama 14–17 glavne petlje
a b c d e f g h
t=14 c0645fde d932eb16 87912990 f71fc5a9 0b92f20c 745a48de 1e578218 816fd6e9
t=15 b0fa238e c0645fde d932eb16 87912990 07590dcd 0b92f20c 745a48de 1e578218
t=16 21da9a9b b0fa238e c0645fde d932eb16 8034229c 07590dcd 0b92f20c 745a48de
t=17 c2fbd9d1 21da9a9b b0fa238e c0645fde 846ee454 8034229c 07590dcd 0b92f20c
.
. .
. .
. .
. .
. .
. .
. .
.
t=18 . . . . . . . .

Slika 4.8: Vremenski dijagram: simulacija modula SHA256 - kraj obrade

U trenutku t = 735ns, signali H0 , ..., H7 , koji su do tada imali vrednost


inicijalnih hash vrednosti, se ažuriraju tako što se saberu sa vrednostima
a, b, ..., h iz poslednje iteracije. Takođe treba primetiti da, kako je signal last
bio aktivan u trenutku završetka obrade bloka, izlazni signal hash_valid
postaje aktivan dok signal hash(255..0) (na slici narandžasta boja) dobija
vrednost koja je krajnji rezultat obrade bloka. Ova vrednost se dobija na-
dovezivanjem signala, H0 , ..., H7 . Kako bi se vrednost ovog signala videla u
kompletnosti, ovaj signal je na slici izdvojen i uokviren crvenom bojom.
Radi poređenja sa rezultatima simulacija prikazanih na slici, u daljem
tekstu ponovo je prikazana krajnja hash vrednost poruke „abc”. Ceo postu-
pak, odnosno promena vrednosti sa svim iteracijama može se videti u [1].
Hash vrednost poruke „abc” je:

ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad

34
4.4.2 Simulacija obrade 2 bloka poruke
U ovoj simulaciji prikazana je obrada poruke „abcdbcdecdefdefgefghfghig-
hijhijkijkljklmklmnlmnomnopnopq”. Uzimajući u obzir kodiranje karaktera
u ASCII formatu, dužina originalne poruke je 448 bita. Po pravilu, proširiva-
nje poruke se vrši dodavanjem „1” na kraj poruke, i onda potreban broj nula
kako bi se postigla dužina poruke koja je za 64 bita manja od celobrojnog
umnoška 512 bita. Dakle, ova poruka se mora proširiti tako da se dobiju 2
bloka od po 512 bita. Izgled proširene poruke dat je u sledećoj tabeli.

Tabela 4.3: Proširena poruka


„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq”
blok 1:
61626364 62636465 63646566 64656667 65666768 66676869 6768696a 68696a6b
696a6b6c 6a6b6c6d 6b6c6d6e 6c6d6e6f 6d6e6f70 6e6f7071 80000000 00000000
blok 2:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 000001c0

Početak učitavanja, odnosno obrade poruke je izostavljen zbog redun-


dantnosti, jer se vrši na isti način kao i u prethodnoj simulaciji. Na slici
4.9 prikazani su vremenski dijagrami simulacije obrade poruke, u trenutku
kada se završi obrada prvog bloka poruke. U trenutku kada brojač izbroji
do kraja, i pređe u stanje u kom mu je izlaz „0”, aktivira se izlazni signal
modula, block_done. Kako je ovo tek prvi blok poruke, odnosno signal last
nije bio aktivan u trenutku završetka obrade bloka, signal hash_valid ostaje
neaktivan, a FSM ostaje i dalje u stanju „hashing”. Nakon jednog taktnog
intervala (trenutak t = 695ns), ažuriraju se vrednosti signala H0 , ..., H7 (na
slici predstavljeni nizom hout(0..7), signal sive boje), i taj signal je izdvojen
i uokviren crvenom bojom kako bi se njegova vrednost mogla sagledati u
potpunosti. Pošto se u ovom trenutku započinje obrada novog bloka, signali
a, b, ..., h (na slici je to niz a_h_main(0..7), signal zelene boje) na početku
iterativnog ciklusa glavne petlje uzimaju vrednosti signala H0 , ..., H7 , kao što
se vidi na slici. Dalje, signal W (na slici tamno plave boje) počinje da uzima
vrednosti poruke koja se učitava (u ovom slučaju 0x00000000), i on se pro-

35
sleđuje signalu W main (signal narandžaste boje). Pošto je u ovom trenutku
obrada pauzirana za vreme trajanja 2 taktna intervala (ovo je postignuto
resetovanjem brojača, i signal reseta brojača traje 1 taktni interval) signal
W main već ima vrednost 0x00000000 pa se ova dodela vrednosti ne vidi na
dijagramu. Sa slike se takođe može primetiti da je izlaz iz ROM-a (signal
zelene boje const(31..0)) u ovom trenutku ima vrednost prve konstante, što
je i očekivano, jer je vrednost brojača „0”.

Slika 4.9: Vremenski dijagram: simulacija modula SHA256 - kraj obrade prvog bloka

Radi poređenja sa rezultatima simulacija prikazanih na slici, u tabeli 4.4


prikazane su vrednosti a, b, ..., h na početku obrade drugog bloka poruke.
Vrednost „init:” u tabeli 4.4 predstavlja vrednost signala H0 , ..., H7 po za-
vršetku obrade prvog bloka, odnosno hash vrednost prvog bloka, što se pre-
slikava u početne vrednosti a, b, ..., h na početku obrade drugog bloka. Sa
vremenskih dijagrama se može primetiti da se dobijene vrednosti poklapaju
sa vrednostima iz tabele. Pregled ovih vrednosti pri izvršavanju sve 64 itera-
cije glavne petlje, za oba bloka poruke „abcdbcdecdefdefgefghfghighijhijkij-
kljklmklmnlmnomnopnopq”, i prikaz krajnje hash vrednosti može se videti u
[1].

36
Tabela 4.4: Vrednosti a, b, ..., h na početku obrade drugog bloka poruke
„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq”
a b c d e f g h
init: 85e655d6 417a1795 3363376a 624cde5c 76e09589 cac5f811 cc4b32c1 f20e533a
t=0 7c20c838 85e655d6 417a1795 3363376a 4670ae6e 76e09589 cac5f811 cc4b32c1
.
. .
. .
. .
. .
. .
. .
. .
.
t=1 . . . . . . . .

Na slici 4.10 prikazan je završetak obrade poruke „abcdbcdecdefdefgefghfg-


highijhijkijkljklmklmnlmnomnopnopq”. Završetak obrade drugog bloka funk-
cioniše na isti način kao i završetak obrade kada je poruka dužine samo jednog
bloka. Najpre se aktiviraju izlaz brojača done63, izlazni signal blockd one, i
kako je signal last bio aktivan, na sledeću uzlaznu ivicu signala takta se ažuri-
raju vrednosti signala H0 , ..., H7 (na slici signal narandžaste boje hout(0..7)),
a FSM prelazi u stanje „output”, postavljaći pri tome signal hash_valid na
aktivan nivo, koji traje jedan taktni interval, i za to vreme nam je dostupan
rezultantna hash vrednost na izlazu hash(255..0) (na slici signal tamno plave
boje). Izlazni signal hash(2565..0) na slici je izdvojen i uokviren crvenom bo-
jom, kako bi se videla kompletna vrednost ovog signala.

Slika 4.10: Vremenski dijagram: simulacija modula SHA256 - kraj obrade drugog bloka

Radi poređenja sa rezultatima simulacija prikazanih na slici, u daljem


tekstu ponovo je prikazana krajnja hash vrednost poruke „abcdbcdecdefdef-

37
gefghfghighijhijkijkljklmklmnlmnomnopnopq”. Posmatrajući vrednosti dobi-
jene simulacijama, i vrednosti preuzete iz [1], može se primetiti da se vred-
nosti poklapaju, odnosno da sistem funkcioniše ispravno.
Hash vrednost poruke
„abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq” je:

248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1

38
Glava 5

Zaključak

U ovom radu ukratko su predstavljeni kriptografski hash algoritmi SHA-1


i SHA-256. Posebna pažnja posvećena je SHA-256 algoritmu. Dat je detaljan
opis ovog algoritma, njegove osobine, način izvršavanja, korišćene konstante
i logičke funkcije kao i kratko poređenje sa algoritmom starije generacije,
SHA-1.
Predstavljena je ideja realizacije kriptografskog hash algoritma SHA-256,
pisana u VHDL jeziku. Detaljno su opisani svi moduli koji su realizovani
pri projektovanju ovog sistema. Za pisanje kôda korišćen je „Xilinx ISE
Design Suite v14.6” softverski paket. Prikazani su i komentarisani rezultati
simulacija realizovanih modula, a izvorni kôd se može videti u prilogu.
Dalji rad na ovom dizajnu bi mogao obuhvatati implementaciju na kon-
kretnom FPGA čipu, odnosno razvojnoj ploči, npr. „Spartan 3-E Starter
Kit”, što bi zahtevalo dodatni rad na projektovanju sistema. Naime, moralo
bi se realizovati drugačije čitanje podataka u eventualnom višem hijerarhij-
skom nivou sistema, odnosno treba smanjiti broj linija za izlazni signal hash,
jer rezultati sinteze pokazuju da ovako napisan kôd nije sintetizibilan na po-
menutom čipu. Razlog za ovo je preveliki broj pinova za izlaz iz sistema
(256). Ovo bi se moglo rešiti iščitavanjem hash vrednosti u delovima, npr.
8×32bita, na sličan način kao što je realizovano čitanje poruke. Takođe bi
bilo neophodno osmisliti i ostvariti pogodan način komunikacije računara i
čipa, kako bi se rezultati rada sistema mogli videti a samim tim i proveriti.

39
Literatura

[1] Descriptions of SHA-256, SHA-384 and SHA-512, National Institute of


Standards and Technology

[2] Secure Hash Standard, Federal Information Processing Standards Pu-


blication 180-2, August 2002

[3] Applied Cryptography: Protocols, Algorithms and Source Code in C


2nd Edition, Bruce Schneier

[4] Classification and Generation of Disturbance Vectors for Collision At-


tacks against SHA-1, Stephanie Manuel, 2008

[5] 1076-1987 - IEEE Standard VHDL Language Reference Manual, 1988

[6] VHDL Primer, Jan Van der Spiegel, http://www.seas.upenn.edu/


~ese171/vhdl/vhdl_primer.html

[7] VHDL Reference Guide, Xilinx, Inc., 1999

[8] http://www.xilinx.com/

[9] Spartan-3E FPGA Starter Kit Board User Guide UG230 (v1.2), Jan.20,
2011

40
Prilog - Izvorni kôd

src1/MyPackage.vhd

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : MyPackage
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : MyPackage is a user defined VHDL
-- library package which contains
-- additional types and constants
-- declaration .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . all ;

package MyPackage is

-- definisanje tipa za stanja FSM


type state is ( idle , hashing , output );

-- definisanje tipa za deklaraciju signala H0 .. H7 i a , b .. h


-- odnosno za nizove od 8 clanova 32 bitnih podataka
type ArrayOfVectors is
array (0 to 7) of std_logic_vector (31 downto 0);

-- definisanje tipa za deklaraciju signala Wj

41
-- odnosno za nizove od 16 clanova 32 bitnih podataka
type MsgSchedule is
array (0 to 15) of std_logic_vector (31 downto 0);

-- inicijalne hash vrednosti , H0 .. H7


constant H_Init : ArrayOfVectors :=
( X "6 a09e667 " ,
X " bb67ae85 " ,
X "3 c6ef372 " ,
X " a54ff53a " ,
X "510 e527f " ,
X "9 b05688c " ,
X "1 f83d9ab " ,
X "5 be0cd19 ");
end MyPackage ;

42
src1/ConstantsROM.vhd

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : ConstantsROM
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : 32 bit ROM , with 64 constants which are
-- used for calculating the hash output
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;

entity ConstantsROM is
Port ( address : in STD_LOGIC_VECTOR (5 downto 0);
const : out STD_LOGIC_VECTOR (31 downto 0));
end ConstantsROM ;

architecture Behavioral of ConstantsROM is

begin
with address (5 downto 0) select
const <= x "428 a2f98 " when B "000000" ,
x "71374491" when B "000001" ,
x " b5c0fbcf " when B "000010" ,
x " e9b5dba5 " when B "000011" ,
x "3956 c25b " when B "000100" ,
x "59 f111f1 " when B "000101" ,
x "923 f82a4 " when B "000110" ,
x " ab1c5ed5 " when B "000111" ,

x " d807aa98 " when B "001000" ,


x "12835 b01 " when B "001001" ,
x "243185 be " when B "001010" ,
x "550 c7dc3 " when B "001011" ,
x "72 be5d74 " when B "001100" ,
x "80 deb1fe " when B "001101" ,

43
x "9 bdc06a7 " when B "001110" ,
x " c19bf174 " when B "001111" ,

x " e49b69c1 " when B "010000" ,


x " efbe4786 " when B "010001" ,
x "0 fc19dc6 " when B "010010" ,
x "240 ca1cc " when B "010011" ,
x "2 de92c6f " when B "010100" ,
x "4 a7484aa " when B "010101" ,
x "5 cb0a9dc " when B "010110" ,
x "76 f988da " when B "010111" ,

x "983 e5152 " when B "011000" ,


x " a831c66d " when B "011001" ,
x " b00327c8 " when B "011010" ,
x " bf597fc7 " when B "011011" ,
x " c6e00bf3 " when B "011100" ,
x " d5a79147 " when B "011101" ,
x "06 ca6351 " when B "011110" ,
x "14292967" when B "011111" ,

x "27 b70a85 " when B "100000" ,


x "2 e1b2138 " when B "100001" ,
x "4 d2c6dfc " when B "100010" ,
x "53380 d13 " when B "100011" ,
x "650 a7354 " when B "100100" ,
x "766 a0abb " when B "100101" ,
x "81 c2c92e " when B "100110" ,
x "92722 c85 " when B "100111" ,

x " a2bfe8a1 " when B "101000" ,


x " a81a664b " when B "101001" ,
x " c24b8b70 " when B "101010" ,
x " c76c51a3 " when B "101011" ,
x " d192e819 " when B "101100" ,
x " d6990624 " when B "101101" ,
x " f40e3585 " when B "101110" ,
x "106 aa070 " when B "101111" ,

x "19 a4c116 " when B "110000" ,


x "1 e376c08 " when B "110001" ,
x "2748774 c " when B "110010" ,
x "34 b0bcb5 " when B "110011" ,
x "391 c0cb3 " when B "110100" ,
x "4 ed8aa4a " when B "110101" ,
x "5 b9cca4f " when B "110110" ,
x "682 e6ff3 " when B "110111" ,

x "748 f82ee " when B "111000" ,

44
x "78 a5636f " when B "111001" ,
x "84 c87814 " when B "111010" ,
x "8 cc70208 " when B "111011" ,
x "90 befffa " when B "111100" ,
x " a4506ceb " when B "111101" ,
x " bef9a3f7 " when B "111110" ,
x " c67178f2 " when B "111111" ,

x "00000000" when others ;

end Behavioral ;

45
src1/Counter64.vhd

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : Counter64
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : 6 bit counter , with additional counting
-- flags .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . ALL ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;

entity Counter64 is
Port ( clk : in STD_LOGIC ;
reset : in STD_LOGIC ;
count : out STD_LOGIC_VECTOR (5 downto 0);
done_15 : out STD_LOGIC ;
done_63 : out STD_LOGIC
);
end Counter64 ;

architecture Behavioral of Counter64 is


signal output : std_logic_vector (5 downto 0);
begin
counter : process ( clk , reset )
begin
if ( reset = ’1 ’) then
output <= "000000";
done_15 <= ’0 ’;
done_63 <= ’0 ’;
elsif ( clk ’ event and clk = ’1 ’) then
if ( to_integer ( unsigned ( output )) >= 14) then
done_15 <= ’1 ’;
else

46
done_15 <= ’0 ’;
end if ;
if ( output = "111111") then
output <=( others = > ’0 ’);
done_63 <= ’1 ’;
else
output <= output + 1;
done_63 <= ’0 ’;
end if ;
end if ;
end process ;
count <= output ;
end Behavioral ;

47
src1/MainLoop.vhd

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : MainLoop
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : This module takes neccessary 32 bit
-- inputs , does appropriate calculations
-- and provides updated values to be used
-- in next round of iterations .
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . all ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;
use work . MyPackage . all ;

entity MainLoop is
Port ( W : in STD_LOGIC_VECTOR (31 downto 0);
K : in STD_LOGIC_VECTOR (31 downto 0);
a_h_in : in ArrayOfVectors ;
a_h_out : out ArrayOfVectors
);
end MainLoop ;

architecture Behavioral of MainLoop is

-- signali za privremene promenljive T1 i T2


signal T1 : std_logic_vector (31 downto 0);
signal T2 : std_logic_vector (31 downto 0);

-- signal za rezultat logicke funkcije Maj (a ,b , c )


signal Maj : std_logic_vector (31 downto 0):=( others = > ’0 ’);
-- signal za rezultat logicke funkcije Ch (e ,f , g )
signal Ch : std_logic_vector (31 downto 0):=( others = > ’0 ’);

48
-- signal za rezultat logicke funkcije Sigma0 ( a )
signal Sigma0 : std_logic_vector (31 downto 0):=( others = > ’0 ’);
-- signal za rezultat logicke funkcije Sigma1 ( e )
signal Sigma1 : std_logic_vector (31 downto 0):=( others = > ’0 ’);

begin

-- sracunavanje Maj (a ,b , c )= ( a ^ b ) xor ( a ^ c ) xor ( b ^ c )


Maj <= (( a_h_in (0) and a_h_in (1)) xor
( a_h_in (0) and a_h_in (2)) xor
( a_h_in (1) and a_h_in (2)));

-- sracunavanje Ch (e ,f , g )= ( e ^ f ) xor (~ e ^ g )
Ch <= (( a_h_in (4) and a_h_in (5)) xor
(( not a_h_in (4)) and a_h_in (6)));

-- sracunavanje Sigma0 = ( a ROR2 ) xor ( a ROR13 ) xor ( a ROR22 )


-- gde je ROR rotacija bita u desno
Sigma0 <=( a_h_in (0)( 1 downto 0) & a_h_in (0)(31 downto 2))
xor ( a_h_in (0)(12 downto 0) & a_h_in (0)(31 downto 13))
xor ( a_h_in (0)(21 downto 0) & a_h_in (0)(31 downto 22));

-- sracunavanje Sigma1 = ( e ROR6 ) xor ( e ROR11 ) xor ( e ROR25 )


-- gde je ROR rotacija bita u desno
Sigma1 <=( a_h_in (4)( 5 downto 0) & a_h_in (4)(31 downto 6))
xor ( a_h_in (4)(10 downto 0) & a_h_in (4)(31 downto 11))
xor ( a_h_in (4)(24 downto 0) & a_h_in (4)(31 downto 25));

-- sracunavanje vrednosti privremenih promenljivih T1 i T2


T1 <= a_h_in (7) + Sigma1 + Ch + K + W ;
T2 <= Sigma0 + Maj ;

-- sracunavanje naredne vrednosti promenljive ’e ’


a_h_out (4) <= T1 + a_h_in (3);

-- sracunavanje naredne vrednosti promenljive ’a ’


a_h_out (0) <= T1 + T2 ;

-- cuvanje sledecih vrednosti preostalih promenljivih


-- niz a_h_out ( i ) predstavlja promenljive a ,b ,.. h , gde
-- i =0 ,1..7. clan niza sa najmanjim indeksom je ’a ’ ,
-- dok je sa najvecim ’h ’

-- b = a
a_h_out (1) <= a_h_in (0);
-- c = b
a_h_out (2) <= a_h_in (1);
-- d = c
a_h_out (3) <= a_h_in (2);

49
-- f = e
a_h_out (5) <= a_h_in (4);
-- g = f
a_h_out (6) <= a_h_in (5);
-- h = g
a_h_out (7) <= a_h_in (6);

end Behavioral ;

50
src1/sha256.vhd

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- Company : School of Electrical Engineering ,
-- University of Belgrade
-- Engineer : Aleksandar Zujovic
--
-- Design Name : VHDL realisation of SHA -256 algorithm
-- Project Name : SHA256
-- Module Name : sha256
-- Target Device :
-- Tool versions : ISE Design Suite v14 .06
-- Description : This is the highes hierarchy level module
-- ( top module ) in this design . It
-- instantiates and connects all the other
-- modules , and provides additional
-- functionalities for the correct working
-- of the design
--
-- Revision :
-- Revision 0.01 - File Created
-- Additional Comments :
--
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
library IEEE ;
use IEEE . STD_LOGIC_1164 . ALL ;
use IEEE . NUMERIC_STD . ALL ;
use IEEE . S TD_ LO GI C_U NS IG NED . all ;
use work . MyPackage . all ;

entity sha256 is
Port ( clk : in STD_LOGIC ;
reset : in STD_LOGIC ;
msg : in STD_LOGIC_VECTOR (31 downto 0);
init : in STD_LOGIC ;
last : in STD_LOGIC ;
block_done : out STD_LOGIC ;
hash : out STD_LOGIC_VECTOR (255 downto 0);
hash_valid : out STD_LOGIC
);
end sha256 ;

architecture Behavioral of sha256 is

-- deklaracija komponente Counter


component Counter64
port ( clk : in std_logic ;

51
reset : in std_logic ;
count : out std_logic_vector (5 downto 0);
done_15 : out std_logic ;
done_63 : out std_logic
);
end component ;

-- deklaracija komponente ROM


component ConstantsROM
port ( address : in std_logic_vector (5 downto 0);
const : out std_logic_vector (31 downto 0)
);
end component ;

-- deklaracija komponente Main loop


component MainLoop
port ( W : in STD_LOGIC_VECTOR (31 downto 0);
K : in STD_LOGIC_VECTOR (31 downto 0);
a_h_in : in ArrayOfVectors ;
a_h_out : out ArrayOfVectors
);

end component ;

-- signali za stanje FSM


signal CurrentState , NextState : state ;

-- H0 .. H7 signali , medjurezultat hash - a


signal Hout : ArrayOfVectors ;
signal a_h_new : ArrayOfVectors ;
signal a_h_prev : ArrayOfVectors ;

-- pomocni signali za signalizaciju trenutne iteracije


signal done63 : std_logic ;
signal done15 : std_logic ;

-- dodatni signali za povezivanje sa MainLoop


signal Kmain : std_logic_vector (31 downto 0);
signal Wmain : std_logic_vector (31 downto 0);
signal a_h_main : ArrayOfVectors ;

-- dodatni signali za povezivanje sa Counter64


signal counter : std_logic_vector (5 downto 0);
signal count_reset : std_logic ;

-- pomocni signali za odredjivanje reda poruka


signal Wc : std_logic_vector (31 downto 0);
signal Wc1 : std_logic_vector (31 downto 0);
signal Wc2 : std_logic_vector (31 downto 0);

52
signal W : std_logic_vector (31 downto 0);

-- signal koji predstavlja red poruka , i pamti


-- prethodnih 16 vrednosti , tj . 16 x32bita
signal Wj : MsgSchedule ;

-- signali za logicke funkcije sigma0 i sigma1


signal sigma0 : std_logic_vector (31 downto 0);
signal sigma1 : std_logic_vector (31 downto 0);

begin

-- instanciranje 6 bitnog brojaca


Cnt : Counter64
port map ( clk = > clk ,
reset = > count_reset ,
count = > counter ,
done_15 = > done15 ,
done_63 = > done63
);
-- instanciranje ROM - a sa konst .
ROM : ConstantsROM
port map ( address = > counter ,
const = > Kmain
);
-- instanciranje main loop modula
main : MainLoop
port map ( W = > Wmain ,
K = > Kmain ,
a_h_in = > a_h_main ,
a_h_out = > a_h_new
);

-- operacije za pripremanje poruke za smestanje u red poruka


--
-- sigma0 = ( W (j -15) ROR7 ) xor ( W (j -15) ROR18 ) xor ( W (j -15) LSR3 )
-- gde je RORx rotacija u desno za x bita ,
-- a LSRx logicko pomeranje u desno za x bita
sigma0 <= ( Wj (14)(6 downto 0) & Wj (14)(31 downto 7)) xor
( Wj (14)(17 downto 0) & Wj (14)(31 downto 18)) xor
("000" & Wj (14)(31 downto 3));

-- sigma0 = ( W (j -2) ROR17 ) xor ( W (j -2) ROR19 ) xor ( W (j -2) LSR10 )


-- gde je RORx rotacija u desno za x bita ,
-- a LSRx logicko pomeranje u desno za x bita
sigma1 <= ( Wj (1)(16 downto 0) & Wj (1)(31 downto 17)) xor
( Wj (1)(18 downto 0) & Wj (1)(31 downto 19)) xor
("0000000000" & Wj (1)(31 downto 10));

53
Wc1 <= sigma0 + sigma1 ;
Wc2 <= Wj (6) + Wj (15);
-- pripremanje poruke za smestanje u red poruka . Ovaj podatak
-- se smesta u Wj ukoliko je broj iteracija veci od 15
Wc <= Wc1 + Wc2 ;

-- azuriranje masine stanja


update_fsm : process ( clk , reset )
begin
if ( reset = ’1 ’) then
CurrentState <= idle ;
elsif ( clk ’ event and clk = ’1 ’) then
CurrentState <= NextState ;
end if ;
end process ;

-- odredjivanje sledeceg stanja


next_state_logic : process ( CurrentState , a_h_prev ,W , Hout )
begin

-- DEFAULT VREDNOSTI
NextState <= CurrentState ;
count_reset <= ’1 ’;
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = > ( others = > ’0 ’));
hash_valid <= ’0 ’;
block_done <= ’0 ’;
hash_valid <= ’0 ’;
hash <= ( others = > ’0 ’);

case CurrentState is
when idle = >
-- u idle stanju brojac je zaustavljen ,
-- a u main loop se salju nulti podaci .
-- ukoliko so pojavi aktivan ulazni
-- signal init , prelazi se u hashing stanje
count_reset <= ’1 ’;
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = >( others = > ’0 ’));
if ( init = ’1 ’) then
NextState <= hashing ;
else
NextState <= idle ;
end if ;

when hashing = >


-- u hashing stanju aktivira se brojac ,
-- a u main loop se salju W , K kao i
-- a , b .. h , koji su pogodno odabrani u

54
-- drugim procesima
count_reset <= ’0 ’;
Wmain <= W ;
a_h_main <= a_h_prev ;
if ( done63 = ’1 ’) then
Wmain <= ( others = > ’0 ’);
a_h_main <= ( others = >( others = > ’0 ’));
block_done <= ’1 ’;

-- ako je zavrsen prethodni blok poruke , i ako


-- indikator ’ last ’ oznacava da je to bio poslednji
-- blok , prelazi se u stanje output . U suprotnom
-- nastavlja se sa prijemom poruka i hash - ovanjem
if ( last = ’1 ’) then
NextState <= output ;
else
NextState <= hashing ;
end if ;
elsif ( done63 = ’0 ’) then
count_reset <= ’1 ’;
a_h_main <= Hout ;
elsif ( count_reset = ’1 ’) then
count_reset <= ’0 ’;
a_h_main <= Hout ;
end if ;

when output = >


-- u output stanju , nadovezuju se 32 bitni registri
-- H0 .. H7 i salju na izlaz ’ hash ’ , i postavlja se
-- ’ hash_valid ’ na aktivan nivo , kako bi oznacio da
-- je hash poruke zavrsen . Bezuslovno se prelazi u
-- stanje idle
hash <= ( Hout (0) & Hout (1) & Hout (2)
& Hout (3) & Hout (4) & Hout (5)
& Hout (6) & Hout (7));
hash_valid <= ’1 ’;
NextState <= idle ;
when others = >
NextState <= idle ;
end case ;
end process ;

-- azuriranje medjurezultata hash vrednosti


update_Hout_proc : process ( clk , reset )
begin
if ( reset = ’1 ’) then
Hout <= H_Init ;
elsif ( clk ’ event and clk = ’1 ’) then

55
-- ako se prima prva poruka , H0 .. H7 , uzimaju inicijalne vrednosti
if ( init = ’1 ’) then
Hout <= H_Init ;
-- ako je zavrsena obrada trenutnog bloka od 512 bita , azuriraju se
-- H0 .. H7
elsif ( done63 = ’1 ’) then
Hout (0) <= a_h_prev (0) + Hout (0);
Hout (1) <= a_h_prev (1) + Hout (1);
Hout (2) <= a_h_prev (2) + Hout (2);
Hout (3) <= a_h_prev (3) + Hout (3);
Hout (4) <= a_h_prev (4) + Hout (4);
Hout (5) <= a_h_prev (5) + Hout (5);
Hout (6) <= a_h_prev (6) + Hout (6);
Hout (7) <= a_h_prev (7) + Hout (7);
end if ;
end if ;
end process ;

-- azuriranje radnih registara a , b .. h


update_a_h_proc : process ( clk , reset )
begin
if ( reset = ’1 ’) then
a_h_prev <= ( others = >( others = > ’0 ’));
elsif ( clk ’ event and clk = ’1 ’) then

-- ako je stigao prvi deo poruke a , b .. h uzimaju iste vrednosti


-- kao H0 .. H7
if ( init = ’1 ’) then
a_h_prev <= H_Init ;

-- ako je masina stanja u stanju hash - ovanja i zavrsen je


-- prethodni blok , u a , b .. h se smesta medjurezultat
-- prethodnog hash - ovanja
elsif ( CurrentState = hashing and count_reset = ’1 ’) then
a_h_prev <= Hout ;

-- ako je fsm u stanju hash - ovanja , a , b .. h uzimaju vrednosti


-- iz modula MainLoop , odnosno vrednosti sledece iteracije
elsif ( CurrentState = hashing ) then
a_h_prev <= a_h_new ;
end if ;
end if ;
end process ;

-- pripremanje reda poruka


msg_schedule : process ( clk , reset )
begin
if ( reset = ’1 ’) then
W <= ( others = > ’0 ’);

56
Wj <= ( others = >( others = > ’0 ’));
elsif ( clk ’ event and clk = ’1 ’) then

-- ako je broj iteracija manji od 16 u red poruka se


-- smestaju 32 bitni delovi koji pristizu
if ( done15 = ’0 ’ or done63 = ’1 ’) then
W <= Msg ;
Wj <= ( Msg & Wj ( Wj ’ LOW to Wj ’ HIGH -1));

-- u protivnom , smesta se poruka koja je prosla kroz


-- funkciju kompresije
elsif ( CurrentState = hashing ) then
W <= Wc ;
Wj <= ( Wc & Wj ( Wj ’ LOW to Wj ’ HIGH -1));
end if ;
end if ;
end process ;

end Behavioral ;

57

You might also like