Inhoudsopgave Inhoudsopgave ................................................................................................................ I Lijst van symbolen en gebruikte afkortingen .................................................................... III Figurenlijst.......................................................................................................................V Voorwoord.................................................................................................................... VII Inleiding ......................................................................................................................VIII Hoofstuk 1:
DES Algoritme............................................................................................1
1.1
Inleiding ...............................................................................................................1
1.2
Situering...............................................................................................................1
1.3
De sleutel .............................................................................................................3
1.3.1
Permutatie.....................................................................................................4
1.3.2
Schuiven .......................................................................................................4
1.3.3
Inkrimpen......................................................................................................5
1.4
De data ................................................................................................................6
1.4.1
De initiële permutatie .....................................................................................7
1.4.2
Expansiefunctie..............................................................................................7
1.4.3
Sommatie data sleutel (XOR) ..........................................................................8
1.4.4
Substitutieboxen (S1 tot S8) ...........................................................................8
1.4.5
De outputpermutatie ......................................................................................9
1.4.6
Data wissel ....................................................................................................9
1.5
Verschillende manieren van toepassen ................................................................. 10
1.6
Tripel -DES (3DES) .............................................................................................. 10
Hoofstuk 2:
Verschillende soorten attacks .................................................................... 12
2.1
Brute force attack................................................................................................ 12
2.2
Meet in the middle attack (MiTM) ......................................................................... 13
2.3
Timing attack ...................................................................................................... 14
2.4
Vermogen aanval ................................................................................................ 14
2.5
Elektromagnetische aanval................................................................................... 16
2.6
Besluit: Side channel attacks................................................................................ 16
Hoofstuk 3:
Gebruikt materiaal.................................................................................... 17
3.1
Waarom FPGA..................................................................................................... 18
3.2
Gebruik van VHDL ............................................................................................... 18
Hoofstuk 4:
Het opzetten van de meetopstelling........................................................... 20
I
4.1
Quartus .............................................................................................................. 20
4.2
Project navigator (ISE) ........................................................................................ 22
4.2.1
Omgeving.................................................................................................... 22
4.2.2
Beperking Spartan3e .................................................................................... 25
4.2.3
Belangrijke code .......................................................................................... 27
4.3
Xilinx Platform Studio (XPS) ................................................................................. 29
4.3.1
Tutorials ...................................................................................................... 29
4.3.2
Verschillende type bestanden binnen een project ........................................... 31
4.3.3
Creëren van een DES IP ............................................................................... 32
4.3.4
Virtex II pro................................................................................................. 36
4.3.5
Sleutels via RS232 inlezen ............................................................................ 36
4.4
Modelsim ............................................................................................................ 38
4.4.1
De simulaties ............................................................................................... 40
4.4.2
Vanuit XPS................................................................................................... 42
Hoofstuk 5:
De stroommeting...................................................................................... 45
5.1
Inleiding ............................................................................................................. 45
5.2
Schakelende voeding als bron .............................................................................. 46
5.3
Synchronisatie puls.............................................................................................. 47
5.4
Meting via scoop ................................................................................................. 48
5.5
Geïsoleerd meten ................................................................................................ 48
5.5.1
High Side Current Sensing (HSCS)................................................................. 49
5.5.2
Current probe .............................................................................................. 50
5.6
Problemen bij stroommeting ................................................................................ 52
Hoofstuk 6:
Besluit ..................................................................................................... 55
6.1
Wat is verwezenlijkt ............................................................................................ 55
6.2
Wat nog te doen ................................................................................................. 55
Verklarende woordenlijst ................................................................................................ 56 Literatuurlijst ................................................................................................................. 57 Bijlagen ...........................................................................................................................1 De 8 verschillende substitutieboxen .................................................................................1 Testdes.vhd ...................................................................................................................2 Simulation library compilation..........................................................................................5 Hoe een nieuw IP aanmaken......................................................................................... 10 User_logic.vhd ............................................................................................................. 12 Application_code.c........................................................................................................ 15 II
Lijst van symbolen en gebruikte afkortingen Ω
Ohm
µ
Micro, 10-6
3DES
Tripel -DES
A
Ampère
ASIC
Application specific integrated circuit
BIT
Binary digit
DES
Data encryption standard
DPA
Differential power analysis
DS
Data strobe
EDK
Embedded development kit
EEF
Electronic frontier foundation
FPGA
Field programmable gate array
GND
Gronding, aarding, massa
GPIO
General purpose I/O
GUI
Graphical user interface
HDL
Hardware description language
Hz
Hertz (frequentie per seconde)
I/O
Input / output
IC
Integrated circuit
IP
Integrated peripheral
ISE
Integrated software environment
MHS
Microprocessor hardware specification
MiTM
Meet in the middle
MSS
Microprocessor software specification
MB
Megabytes per seconde
n
Nano, 10-9
OPB
On-chip peripheral bus
PGP
Pretty good privacy
III
PPC
PowerPC
R
Weerstand
SABL
Sense-amplifier based logic
TB
Test bench
UCF
User constraint file
UUT
Unit under test
SoC
System on chip
SPA
Simple power analysis
UART
Universal asynchronous receiver transmitter
V
Voltage
VHDL
VHSIC hardware description language
VHSIC
Very high speed integrated circuit
W
Watt
XPS
Xilinx platform studio
IV
Figurenlijst Figuur 1-1 : Benodigde tijd decryptie.................................................................................2 Figuur 1-2 : XOR van deelsleutel met datadeel...................................................................8 Figuur 1-3 : Wisselen van data..........................................................................................9 Figuur 2-1 : DES Cracker circuit board, ontwikkeld bij Electronic Frontier Foundation ......... 12 Figuur 2-2 : Lading capaciteit opladen, ontladen of behouden........................................... 15 Figuur 2-3 : Schema vermogen aanval ............................................................................ 15 Figuur 2-4 : Spoel gebruikt bij elektromagnetische aanval ................................................ 16 Figuur 3-1 : XUP ontwikkelborden (SPARTAN 3e, VirtexIIpro) ........................................... 17 Figuur 3-2 : Xilinx Platform Studio en Project navigator .................................................... 17 Figuur 3-3 : Digitale oscilloscoop ..................................................................................... 17 Figuur 3-4 : Stroommeter ............................................................................................... 17 Figuur 4-1 : Quartus simulatie van de Basic DES core....................................................... 20 Figuur 4-2 : DES block cipher calculator........................................................................... 20 Figuur 4-3 : Quartus uitgangen via DES core ................................................................... 21 Figuur 4-4 : Omdraaien uitgang DES core encrypt / decrypt ............................................. 21 Figuur 4-5 : Uitgangen op het bord ................................................................................. 22 Figuur 4-6 : Project navigator ......................................................................................... 22 Figuur 4-7 : PACE tool .................................................................................................... 23 Figuur 4-8 : Modelsim starten vanuit ISE ......................................................................... 24 Figuur 4-9 : iMPACT configureer tool ............................................................................... 24 Figuur 4-10 : Number of bounded IO's (Spartan3e).......................................................... 25 Figuur 4-11 : Number of bounded IO's (VirtexIIpro)......................................................... 25 Figuur 4-12 : Switches, drukknoppen en LED's................................................................. 26 Figuur 4-13 : 5kHz kloksignaal ........................................................................................ 28 Figuur 4-14 : OPB model Spartan 3e ................................................................................ 30 Figuur 4-15 : Nieuw project aanmaken met XPS............................................................... 31 Figuur 4-16 : Een stuk uit het PBD bestand...................................................................... 31 Figuur 4-17 : Systeem versus applicatie........................................................................... 32 Figuur 4-18 : Overzicht automatisch gegenereerde DES bestanden ................................... 33 Figuur 4-19 : Schema SoC structuur ................................................................................ 34 Figuur 4-20 : Registers in SoC......................................................................................... 34
V
Figuur 4-21 : Blokdiagram VirtexIIpro ............................................................................. 36 Figuur 4-22 : Sleutel via rs323 inlezen ............................................................................. 37 Figuur 4-23 : Een succesvolle compilatie met Modelsim .................................................... 39 Figuur 4-24 : Dataflow van des56.vhd in simulatie ........................................................... 39 Figuur 4-25 : DES simulatie via Modelsim ........................................................................ 40 Figuur 4-26 : Simulatie bij gebruik van buttons of switches............................................... 42 Figuur 4-27 : Signaal toevoegen in Modelsim ................................................................... 43 Figuur 4-28 : Pattern wizard modelsim ............................................................................ 43 Figuur 5-1 : Draadweerstand .......................................................................................... 45 Figuur 5-2 : IO voltage ................................................................................................... 46 Figuur 5-3 : Voedingsschema 1.5V .................................................................................. 47 Figuur 5-4 : Meting met scoop ........................................................................................ 48 Figuur 5-5 : High side current sensing IC......................................................................... 49 Figuur 5-6 : Meting aan de high side – low side ............................................................... 50 Figuur 5-7 : Tektronix TM502A........................................................................................ 50 Figuur 5-8 : Tektronicx A6302 meetprobe........................................................................ 51 Figuur 5-9 : Stroomverbruik door FPGA –core .................................................................. 51 Figuur 5-10 : 50kHz FFT ................................................................................................. 52 Figuur 5-11 : Interne kloksignalen................................................................................... 52 Figuur 5-12 : Passief band -doorlaatfilter ......................................................................... 53 Figuur 5-13 : Demping in functie van de frequentie.......................................................... 53 Figuur 5-14 : Spanningsverandering in functie van de frequentie ...................................... 54
VI
Voorwoord Dit eindwerk werd ondernomen in opdracht van de Hogeschool West – Vlaanderen departement PIH te Kortrijk voor het behalen van het diploma Industrieel Ingenieur Elektronica optie ICT, afstudeerrichting Multimedia en Informatietechnologie. Ik wil hierbij de mensen en de organisatie bedanken die mij gedurende de periode van het eindwerk hebben gesteund en geholpen. Vooreerst mijn oprechte dank aan Johan Beke en Danaë Delbeke, mijn eindwerk –promotoren, voor de hulp en steun gedurende de eindwerk periode. Daarnaast bedank ik Marc Windels en de andere docenten van de Provinciale Industriële Hogeschool, voor hun raad en steun. Tenslotte nog een speciaal woord van dank aan mijn ouders omdat ze mij de kans gaven deze studies te volgen en voor hun morele steun.
VII
Inleiding Dit eindwerk is hoofdzakelijk opgesplitst in twee grote delen, namelijk: A) Het DES algoritme configureren in een FPGA en het opzetten van een testopstelling. B) Via vermogenmetingen het algoritme proberen te kraken. A) Het configureren van de FPGA bestaat erin dat we een VHDL file met het DES algoritme compileren zodat dit onafhankelijk op de chip draait. Dit kan verwezenlijkt worden via “system on chip” (SoC), waarbij een architectuur wordt opgesteld of via ISE waarbij enkel de encryptie –core in de FPGA wordt geconfigureerd . Hierbij is het voor beide manieren de bedoeling dat er op een bepaalde frequentie telkens één encryptie/decriptie plaatsvindt. B) De vermogenmeting bestaat erin de mogelijkheden te onderzoeken voor het meten van het vermogen die de <
> en <<de verschillende I/O banken>> van de FPGA verbruiken. Ook is het de bedoeling zelf een aantal metingen uit te voeren. Volgend jaar zal hieraan een nieuw eindwerk gekoppeld worden, waarbij de gemeten waarden verder zullen worden verfijnd en geanalyseerd.
VIII
Hoofstuk 1: DES Algoritme Allereerst zal ik dieper ingaan op het DES algoritme om hier een beter inzicht in te krijgen.
1.1 Inleiding DES (Data Encryption Standaard) is een algoritme wat gebruikt wordt voor de beveiliging van computergegevens. Het is een “cryptografisch” algoritme dat in 1977 als standaard werd gedefinieerd. Onder een encryptie algoritme verstaan we een algoritme welke informatie aan de zijde van de zender versleutelt, maar DES kan tevens als decryptie algoritme worden gebruikt. Dit betekent dat hetzelfde algoritme kan coderen en decoderen, tevens houdt dit in dat zowel beide, zender en ontvanger, hetzelfde algoritme draaien wat ervoor zorgt dat het relatief eenvoudig blijft.
1.2 Situering De keuze voor het specifieke gebruik van encryptie en de implementatie van DES wordt door veel factoren bepaald. Over het algemeen wordt cryptografie gebruikt voor het beschermen van data die tussen 2 partijen wordt verstuurd, maar het kan ook gebruikt worden voor het fysisch beschermen van opgeslagen data (bestanden) tegen bijvoorbeeld diefstal. Vermits het kraken van het DES algoritme via “brute force” reeds dikwijls met succes is uitgevoerd, zal het niet gebruikt worden om fysische data zoals bestanden te beschermen . Men kan het wel gebruiken voor het beschermen van data die tijdens, bijvoorbeeld een gesprek verstuurd wordt. Hierbij moet opgemerkt worden dat de verstuurde data na enige tijd weinig betekenisvol wordt. Anders houdt dit alsnog risico’s in. Een risico analyse is raadzaam om mogelijke bedreigingen in kaart te brengen. De kost om deze of andere standaarden toe te passen, dient goed afgewogen te worden, ten opzichte van de veiligheid die moet geboden worden. Hieruit zal dan een keuze gemaakt worden welke overeenstemt met de noden van de toepassing.
1
Opmerking: We merken dat een decryptie van 64 bit ongeveer 200 nsec in beslag neemt. Er worden dus 5 miljoen decrypties utgevoerd in 1 seconde. Dit wil dus zeggen dat we per seconde ongeveer 320 miljoen bits kunnen verwerken, wat overeenkomt met 305.1 MB data. Dit duidt onmiddellijk het grote voordeel aan om een encryptie decryptie/encryptie algoritme in hardware uit te werken.
Figuur 1-1 : Benodigde tijd decryptie
Testen hebben uitgewezen dat wanneer we 1000 maal na elkaar encrypteren met een VirtexII bord, met als FPGA klokfrequentie 24Mhz, dit 6,9 ms tijd in beslag neemt. Wanneer we dezelfde test doen met behulp van software (C++), met een 100Mhz processor, dit 252 ms tijd in beslag neemt. Hieruit blijkt het grote voordeel van een hardware versie, deze is maar liefst 36 maal sneller ten opzichte van de software geïmplementeerde DES core. We houden hierbij geen rekening met de klokfrequenties, waaruit we kunnen besluiten dat de software versie eigenlijk meer dan 100 maal trager is [1]. Hieronder doorlopen we der verschillende bewerkingen die de sleutel en de data ondergaan gedurende een volledige encryptie of decryptie.
[1]
David Pellerin en Milan Saini, FPGA and Structured ASIC Jounal, FPGAs Provide Acceleration for Software Algorithms: http://www.fpgajournal.com/articles/impulseC.htm
2
1.3 De sleutel De sleutel is voor een geautoriseerde gebruiker noodzakelijk om de geëncrypteerde computerdata te kunnen ontsleutelen. Het is enkel de sleutel die ervoor zal zorgen dat het algoritme een unieke versleuteling oplevert. Een andere sleutel zou een volledig ander resultaat opleveren. De veiligheid van het algoritme is dus met andere woorden, afhankelijk van de veiligheid waarmee de sleutel wordt behandeld. Iedereen die in het bezit komt van de sleutel kan in combinatie met het algoritme de data ontcijferen. Daarom zal een standaard algoritme, om sleutels uit te wisselen, worden gebruikt waarbij de sleutel enkel wordt bezorgd aan diegene die de data mogen verkrijgen. Nu zal ik de verschillende stappen die de sleutel ondergaat kort overlopen. Sleutel 56 bits + 8bit pariteit
Permutatie
B
A 28 bits
28 bits
Schuiven
Schuiven Inkrimpen
56 bits
Sleutel (ronde 1)
48 bits
Schuiven
Schuiven Inkrimpen
56 bits
Sleutel (ronde 2)
48 bits
Schuiven
Schuiven
56 bits
Inkrimpen
Sleutel (ronde 16)
48 bits
3
1.3.1 Permutatie De sleutel bestaat uit 64 binaire waarden (“0” of “1”) waarvan er 56 willekeurig worden gegenereerd en onmiddellijk door het algoritme worden gebruikt. De andere 8 bits, die niet door het algoritme worden aangewend, worden gebruikt voor foutcontrole. De 8 bits worden bepaald door oneven pariteit. De 8 pariteit bits worden weggelaten en de resterende 56 bits worden vervolgens gepermuteerd. 01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
50
43
36
29
22
15
08
01
51
44
37
30
23
16
09
02
52
45
38
31
24
17
10
03
53
46
39
32
56
49
42
35
28
21
14
07
55
48
41
34
27
20
13
06
54
47
40
33
26
19
12
05
25
18
11
04
A = 28 bit B = 28 bit
1.3.2 Schuiven A en B gaan nu door 16 ronden om een deelsleutel te bepalen waarbij telkens 1 bit of 2 bits naar links verschoven wordt. Na elke shift worden A en B terug bijeengebracht tot 56 bits 50
43
36
29
22
15
08
01
51
44
37
30
23
16
09
02
52
45
38
31
24
17
10
03
53
46
39
32
56
49
42
35
28
21
14
07
55
48
41
34
27
20
13
06
54
47
40
33
26
19
12
05
25
18
11
04
A = 28 bit B = 28 bit
Ronde nummer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Aantal shifts
1
1
2
2
2
2
2
2
1
2
2
2
2
2
2
1
4
1.3.3 Inkrimpen Het resultaat van het schuiven wordt per ronde gepermuteerd. We zien dat de gekleurde nummers niet worden opgenomen. Hierdoor wordt dus een sleutel verkregen die 8 bits kleiner is, met andere woorden 48 bits (56-8). 01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
14
17
11
24
01
05
41
52
31
37
47
55
03
28
15
06
21
10
30
40
51
45
33
48
23
19
12
04
26
08
44
49
39
56
34
53
16
07
27
20
13
02
46
42
50
36
29
32
Hierbij moet er wel opgemerkt worden dat deze permutatie per ronde verschillend is!
5
1.4 De data Nadat de sleutel opgesplitst is in 16 deelsleutels, ondergaat ook het datadeel een aantal vormveranderingen. De te versleutelen tekst wordt opgesplitst in blokken van 64 bits die één na één worden versleuteld. Hier worden de verschillende stappen die de data ondergaat kort overlopen.
Initiële Permutatie 64 bits
Rechts
Links
32 bits
32 bits
Expansie
Expansie
48 bits
48 bits
Deelsleutel (Ronde X) 48 bits
8 x 6 bits
S1
S2
S3
S4
S5
S6
S7
S8
8 x 4 bits
Output Permutatie 32bits
OUT 64bits
6
1.4.1 De initiële permutatie De initiële permutatie zal net als bij de sleutel, de individuele bits onderling door elkaar gooien. 01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
16
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Links
58
50
42
34
26
18
10
02
60
52
44
36
28
20
12
04
32 bit
62
54
46
38
30
22
14
06
64
56
48
40
32
24
16
08
Rechts
57
49
41
33
25
17
09
01
59
51
43
35
27
19
11
03
32 bit
61
63
45
37
29
21
13
05
63
55
47
39
31
23
15
07
1.4.2 Expansiefunctie Het rechtse en linkse deel van de data worden elk afzonderlijk uitgebreid tot 48 bits. Dit gebeurt door een aantal bits dubbel te gebruiken. 01
02
03
04
32
01
02
03
04
05
05
06
07
08
04
05
06
07
08
09
09
10
11
12
08
09
10
11
12
13
13
14
15
16
12
13
14
15
16
17
17
18
19
20
16
17
18
19
20
21
21
22
23
24
20
21
22
23
24
25
25
26
27
28
24
25
26
27
28
29
29
30
31
32
28
29
30
31
32
01
7
1.4.3 Sommatie data sleutel (XOR) De 48 data bits worden modulo 2 gesommeerd met de deelsleutel die per ronde verschillend is. Zowel de deelsleutels van elke ronde als rechter –en linkerhelft van de data zijn 48 bit. Deelsleutel S
S⊕D
Deel Data D S
D
OUT
0
0
0
0
1
1
1
0
1
1
1
0
Figuur 1-2 : XOR van deelsleutel met datadeel
1.4.4 Substitutieboxen (S1 tot S8) De 48 bits wordt verdeeld in acht groepen van 6 bits. Elke groep van 6 bits gaat doorheen een S-box (matrix), waarbij deze tot slechts 4 bits worden gereduceerd. Het gaat als volgt tewerk, we nemen de twee buitenste bits van de 6 bits die we aanbieden aan de substitutiebox. Dit levert het rijnummer op. Voor het kolomnummer zullen we de vier middelste bits nemen, bijvoorbeeld “111000” zal als rij “10” ofwel 2 opleveren en voor de kolom “1100” ofwel 12 wat een gemeenschappelijk element 3 levert en aldus “0011”. 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
14
4
13
1
2
15
11
8
3
10
6
12
5
9
0
7
1
0
16
7
4
14
2
13
1
10
6
12
11
9
5
3
8
2
4
1
14
8
13
6
2
11
15
12
9
7
3
10
5
0
3
15
12
8
2
4
8
1
7
5
11
3
14
10
0
6
13
Hierbij moet er opgemerkt worden dat per substitutiebox deze tabel verschillend is!
[Zie bijlage voor de verschillende substitutieboxen]
8
1.4.5 De outputpermutatie De output van de 8 Substitutieboxen is: 8 x 4 = 32 bits. Deze bits worden opnieuw gepermuteerd. 01
02
03
04
16
7
20
21
05
06
07
08
29
12
28
17
09
10
11
12
1
15
23
26
13
14
15
16
5
18
31
10
17
18
19
20
2
8
24
14
21
22
23
24
32
27
3
9
25
26
27
28
19
13
30
6
29
30
31
32
22
11
4
25
1.4.6 Data wissel Hierna wordt er nog een exclusieve OR toegepast op de 32 bits van de outputpermutatie samen met het andere deel van de sleutel waar we niet mee gewerkt hebben (ook 32 bits). Stel dat we het rechter datadeel verwerkt hebben dan zouden we hiermee samen met het linker deel van de data, een XOR functie uitvoeren. De uitkomst hiervan nemen we dan als nieuw rechter deel van de data. Het oude rechter deel wordt het nieuwe linker deel van de data.
Figuur 1-3 : Wisselen van data
In de laatste 16de ronde worden deze beide delen dan terug samengevoegd tot out –data welke bestaat uit 64 bits.
9
1.5 Verschillende manieren van toepassen Er zijn meerdere manieren om de DES standaard toe te passen: −
Electronic Codebook (ECB) mode
−
Cipher Block Chaining (CBC) mode
−
Cipher Feedback (CFB) mode
−
…
ECB is het toepassen van het DES algoritme zoals de standaard het definieert om data te ontsleutelen en te versleutelen. CBC en CFB zijn manieren waarbij de versleutelde boodschap, in combinatie van andere data, als input voor het genereren van een pseudo random output. Er zijn nog andere varianten mogelijk, maar ik ga hierover niet uitwijden, voor meer informatie verwijs ik naar de volgende link [2].
1.6 Tripel -DES (3DES) Om de sleutellengte en daarmee ook de veiligheid van DES te vergroten, heeft men een manier bedacht waarbij drie DES algoritmes na elkaar geschakeld zijn. Dit wordt 3 DES of Tripel –DES genoemd en wordt vooral gebruikt bij Pretty Good Privacy (PGP). Het onderscheidt zich van het gewone DES - algoritme doordat het drie maal na elkaar DES toepast.
Versleutelen:
(((boodschap )VS1 )VS 2−1 )VS3 = versleuteldeboodscha p
Ontsleutelen:
VS1−1 (VS 2 (VS 3−1 (versleuteldeboodscha p ))) = boodschap
Praktisch kunnen er zowel twee of drie verschillende sleutels gebruikt worden. Twee verschillende sleutels (2 x 56bits = 112 bits) acht men voldoende veilig voor e -commerce toepassingen. −1
((boodschap )VS1 )VS 2 ) = versleuteldeboodschap [2]
Federal Information Processing Standards Publication, DES modes of operation, 1980: http://www.itl.nist.gov/fipspubs/fip81.htm
10
Deze methode heeft nog een groot pluspunt, namelijk de neerwaartse compatibiliteit met het standaard DES algoritme. Het is namelijk ook mogelijk om met één sleutel te werken. Dit komt doordat men achtereenvolgens versleutelt, ontsleutelt en terug versleutelt. Stel dat we een oude DES encryptie core dienen te koppelen met een nieuwe decryptie core, dan wordt de ene sleutel van de oude encryptie -core gekoppeld aan de drie verschillende sleutels van de nieuwe decryptie -core. Het resultaat zal identiek hetzelfde blijven!
Versleutelen: Ontsleutelen:
(boodschap )VS1 = versleuteldeboodschap ((versleutel deboodscha p )VS 1−1 )VS1 )VS 1−1 = boodschap
Het resultaat is dus een gewone DES versleuteling die uiteraard wat meer rekentijd zal vragen. Het grote voordeel hiervan is dus dat dezelfde apparatuur en programmatuur kan gebruikt blijven.
11
Hoofstuk 2: Verschillende soorten attacks Elk algoritme bezit een aantal mindere punten. Dit kan men best zo goed mogelijk in kaart brengen. Het onderzoek naar deze zwakheden van een algoritme noemen we cryptoanalyse. Reeds jaar en dag zijn verschillende mensen bezig geweest met het ontcijferen van versleutelde boodschappen, in de volksmond beter gekend als kraken. Onder kraken verstaan we het ontcijferen van versleutelde boodschappen die voor iemand anders bestemd zijn. Kraken van het DES algoritme is al lang geen fabeltje meer. Uit het verleden is meermaals gebleken dat door veel rekenkracht te combineren, we relatief eenvoudig een versleutelde boodschap (ook wel “cipher” genaamd) zonder de sleutel te kennen, kunnen ontcijferen door gebruik te maken van bijvoorbeeld een “brute force attack” [3].
2.1 Brute force attack Een “brute force attack” bestaat erin dat we een grote hoeveelheid sleutels uitproberen. Hier wordt dus niet de onderliggende logica van het algoritme gebruikt. Het spreekt voor zich dat dit een intensief proces is. Daarom is het nuttiger om een andere manier te zoeken waarbij de verwerking veel minder tijd in beslag neemt.
Figuur 2-1 : DES Cracker circuit board, ontwikkeld bij Electronic Frontier Foundation [3]
Computable nr 32, AM, Hackers kraken 56 bit DES sleutel:,p10 [8 -08-1997] http://www.computable.nl/artikels/archief7/d32ag7qi.htm
12
Het EFF heeft een machine met 18000 chips ontwikkeld ter waarde van 250.000$ die door middel van brute force het DES algoritme in een aantal dagen kan kraken. Op de foto zien we de verschillende “Deep Crack” chips op de print [4]. De tijd die men nodig heeft voor het kraken van DES via deze manier, versneld steeds weer waardoor we er regelmatig rekening mee dienen te houden dat de sterkte van het algoritme sowieso verlaagt met de tijd. Voor een 56 bit sleutel was het mogelijk om met een pentium II - 200MHZ reeds 1 miljoen sleutels per seconde te verwerken, een pentium III 500MHz kon 5.3 miljoen sleutels per seconde verwerken … De kans van het berekenen van de juiste sleutel kan dus sterk veranderen in de tijd. Wetende dat we met 256 ofwel 72.057.594.037.927.936 mogelijke sleutels hebben. De haalbaarheid van het berekenen van één enkele sleutel is in normale omstandigheden zeer onwaarschijnlijk. Als bovendien de sleutel regelmatig wordt gewijzigd, dan wordt het risico van kraken sterk gereduceerd. Desondanks moeten de gebruikers erop gewezen worden dat het theoretisch mogelijk is om de sleutel te vinden door een berekend aantal sleutels te testen. De kans op slagen is hierbij dan wel lager dan wanneer alle sleutels getest worden.
2.2 Meet in the middle attack (MiTM) Deze aanval bestaat erin langs twee zijden tegelijk te beginnen met versleutelen en ontsleutelen. Dit kan enkel plaatsvinden indien we zowel de originele boodschap als de versleutelde boodschap in ons bezit hebben. Bijvoorbeeld bij 2DES-versleuteling:
((boodschap )VS1 )VS 2 = versleutel deboodscha p of anders gezegd
VS1 (boodschap ) = x = VS 2−1 (versleuteldeboodscha p ) We versleutelen de boodschap met alle mogelijke waarden van S1 ( 2 56 ). We ontsleutelen de versleutelde boodschap met alle mogelijke waarden van S 2 ( 2 56 ). [4]
Electronic frontier foundation: http://www.eff.org/
13
We vergelijken indien er zich een overeenkomst voordoet, de te versleutelen boodschap met
S1 en de te ontsleutelen versleutelde boodschap met S 2 . Indien we nu voor beiden eenzelfde
x bekomen, dan hebben we de juiste sleutels in ons
bezit. De moeite om 2DES te kraken via MitM is ongeveer dezelfde als een gewone brute krachtaanval op DES. Om MiTM -aanval te vermijden wordt 3DES gebruikt.
2.3 Timing attack Deze aanval bestaat erin dat men meet hoeveel tijd er nodig is voor bepaalde berekeningen. De verwerkingstijd kan afhangen van lusstructuren, geheugen toegangen, processor instructies … . Statistische modellen kunnen opgesteld worden om de sleutelbit met enige zekerheid te bepalen. Bijvoorbeeld: We berekenen y = xa mod n voor verschillende waarden van x waarbij we a constant houden. We houden hier de verwerkingstijd bij. De instructies zijn bijvoorbeeld machtsverheffing en vermenigvuldiging. De sleutel a is r bits breed. We hebben zéér veel berekeningen opgenomen in een statistiek. Als we nu merken dat de tijd nodig om sleutels die als eerste bit 0 hebben, bijna dezelfde verwerkingstijd bezitten, dan kunnen we ervan uitgaan dat de sleutel begint met 0 en omgekeerd. We kunnen zo doorgaan tot we alle bits overlopen hebben en zo een sleutel samenstellen. Een oplossing zou kunnen zijn door tijdsvertragingen in te voegen en of door tijdsegalisatie toe te passen, zodat alle instructies dezelfde verwerkingstijd vergen.
2.4 Vermogen aanval Deze aanval is gebaseerd op het verwerken van een logische 1 of 0. Bij het overgaan van een 0 naar een 1 en het overgaan van een 1 naar een 0 zal er meer stroom vloeien, dan wanneer we de bit op 1 of 0 houden.
14
Figuur 2-2 : Lading capaciteit opladen, ontladen of behouden
De stroom die we opmeten is een maat voor het vermogen, vermits de spanning relatief constant blijft. Het is dus eigenlijk de bedoeling om het stroomverbruik te meten.
Figuur 2-3 : Schema vermogen aanval
Dit type aanval wordt ook “Simple Power Analysis” (SPA) genoemd. Een andere manier is bijvoorbeeld wanneer men een afwijking in de sleutel zal aanbrengen en de effecten hiervan bestudeerd worden. Dit noemt men Differential Power Analysis (DPA). Differential Fault Analysis (DFA) is dan weer het wijzigen van de omgevingsvariabelen tijdens de encryptie en dan te kijken welke effecten wanneer optreden. We kunnen deze aanval tegengaan door het verbruik niet te laten afhangen van de sleutel. Dus ervoor zorgen dat alle rondes een gelijke hoeveelheid stroom verbruiken. Deze logica voor een constant verbruik noemt men ook wel “sense -amplifier based logic” (SABL). Dit bestaat uit exact één oproep per klokcyclus en is onafhankelijk van de binnenkomende data. Gedurende een oproep wordt de op –en ontlaad lading van de interne capaciteiten uitgemiddeld. Dit vereist wel de beschikbaarheid van de macrocel bibliotheken.
15
2.5 Elektromagnetische aanval Hierbij wordt de elektromagnetische straling van een IC gemeten door middel van een zeer klein gewikkelde spoel.
3mm
Figuur 2-4 : Spoel gebruikt bij elektromagnetische aanval
Hier zal spanning een maat zijn van d φ / dt. Deze vorm van aanval kan vermeden worden door ervoor te zorgen dat de spanning zo laag mogelijk is of door veel ruis bij het spanningssignaal te genereren zodat metingen worden bemoeilijkt.
2.6 Besluit: Side channel attacks Het is belangrijk de volgende zaken in te zien: −
Cryptografisch veilige systemen kunnen worden gekraakt door middel van side channel attacks.
−
Deze aanvallen zijn gebaseerd op eenvoudige metingen.
−
De aanvallen zijn gemakkelijk toepasbaar op verschillende zelfs nog ongekende algoritmes.
−
Bij het opzetten van een cryptografisch veilig systeem is er veel coördinatie vereist tussen zowel, hardware en software ontwikkelaars.
16
Hoofstuk 3: Gebruikt materiaal Het configureren van de FPGA is uitgevoerd met een Xilinx Spartan 3 en een XUP VIRTEX-II PRO bord dat door de school ter beschikking is gesteld.
Figuur 3-1 : XUP ontwikkelborden (SPARTAN 3e, VirtexIIpro)
Figuur 3-2 : Xilinx Platform Studio en Project navigator
Figuur 3-3 : Digitale oscilloscoop
Figuur 3-4 : Stroommeter
17
3.1 Waarom FPGA Het uiteindelijke ontwerp van een cryptografische core hoeft men niet in een FPGA te configureren, men kan dit ook in een ASIC plaatsen. Dit is een IC welke voor specifieke doelen wordt gebruikt, maar niet kan gebruikt worden voor configuratie. Indien we de stroom zouden opmeten bij een FPGA, dan is reeds bewezen dat het verbruik van de stroom nauwelijks zal afwijken ten opzichte van wanneer het design zou geïmplementeerd zijn in een ASIC [5]. Daarboven heeft een FPGA veel extra voordelen zoals de in circuit herconfigureerbaarheid, de flexibiliteit, de portabiliteit … kortom gebruiksgemak.
3.2 Gebruik van VHDL Er bestaan in de elektronicawereld twee grote standaarden voor het beschrijven van hardware, de Europese variant is VHDL en de Amerikaanse taal is VERILOG. De onderlinge programmeertalen verschillen niet zo heel veel van elkaar, maar wegens onze voorkennis is er gekozen voor VHDL om het elektronische systeem te modeleren [6]. Het algoritme dat is gebruikt, is de “Basic DES Crypto Core”, die te vinden is op de website van opencores [7]. Deze core bezit een aantal specifieke in -en uitgaande, aanspreekbare signalen : IN
RST
Een puls zal alle interne signalen resetten.
IN
INKEY
Dit is een 64 bits input welke wordt verwacht klaar te staan op de stijgende flank van de data strobe (DS).
IN
INDATA
Dit is een 64 bits input welke wordt verwacht klaar te staan op de stijgende flank van de DS.
IN
DECRYPT
Indien 1 zal de DES -core ontsleutelen, bij een 0 zal deze versleutelen, dit signaal wordt verwacht klaar te staan op de stijgende flank van de DS.
[5]
Nele Mentens,Pieter Rommens en marian Verhelst, cryptografische chips, Het ingenieursblad 1-2 (2005) p54-59
[6]
An introductory VHDL tutorial: http://www.gmvhdl.com/VHDL.html
[7]
website van opencores: http://www.opencores.org/projects.cgi/web/basicdes/overview
18
IN
DS
Wanneer deze kort 1 is, dan is de input data klaar op de bus en kan er gestart worden met een encryptie of decryptie.
UIT
OUTDATA
Uitgang van de core zal de waarde behouden tot volgende keer dat het RDY signaal 1 wordt.
UIT
RDY
Indien hoog, dan is de core idle en klaar om nieuwe input te ontvangen.
UIT
RDY_NEXT_ Indien 1 dan is de OUTDATA geldig en beschikbaar.
19
Hoofstuk 4: Het opzetten van de meetopstelling 4.1 Quartus Om ons ervan te vergewissen dat het algoritme geen fouten vertoonde is het gesimuleerd in een simulatie programma van Altera waarmee ik vertrouwd ben. Hierin kunnen zonder enige configuratie de signalen ingesteld worden. Deze genereren dan zonder enig probleem een output.
Figuur 4-1 : Quartus simulatie van de Basic DES core
We kunnen hierbij reeds een aantal belangrijke opmerkingen maken. Het aantal klokpulsen dat nodig is om een encryptie te voltooien is gelijk aan 13, hierna wordt de data op de uitgang gezet en is de encrytie voltooid. We kunnen hier nog iets zeer belangrijk opmerken, (wat ik op dat moment nog niet doorhad) wanneer we de “outdata” vergelijken met hetgeen we verifiëren via een java applet dan merken we op dat de verkregen data vanuit Quartus niet correct is [8].
Figuur 4-2 : DES block cipher calculator
[8]
DES calculator: http://www.unsw.adfa.edu.au/~lpb/src/DEScalc/DEScalc.html
20
Mijn idee was dat de data omgekeerd of geïnverteerd werd aangeboden, maar dit blijkt niet het geval te zijn. Nochtans vertrekken beiden van dezelfde standaard DES –core.
QUARTUS – INGANG NORMAAL INDATA 66377F06B3BB1D8D INKEY 965A83E333997352 OUT DATA (decipher=1) 33728CC112982B34 OUT DATA (decipher=0) 530130140686D435 QUARTUS – INGANG NORMAAL + GEINVERTEERD INDATA 99C880F94C44E272 INKEY 69A57C1CCC668CAD OUT DATA (decipher=1) CC8D733EED67D498 OUT DATA (decipher=0) ACFECFEBF9792BCA QUARTUS – INGANG INDATA INKEY OUT DATA (decipher=1) OUT DATA (decipher=0)
OMGEDRAAID B1B8DDCD60FEEC66 4ACE99CCC7C15A69 755F2E8FBBDC9319 4E8BC8DF259CABBB
QUARTUS – INGANG OMGEDRAAID + GEINVERTEERD INDATA 8E4722329F011399 INKEY B5316633383EA596 OUT DATA (decipher=1) 93C13372C44B57B6 OUT DATA (decipher=0) 05FDFCA39CED6A0B Figuur 4-3 : Quartus uitgangen via DES core
Het is pas nadat de uitgangen omgekeerd waren dat er een overeenkomst te zien was en dit bleek onmiddellijk. Nadat we bij de versie waar de ingangen omgedraaid waren, ook de uitgang omdraaienden, bekwamen we het juiste resultaat.
4E8BC8DF259CABBB
0100111010001011110010001101111100100101100111001010101110111011
DDD539A4FB13D172
1101110111010101001110011010010011111011000100111101000101110010
755F2E8FBBDC9319
0111010101011111001011101000111110111011110111001001001100011001
98C93BDDF174FAAE
1001100011001001001110111101110111110001011101001111101010101110
Figuur 4-4 : Omdraaien uitgang DES core encrypt / decrypt
Dit was op zich al een grote stap voorwaarts in de goede richting.
21
4.2 Project navigator (ISE) De project navigator bestaat erin enkel een VHDL bestand te verwerken zonder rekening te houden met alle andere dingen die noodzakelijk zijn om bijvoorbeeld een SoC structuur op te zetten. Hierdoor kan dus de DES –core recht toe, rechtaan geïmplementeerd worden in de FPGA.
Figuur 4-5 : Uitgangen op het bord
Het leuke hieraan is dat je makkelijk alle uitgangen van de core kan koppelen aan fysische uitgangen van het bord, waardoor je dus onmiddellijk feedback krijgt.
4.2.1 Omgeving De omgeving is relatief ingewikkeld, maar went snel.
Figuur 4-6 : Project navigator
22
Links boven zijn alle bestanden te vinden. Volledig onderaan zie je steeds het console venster met mogelijke warnings en errors. Links onderaan bevinden zich de mogelijke verwerkingsstappen en rechts bevindt zich het editeer venster. Alles wat linksonder staat wordt toegepast op het bestand wat rechtsboven geselecteerd is! Zo kan je bijvoorbeeld gemakkelijk door op “edit constraints” te dubbelklikken de pinallocatie openen van bijvoorbeeld “testdes.vhd”, in tekstmode. Dit ziet er dan als volgt uit.
.
.
.
.
.
.
.
.
.
.
0
Data_out<59>
Output
K5
BANK6
LVTTL
N/A
3.30
Unknown
0
0
Data_out<60>
Output
K3
BANK6
LVTTL
N/A
3.30
Unknown
0
0
Data_out<61>
Output
L3
BANK6
LVTTL
N/A
3.30
Unknown
0
.
.
.
.
.
.
.
.
.
.
Voor de correcte pin codes verwijs ik naar de UCF bestanden die te downloaden zijn [9]. Dit is ook gemakkelijk via een externe tool op te stellen. Deze impliceert een foutcontrole waardoor je in het bronbestand onmogelijk typfouten kunt maken, waardoor je het bestand mogelijks onbruikbaar zou kunnen maken.
Figuur 4-7 : PACE tool [9]
Digilent Virtex-II Pro Development System: http://www.digilentinc.com/Products/Detail.cfm?Nav1=Products&Nav2=Programmable&Prod= XUPV2P
23
We kunnen zeer makkelijk vanuit de project navigator een modelsim project starten via “Simulate post-place and route”. Dit wordt uitgebreider besproken in het hoofdstuk 4.4 Modelsim.
Figuur 4-8 : Modelsim starten vanuit ISE
Het uitvoeren van “Configure device” zal ervoor zorgen dat volgende tool wordt opgeroepen. Nu zal er een .bit bestand worden gegenereerd welke gebruikt wordt binnen de iMPACT tool.
Figuur 4-9 : iMPACT configureer tool
24
Het komt erop neer dat enkel de laatste FPGA zal worden geconfigureerd. De eerste twee zullen we bypassen. Deze FPGA dient echter van het correcte type te zijn, anders zal het resulteren in een error. Hier in ons geval is het de “xc2vp30”. Opmerking: Hierbij dient wel te worden opgemerkt dat deze tool zich volledig onafhankelijk gedraagt van de project navigator (ISE), waardoor er dikwijls foute verwijzigen naar foutieve mappen van een vorig project als default worden opgeslagen.
4.2.2 Beperking Spartan3e We merken dat bij het Spartan bord het aantal IO -bounds tot 110% bezet is (overmapped).
Figuur 4-10 : Number of bounded IO's (Spartan3e)
Dit wil met andere woorden zeggen dat het veronderstelde circuit niet kan worden opgezet in deze FPGA. Na compilatie wordt er een “mapping error” gegenereerd. Daarentegen bij de virtexIIpro bedraagt dit slechts 12%, wat ruim voldoende is.
Figuur 4-11 : Number of bounded IO's (VirtexIIpro)
25
Nadat uiteindelijk alles juist ingesteld en geconfigureerd was, werd niet de juiste output op de IO pinnen verkregen. Het was pas hier dat duidelijk bleek, dat er iets fout was met de structuur en de manier van denken. Op dat moment ben ik op mijn stappen teruggekeerd en zijn er mij allerlei zaken steeds duidelijker geworden. Mijn eerste versie bestond erin om via de switchen op het bord een encryptie onder controle te krijgen (zet data klaar, encrypt of decrypt, reset). Later bleek dat dit onmogelijk was vermits we de switchen niet op enkele picoseconde kunnen verzetten. Doordat een puls té lang duurde gaf de DES -core steeds weer foute data. Dit alles geld ook voor de aanwezige drukknoppen. Voor meer informatie zie “Simulatie switches” in het hoofdstuk 4.4 Modelsim. Ook was het niet onmiddellijk tot mij doorgedrongen dat de switchen drukknoppen en led’s laag actief waren.
Figuur 4-12 : Switches, drukknoppen en LED's
26
4.2.3 Belangrijke code Met behulp van deze case structuur zorg ik ervoor dat de signalen op elk specifiek moment onder controle zijn. Hierdoor kan ik dezelfde waarden aanleggen op exact dezelfde momenten zoals dit bij Quartus het geval is.
…
when x"0" => rst_sig <= '1'; next_state_sig <= x"1"; when x"1" => next_state_sig <= x"2"; when x"2" => rst_sig <= '0'; next_state_sig <= x"3"; when x"3" => data_in_sig <= x"66377F06B3BB1D8D"; key_in_sig <= x"965A83E333997352"; next_state_sig <= x"C"; when x"C" => next_state_sig <= x"D"; when x"D" => ds_sig <= '1'; next_state_sig <= x"E"; when x"E" => next_state_sig <= x"F"; when x"F" => ds_sig <= '0'; --------pauze om te (de)coderen---------------------------------------count:=count+1; if count=25 then count:=0; next_state_sig <= x"0"; else next_state_sig <= x"F"; end if; --------pauze om te (de)coderen---------------------------------------when others =>
…
next_state_sig <= x"0";
Om een signaal van 5kHz te verkrijgen dienen we het originele “systeem kloksignaal” dat draait tegen 5MHz, te delen door 1000. Dit moet worden toegepast om ervoor te zorgen dat we de stroom gemakkelijk en correct kunnen opmeten. Anders zou het niet mogelijk zijn om via “high side current measurement” een meting te verrichten aangezien deze IC’s slechts een maximale werkfrequetie hebben van 1700kHz [10]. [10]
Datasheet MAX 4173: http://pdfserv.maxim-ic.com/en/ds/MAX4173F-MAX4173T.pdf
27
Het zou anders mogelijks vervorming in het patroon van de stroom kunnen veroorzaken.
… process(clk) variable clkcount : integer range 0 to 1000 :=0; begin if rising_edge(clk) then clkcount:=clkcount+1; if clkcount=1000 then workclk_sig <= NOT workclk_sig; clkcount:=0; end if; end if; end process; …
We zien 5 µsec per divisie, wat een periode van 200 µsec levert en overeenkomt met een kloksignaal van :
1 200 μ sec
=
1 = 5kHz 0,0002
Figuur 4-13 : 5kHz kloksignaal
28
4.3 Xilinx Platform Studio (XPS) Dit is de ontwikkelomgeving van XILINX waarmee we de FPGA zullen configureren. Het bevat een grote keuze aan tools zoals wizards. Deze zorgen ervoor dat we snel en eenvoudig van start kunnen gaan, door het mogelijks toevoegen van “Integrate Peripherals” (IP’s), “General purpose I/O” (GPIO) interfaces, bibliotheken, applicaties, … Nu kunnen we aan het grote werk beginnen om een “System on Chip” (SoC) te creëren. De onderliggende technologie zorgt ervoor dat zowel hardware en software gemakkelijk herbruikt kunnen worden, alsook de geïmplementeerde modules en IP’s. Hierdoor wordt de “time to market” en de “testfase” aanzienlijk ingekort. Er zijn 2 grote verschillen bij Xilinx, namelijk het werken met een microblaze of nog met een PowerPC (PPC). Microblaze is een software processor core, welke geconfigureerd wordt op de FPGA zelf. Het nadeel hiervan is dat deze zelf al een groot deel van de FPGA in beslag zal nemen, waardoor er maar weinig plaats meer overblijft voor de werkelijke configuratie. Dit is namelijk het geval bij de Spartan die er gebruikt is. In tegenstelling hiermee bezit de virtexIIpro reeds 2 fysische PowerPC procesoren (400MHz) waardoor het niet meer nodig is met een softcore zoals de microbaze te werken.
4.3.1 Tutorials Voordat er met het werkelijke configureren van de FPGA begonnen is, hebben we een aantal handleidingen gevolgd, waarbij het de bedoeling is dat men hoofdzakelijk vertrouwd raakt met de manier van werken, inzichten verwerft en gewend raakt aan de user interface. Hieronder zien we het algemene model dat wordt gecreëerd bij het genereren van een nieuw project. Al deze componenten kunnen al dan niet gekozen worden. Achteraf bestaat dan de mogelijkheid om een nieuw “MY IP” aan te maken. Hierin zullen we ons algoritme huisvesten samen met nog een aantal bestanden waarmee we de koppeling op de “On-chip peripheral bus” (OPB Bus) zullen maken. De OPB bus is opgebouwd uit een aantal signalen specifiek bedoelt voor arbitrage, data overdracht en direct memory access (DMA), welke de communicatie met de processor onderhouden.
29
Universal
OPB Bus
Asynchronous Receive/Transmit Module
MDM
UART
MicroBlaze LMB BRAM Cntlr
Interrupt
INTC
LMB BRAM Cntlr
Controller Timer
BRAM GPIO
PSB
Push
On-chip block memory 7Seg LED
MY My IP IP
GPIO
LEDs
GPIO
SWs
Buttons
Figuur 4-14 : OPB model Spartan 3e
We kunnen bovenstaande structuur perfect genereren door de “base system builder” op te starten. Eerst kiezen we het type bord dat we gebruiken. Daarna kiezen we de processor die we wensen te gebruiken en kunnen we eveneens de klokfrequentie wijzigen. Vervolgens kan gekozen worden welke GPIO blokken, zoals bijvoorbeeld de UART, we wensen toe te voegen aan het project.
30
Figuur 4-15 : Nieuw project aanmaken met XPS
4.3.2 Verschillende type bestanden binnen een project Het “microprocessor hardware specification” (MHS) bestand bevat de instellingen van het embedded processor systeem, waaronder informatie omtrend de bussen, peripherals, processors, verbindingen, en de voorziene adresseringsruimte. Het “Microprocessor software specification” (MSS) bestand bevat daartegenover instellingen in verband met de benodigde drivers. Het “processor block diagram” (PBD) geeft een visueel overzicht weer van de componenten en de verbindingen op de verschillende bussen en signalen binnenin de FPGA.
Figuur 4-16 : Een stuk uit het PBD bestand
31
Hier zal nu kort de werkwijze overlopen worden hoe tewerk gegaan wordt om het DES algoritme als SoC op een FPGA te laten draaien.
4.3.3 Creëren van een DES IP We kunnen in een project een aantal verschillende onderdelen aanduiden. Er zijn twee grote onderdelen te onderscheiden, namelijk de configuratie en opbouw van de gebruikte componenten of anders gezegd de tab “systeem” en de toepassing (in C) die hierop geschreven is. Deze is te vinden onder de tab “application”.
Figuur 4-17 : Systeem versus applicatie
[Zie bijlage voor het aanmaken van een nieuw IP] Daarna moet dit nieuwe IP worden toegevoegd aan het project. Dit kan je doen door in de project menu “add/edit cores” te kiezen en de peripheral toe te voegen. Vervolgens worden deze als slave aan de OPB –bus verbonden en een adresrange toegekend. Uiteindelijk dienen we de signalen van het IP te verbinden met de andere signalen.
32
Daarna moeten de bronbestanden, in ons geval het VHDL bestand (des56.vhd) worden toegevoegd aan het IP. Nu dienen enkel nog de voorgegenereerde bestanden aangepast te worden.
Figuur 4-18 : Overzicht automatisch gegenereerde DES bestanden
Het bestand “DES.vhd” zullen we niet wijzigen, het bevat de nodige signalen en logica om de core op de bus te koppelen. Het bestand “des56.vhd” zullen we eveneens ongemoeid laten. Vermits we reeds weten dat het foutloos functioneert, zullen we alle koppelingen tussen deze twee bestanden opnemen in het “user_logic.vhd” bestand, zoals duidelijk in onderstaand schema te zien is.
33
opb_opb_abus (adresbus) opb_opb_dbus (databus) DES.vhd
Slv_reg0
Slv_reg1
User Logic
Des56
vhd
vhd
Slv_reg2
Slv_reg3
Slv_reg4
adresdec
Read
oder
not
Out data
Command
Status
In data In key
write Figuur 4-19 : Schema SoC structuur
Adres decimaal
Adres
Register
hexadecimaal
Lees van bus
Schrijf naar bus
Schrijf naar DES
Lees van DES
0
00
Slv_reg0
Indata (0 – 31)
Outdata (0 – 31)
4
04
Slv_reg1
Indata (32 – 63)
Oudata (32 – 63)
8
08
Slv_reg2
Inkey (0 – 31)
Status
12
0C
Slv_reg3
Inkey (32 – 63)
16
10
Slv_reg4
Command
Figuur 4-20 : Registers in SoC
Alle 5 registers zijn nodig voor het schrijven naar het DES IP. De adresdecoder zal telkens één van de 5 bits op 1 zetten. Hierdoor zal afwisselend de aangevoerde data van op de bus in de registers worden gekopieerd. Deze manier wordt gebruikt voor zowel schrijven naar, als lezen van de OPB –bus.
34
… case slv_reg_write_select is -- alle 5 registers nodig voor schrijven naar IP when "10000" =>
-- telkens 1 van de 5bits die op 1 staat
for byte_index in 0 to (C_DWIDTH/8)-1 loop --regX wordt opgesplitst per byte if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg0(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; …
In het begin had ik niet opgemerkt dat de registers slv_reg
x ook weer bij het overzetten
van de bus in het register omgedraaid werden. Dus wanneer ik de DES core probeerde aan te sturen via het slv_reg4 -of command register, gebeurde er niets. Het is niet makkelijk om deze fout te detecteren omdat dit register namelijk 32 bits breed is. En we slechts 4 bits gebruiken. Bit 31 = Command(0) = decipher Bit 30 = Command(1) = ds Bit 29 = Command(2) = rst Bit 28 = Command(3) = clk De overblijvende bits zijn altijd 0 waardoor uiteraard de DES –core op dat moment geen kik gaf. Handiger zou zijn indien je slechts 5 bits zou nemen zodat de core sowieso wel zou reageren ook al wordt de inhoud omgedraaid. We gebruiken in plaats van de interne klok, een zelf gegenereerde klok die we in het “command” register meegeven, om vervolgens bij de DES core te worden gebruikt.
… --clk clk
=> Bus2IP_Clk, => slv_reg4(28),
…
35
4.3.4 Virtex II pro We hebben gezien dat het Spartan 3 e bord te klein is om het algoritme volledig in op te nemen. Vandaar dat we overgeschakeld zijn op het VirtexIIpro bord. Het is volledig gelijklopend met het Spartan bord.
Figuur 4-21 : Blokdiagram VirtexIIpro
Het grote verschil bestaat erin dat de hoeveelheid plaats die beschikbaar is en de frequentie waarmee deze kan draaien, verschillen. Er zijn ook nog een aantal extra bussen, maar hiervan wordt geen gebruik gemaakt door het DES -IP.
4.3.5 Sleutels via RS232 inlezen Het is de bedoeling dat we de stroom gaan meten en de resultaten verwerken. Hierbij kan ervoor gezorgd worden dat de sleutels en data op voorhand zorgvuldig kan worden samengesteld. Er moet dus een manier voorzien worden waarbij men op gegeven tijdstippen data en sleutels kan invoeren. Hierbij is er gebruik gemaakt van de functie “inbyte()”
key[0] ='0'; key[1] ='x'; while (ch != 0x0d && k < 10) { key[k] = inbyte();
36
xil_printf("%c",key[k]); xil_printf("xint %x",tempi); k++; } xil_printf("\r\n\r\n key = %s \r\n",key); tempi = key; xil_printf("\r\n\r\n temp = %x \r\n",tempi);
Figuur 4-22 : Sleutel via rs323 inlezen
Het is de bedoeling dat hiervoor later een programma geschreven zal worden om automatisch de voorziene data en sleutels op te geven. We zien dat de status op 0 staat. Dit is volledig normaal vermits deze een puls op hun signaal uitsturen waardoor we op het moment van uitsturen via de rs232 geen 1 meer terugkrijgen, maar reeds de teruggevallen waarde 0. Opmerking: Status(0) = rdy_next_next_cycle Status(1) = rdy_next_cycle Status(2) = rdy
37
4.4 Modelsim Dit programma is van Mentor Graphics. Het is een volledig onafhankelijk simulatiepakket. Quartus is daarentegen een geïntegreerde omgeving van Altera. Modelsim bestaat als het ware enkel uit het simulatie deel van Quartus. Indien je een bepaalde configuratie compileert dan zal modelsim hiervan een .vhw bestand maken, waarin een “Test Bench” (TB) en “Unit Under Test” (UUT) van de core wordt opgesteld.
uut: des56 PORT MAP( indata => imsg0, inkey => ikey, outdata => odata, decipher => dec, ds => ds, clk => clk, rst => reset, rdy => ready); -- *** Test Bench - User Defined Section *** tb : PROCESS BEGIN wait for 100ns; reset <= '1'; dec <= '0'; ds <= '0'; wait until clk = '0'; reset <= '0'; wait until clk = '1'; ikey <= x"965A83E333997352"; imsg0 <= x"66377F06B3BB1D8D"; wait for 3ns; ds <= '1'; wait until clk = '1'; ds <= '0'; wait; -- ----------------------------------
Indien de simulatie succesvol is verlopen dan zal er een grote blauwe pijl staan naast de code “simulation successful (not a failure)”.
38
Figuur 4-23 : Een succesvolle compilatie met Modelsim
Het is mogelijk om op elk moment te kijken wat de bits intern zijn, in om het even welk stuk van de vhdl – code. Dit is mogelijk via het dataflow venster. Dit kan handig zijn indien je een specifieke interne waarde in de DES core zou willen weten.
Figuur 4-24 : Dataflow van des56.vhd in simulatie
Tot hiertoe is de interpretatie van deze structuur niet nodig gebleken.
39
4.4.1 De simulaties Hierna volgen een aantal uitgevoerde simulaties. Deze zijn volledig analoog met degene die uitgevoerd zijn met Quartus, maar met die uitzondering dat in deze gevallen de input -en output bits niet moeten worden omgedraaid, om correct te zijn.
4.4.1.1
Enkel decryptie
Dit is de volledig werkende toestand van de DES –core, zoals deze zich in het ideale geval voordoet.
Figuur 4-25 : DES simulatie via Modelsim
Dit alles kunnen we automatiseren in een DO -file. Hierbij worden de signalen toegevoegd en ingesteld. De simulatie wordt uitgevoerd tot 3000ns. des56.do add wave -hex /indata add wave -hex /inkey add wave -hex /outdata add wave /decipher add wave /ds 40
add wave /clk add wave /rst add wave /rdy force clk 0 0,1 50 -repeat 100 force indata 16#99C880F94C44E272 force inkey 16#69A57C1CCC668CAD force rst 0 0,1 65,0 220 force decipher 0 force ds 0 0,1 320,0 550 run 3000
4.4.1.2
Afwisselend encryptie – decryptie
Dit is de volledig werkende toestand van de DES –core, waarbij we achtereenvolgens encrypteren, decrypteren, …
Dit alles kunnen we weer automatiseren in een DO -file. add wave -hex /data_out add wave /clk add wave /rdy add wave /rdy_next_cycle add wave /rdy_next_next_cycle add wave /outdata force clk 0 0,1 50 -repeat 100 force rst 0 0,1 65,0 220 run 3000
41
4.4.1.3
Simulatie switches
Indien we simuleren wat er gebeurde toen we de DES –core bestuurden aan de hand van de buttons of switches, dan merken we hier op dat de data strobe niet snel genoeg terug naar 0 gaat. Anders gezegd, er is reeds een encryptie voltooid voordat de data strobe weer laag komt. Dit heeft tot gevolg dat de DES –core vastloopt (rdy blijft hoog), waardoor we een foutief resultaat verkrijgen.
Figuur 4-26 : Simulatie bij gebruik van buttons of switches
4.4.2 Vanuit XPS Een simulatie kan ook gestart worden vanuit de Xilinx Platform Studio, maar hierbij moet er wel rekening gehouden worden met het feit dat dan alle gebruikte bibliotheken handmatig moeten worden toegevoegd. [Zie bijlage voor compileren van de simulatie bibliotheken] Daarna dient het geheel gecompileerd te worden. Vervolgens kunnen we het geheel tot en met de user_logic mee compileren. Hierna kunnen we de signalen aanleggen en simuleren zoals we gewend zijn.
42
Eerst voegen we een signaal toe.
Figuur 4-27 : Signaal toevoegen in Modelsim
Daarna gaan we het toegevoegde signaal een waarde geven in de tijd.
Figuur 4-28 : Pattern wizard modelsim
43
Dit alles kunnen we ook weer automatiseren in een DO -file. restart -f -nolist -nowave -nolog -nobreak -novirtuals -noassertions add wave -hex sim:/des/user_logic_i/indata_sig force -freeze sim:/des/user_logic_i/indata_sig 1001100111001000100000001111100101001100010001001110001001110010 add wave -hex sim:/des/user_logic_i/inkey_sig force -freeze sim:/des/user_logic_i/inkey_sig 0110100110100101011111000001110011001100011001101000110010101101 add wave sim:/des/user_logic_i/outdata_sig add wave sim:/des/user_logic_i/status add wave sim:/des/user_logic_i/slv_reg0 add wave sim:/des/user_logic_i/slv_reg1 add wave sim:/des/user_logic_i/slv_reg2 add wave sim:/des/user_logic_i/slv_reg3 add wave sim:/des/user_logic_i/slv_reg4 wave modify -driver freeze -pattern constant -value 00000000000000000000000000000000 -range 0 31 -starttime 0ns -endtime 10ns sim:/des/user_logic_i/slv_reg4 wave modify -driver freeze -pattern constant -value 00100000000000000000000000000000 -range 0 31 -starttime 11ns -endtime 20ns Edit:/des/user_logic_i/slv_reg4 wave modify -driver freeze -pattern constant -value 10000000000000000000000000000000 -range 0 31 -starttime 21ns -endtime 30ns Edit:/des/user_logic_i/slv_reg4 wave modify -driver freeze -pattern constant -value 11000000000000000000000000000000 -range 0 31 -starttime 31ns -endtime 40ns Edit:/des/user_logic_i/slv_reg4 wave modify -driver freeze -pattern constant -value 10000000000000000000000000000000 -range 0 31 -starttime 41ns -endtime 1000ns Edit:/des/user_logic_i/slv_reg4 add wave sim:/des/opb_clk wave modify -driver freeze -pattern clock -initialvalue U -period 2ns -dutycycle 50 -starttime 0ns -endtime 1000ns sim:/des/opb_clk run 1000
44
Hoofstuk 5: De stroommeting 5.1 Inleiding Het is de bedoeling de stroom te meten die gedissipeerd wordt binnenin de FPGA. Stroom kunnen we meten met bijvoorbeeld een multimeter, maar hiermee zijn we niets. We wensen dit namelijk in functie van de tijd te doen. Vandaar dat we verplicht zijn een scoop te gebruiken. Nochtans is het onmogelijk om stroom op deze manier te meten, omdat met een oscilloscoop geen stroom, maar spanning te meten is! Om dit te verhelpen kunnen we een trucje toepassen. We zullen een kleine weerstand in de schakeling aanbrengen waardoor we over de weerstand een spanning verkrijgen die evenredig is met de verbruikte stroom in de achterliggende belasting (FPGA - schakeling). Opmerking : Bij de weerstand dienen we rekening te houden met het feit dat deze voldoende stroom moet kunnen verdragen. Dit type schakelende voeding kan een stroom tot 6 Ampères leveren. Het is dus wenselijk dat we hier een voldoende vermogen weerstand nemen. Een draadweerstand is een mogelijke optie.
Figuur 5-1 : Draadweerstand
Indien we even het tekensommetje maken, dan merken we al gauw indien de FPGA een stroom van maximum 6A opneemt en we een weerstand van 50mΩ nemen, deze bestand moet zijn tegen P = R X I2 = 0,05 X 62= 1,8 W. Hierbij dienen we op te letten voor overgangsverschijnselen. Weerstanden die voldoende grote vermogens kunnen verdragen, draadweerstanden, bezitten een inductief karakter.
45
Dit inductieve karakter zou voor vervormingen van het signaal kunnen zorgen. Het streefdoel hierbij is dat we de vervorming zo klein mogelijk houden. Dit kunnen we doen door bijvoorbeeld de klokfrequentie te verlagen. Indien we hiermee geen rekening houden zullen er mogelijks vervormingen optreden.
5.2 Schakelende voeding als bron Er stelt zich een probleem indien we de stroom van een FPGA wensen te meten, namelijk in het circuit diagram van het gebruikte XUP bord, merken we op dat er verschillende spanningsbronnen aanwezig zijn onder de vorm van drie schakelende stabilisatoren.
Dit voor 3.3 Volt, 2.5 Volt,1.5 Volt respectievelijk: TPS54616 TPS54615
3-V TO 6-V INPUT, 6-A OUTPUT
TPS54613
De 3.3 V wordt gebruikt voor de IO pinnen van spanning te voorzien De 2.5 V wordt gebruikt voor de IO pinnen van spanning te voorzien De 1.2 V wordt gebruikt om de core van stroom te voorzien
Figuur 5-2 : IO voltage
46
Figuur 5-3 : Voedingsschema 1.5V
We zien in het bovenstaande schema dat er gedacht is aan mogelijks (extra) vereiste stroommetingen ten behoeve van mogelijk onderzoek. Het zijn deze jumperpinnen die gebruikt zijn om de meet -probe aan te bevestigen.
5.3 Synchronisatie puls Het Sync signaal dat we zullen gebruiken, komt in de DES -core overeen met de DataStrobe. Dit signaal zal een puls geven wanneer de data en de sleutel aan de ingang klaar staan voor verwerking. Dit signaal zullen we gebruiken om de scoop te trigeren en zodoende een stilstaand beeld weer te geven. Een andere manier zou kunnen zijn dat we werken met een geheugenscoop, maar dan nog hebben we een synchronisatie puls als trigger -signaal nodig.
47
5.4 Meting via scoop We dienen er wel rekening mee te houden dat we onmogelijk op een normale manier een scoop kunnen aansluiten. Bij een scoop zijn namelijk de meetklemmen intern met elkaar verbonden. De krokodillenklemmen van alle probes zijn namelijk verbonden met de ground of beter gezegd massa. Indien we nu over twee IC’s tegelijk zouden meten, dan veroorzaken we een kortsluiting met de ground, met alle gevolgen vandien.
Scoop 1.52V
3.42V
R
R
1.49V
3.29V
Figuur 5-4 : Meting met scoop
Hier zouden we dus een grote fout maken door de twee probes over twee weerstanden te plaatsen. Indien we zomaar zouden meten, creëren we aan de ene zijde van de weerstandsklemmen, een kortsluiting enerzijds met de massa en anderzijds binnen het circuit zelf. Dit kunnen we oplossen door geïsoleerd te meten.
5.5 Geïsoleerd meten Er moet een stroom gemeten worden, dit is niet te verwezenlijken enkel en alleen door een weerstand tussen bron en belasting te plaatsen en hierover te meten. Het is de bedoeling om geïsoleerd te meten zodat er geen kortsluitingen optreden intern binnenin het circuit, die de FPGA –core voedt : Isolated Current Measurement.
48
5.5.1 High Side Current Sensing (HSCS) Dit is een goedkope manier om gescheiden van de bronspanning een stroomverbruik om te zetten in een spanning die vervolgens af te lezen is op een scoop. Je moet wel opletten dat er hier als R SENSE een kleine weerstand wordt gebruikt. Anders zal er teveel spanning over de weerstand en dus ook minder over de belasting staan. Ook moet gedacht worden aan het feit dat een FPGA veel stroom verbruikt. Dus de weerstand moet een zeker vermogen hebben als we weten dat de gedissipeerde stroom in een xilinx virtexIIpro meerdere ampères kan bedragen.
Figuur 5-5 : High side current sensing IC
Het grote voordeel van deze manier van werken is dat we gemakkelijk drie IC’s op één print samen kunnen verwezenlijken waardoor we alle metingen samen op de scoop kunnen vergelijken. Opmerking: Het is de bedoeling dat we niet aan de massa zijde (Low side) meten, maar aan de Vcc. Indien we toch een weerstand aan de massa zijde zouden plaatsen dan zouden we een vertekend beeld kunnen waarnemen. Alle spanningsbronnen op het bord maken gebruik van dezelfde massa. Hierdoor zou de stroom niet een functie zijn van het verbruik van één bron, maar een verdeling van de verschillende bronnen.
49
Vdd Vcc FPGA Vbb
High side R R R I
R Low side Figuur 5-6 : Meting aan de high side – low side
Wegens het laattijdig toekomen van de bestelde IC’s was er geen tijd meer om dit in de praktijk om te zetten.
5.5.2 Current probe
Figuur 5-7 : Tektronix TM502A
Dit toestel bestaat uit een ringkern die doormiddel van een mechanisch schuifcontact over een geïsoleerde draad kan worden geschoven. Het nadeel van dit toestel is dat er slechts één stroom tegelijk kan worden gemeten.
50
Opgelet: De probe bezit een pijl die aanduidt dat de stroomrichting positief is indien de stroom in dezelfde richting vloeit als de zin van de pijl. Daardoor zal dus ook de afgelezen spanning al dan niet negatief zijn.
Figuur 5-8 : Tektronicx A6302 meetprobe
Nadat we het toestel afgesteld hebben, merken we dat het stroomverbruik een aantal samengestelde frequenties vertoond.
Figuur 5-9 : Stroomverbruik door FPGA –core
We dienen ook op te merken dat, wanneer we alle bits van de data en of de sleutel allemaal op 0 of 1 instellen er tot dusver geen duidelijk onderscheidbaar verschil op te merken is.
51
Figuur 5-10 : 50kHz FFT
5.6 Problemen bij stroommeting Dit kan liggen aan een aantal mogelijkheden namelijk: Vooreerst meten we de ingangsstroom van de gehele FPGA op, wat er dus voor zorgt dat we onmogelijk alleen het stroomverbruik van het DES algoritme kunnen waarnemen. Na wat opzoekwerk merken we dat er zich verschillende klokgenerators in de FPGA bevinden welke we niet onder controle hebben, deze vergen op hun beurt ook stroom. De oscillator bronnen zelf maken gebruik van de 3.3V .
Figuur 5-11 : Interne kloksignalen
52
Daarnaast zien we dat de bron bestaat uit het IC TPS54616, dit is een schakelende voeding. We weten dat schakelende voedingen sowieso op de uitgang een zekere rimpel in de stroom en spanning vertonen. Hierbij zijn er twee mogelijke pistes. Enerzijds het uitschakelen van de bron op het bord aanwezig of het maken van een band – doorlaatfilter welke enkel de nuttige frequentie doorlaat, bijvoorbeeld als de zelfgecreëerde klok tegen 50kHz draait dan kunnen we deze trachten uit te filteren. Er kan gebruik gemaakt worden van een externe labo voeding welke een kleinere stroomrimpel op de uitgang heeft. Een andere mogelijkheid is een filter te creëren welke de frequentie van bijvoorbeeld 50kHz doorlaat. We weten dat de zelfgecreëerde frequentie ligt tussen 40 en 60 kHz. Hiervan heb ik een simulatie gemaakt in pspice:
Figuur 5-12 : Passief band -doorlaatfilter 40
-0
-40
-80
-120 10Hz VDB(R2:2)
100Hz V(C2:1)
1.0KHz
10KHz
100KHz
1.0MHz
10MHz
100MHz
V(V2:+) Frequency
Figuur 5-13 : Demping in functie van de frequentie
53
10mV
5mV
0V 10Hz V(C2:1)
100Hz V(V2:+)
1.0KHz
10KHz
100KHz
1.0MHz
10MHz
100MHz
Frequency
Figuur 5-14 : Spanningsverandering in functie van de frequentie
Maar nu blijkt dat een passief RC- filter het signaal teveel verzwakt ! Een volgende stap zou kunnen zijn dat er een actief filter ontworpen wordt op deze frequentie. Een actief filter zal het signaal niet verzwakken waardoor in ons geval een veel beter resultaat zal bekomen worden. Wegens tijdsgebrek was dit niet meer mogelijk. Opmerking: Bij het verplaatsen van de zelfgemaakte klok van 50kHz naar 5Mhz, dan valt het op dat in het FFT domein er zich niet een specifieke frequentie verschuiving voordoet. De verbruikte stroom door de DES – core is dus zeer gering en of het parasitaire stroomverbruik zo groot dat er geen duidelijke verschuiving op te merken is.
54
Hoofstuk 6: Besluit 6.1 Wat is verwezenlijkt We merken dat er zich veel problemen hebben voorgedaan: −
Het draaien van het algoritme op de FPGA.
−
Het aansluiten van het DES –IP op de bus.
−
Het verkrijgen van een correcte versleuteling en ontsleuteling.
−
Verzorgen van een zekere flexibiliteit.
−
Het opmeten van de stroom.
Hieruit kunnen we besluiten dat het kraken van een algoritme draaiende op een FPGA via vermogenmeting, niet iets is wat we eenvoudig kunnen verwezenlijken. Het is weliswaar gelukt om het DES –algoritme te draaien op de FPGA en voor het meten van de stroom, maar het is nog te vroeg om een concreet besluit te vormen omtrent een vermogen aanval op een DES core geïmplementeerde FPGA.
6.2 Wat nog te doen Volgend academiejaar zal hiermee vervolgd worden. Deze thesis zal vooral berusten op het interpreteren van de stroom. De verdere stappen zullen hoofdzakelijk bestaan uit: −
Het filteren van de zelf gecreëerde klokfrequentie binnen de FPGA Core.
−
Stroomverbruik vergelijken in functie van de berekende bits.
−
Het onderzoeken van de stroommetingen, door een grote hoeveelheid data en keys aan te bieden zal een statischtisch model kunnen worden opgesteld waardoor men met enige kans de sleutel zal kunnen bepalen.
55
Verklarende woordenlijst Energie dissipatie
Verbruik van energie
File
Bestand
FPGA -core
De kern/processor van de FPGA
I/O bank
Een groep van uitgangspinnen aan de chip
LVCMOS25
Input source voltage: 2.5V
LVTTL
Input source voltage: 3.3V
Macrocel
Een eenheid waaruit een FPGA is opgebouwd, ook wel eens logische cel genaamd
MODELSIM
Programma waarmee VHDL simulaties uitgevoerd worden
Oneven pariteit
Dit zal ervoor zorgen dat het geheel steeds een oneven aantal ééntjes is
Permutatie
Verwisseling, verplaatsing van bits
PGP
Het is een computerprogramma welke veiligheid en authenticiteit garandeert
Quartus
FPGA –software tool van Altera
System on chip
Een samenstelling van busgekoppelde onderdelen waaronder een microprocessor, geheugen, oscillators, interfaces (rs232),…
SPARTAN
Bepaald type FPGA van Xilinx
Time to market
Ontwikkel tijd van begin tot verkoop
Schakelende voeding
Spanningsbron die tot stand komt door schakelen van hoger voltage
Softcore
Processor die opgebouwd is uit configureerbare logica
VERILOG
Hardware description language vooral gebruikt in Amerika
VHDL
Hardware description language vooral gebruikt in Europa
VIRTEX
Bepaald type FPGA van Xilinx
56
Literatuurlijst −
Cursus IT-security van het vierde jaar Multimedia en Informatietechnologie
−
Cursus Programeerbare componenten van het derde jaar Elektronica
−
Universiteit Gent, Instituut voor Permanente Vorming van de Faculteit Toegepaste Wetenschappen, Wiskundige grondslagen van encryptie door prof. Eric Laermans, 2005 [CD-ROM]
−
Federal information processing standard publications, 2005 http://www.itl.nist.gov/fipspubs/index.htm
−
Discretix Technologies Ltd., Introduction to Side Channel Attacks door Hagai Bar-El http://www.hbarel.com/publications/Introduction_To_Side_Channel_Attacks.pdf http://ece.wpi.edu/~kaps/ece578/index.html
−
Tutorials, datasheets FPGA’s en informatie EDK, 2006 http://www.xilinx.com/
−
International Business Machines Corporation, On-Chip Peripheral Bus Architecture Specifications Versie 2.1,April 2001 http://www306.ibm.com/chips/techlib/techlib.nsf/techdocs/9A7AFA74DAD200D087256AB30005F 0C8/$file/OpbBus.pdf
−
Xilinx Download Center, Updates en bibliotheken voor EDK, 2006 http://www.xilinx.com/xlnx/xil_sw_updates_home.jsp?BV_SessionID=@@@@075668 9548.1148301174@@@@&BV_EngineID=ccceaddhlfdhglfcefeceihdffhdfjf.0
−
Digilent Incorporate, Design Resources for Digital Engineers, Datasheets en informatie over XUP borden http://www.digilentinc.com/
57
Bijlagen De 8 verschillende substitutieboxen PRIMITIVE FUNCTIONS FOR THE DATA ENCRYPTION ALGORITHM 14 O 4 15
4 13 15 7 1 14 12 8
1 2 4 14 8 13 2 4
15 11 2 13 6 2 9 1
8 3 1 10 11 15 7 5
S1 10 6 6 12 12 9 11 3
12 5 11 9 7 3 14 10
15 3 0 13
1 8 13 4 14 7 8 10
14 6 7 15 11 10 1 3
11 3 2 8 4 13 15 4
4 9 14 12 1 5 2 11
S2 7 2 0 1 8 12 6 7
10 13 13 1
0 9 7 O 6 4 10 13
14 9 9 0
6 3 8 6
3 15 4 6 15 3 9 8
5 1 10 2 0 11 7 4
7 13 10 3
13 14 8 11 6 9 15 O
3 0 5 6 0 12 6 10
6 9 15 O 11 7 1 13
2 14 4 11
12 4 11 2 2 1 8 12
1 7 12 4 11 10 7 1
12 10 9 4
1 10 15 4 14 15 3 2
15 2 5 12
4 13 1 6
13 1 7 2
9 5 10 O
0 3 5 6
7 8 0 13
13 12 10 6 6 9 12 0
O 5 9 11 3 2 5 14
10 5 15 9
S3 13 12 8 5 1 2 15 14
7 11 14 12 12 5 3 11
4 2 11 15 10 14 5 2
8 1 7 12
10 1 3 4 13 15 8 9
S4 2 7 1 4
8 2 3 5
5 11 12 1 14 5 11 12
12 4 10 14 2 8 7 2
15 9 4 14
10 11 7 13 13 7 14 2
6 8 1 5 8 15 13 6
S5 5 3 0 15 9 12 15 O
15 13 10 3 5 6 9 10
O 14 9 8 3 O 4 5
9 6 14 3
9 7 2 9
2 6 12 9 8 12 5 15
8 O 5 6 3 7 10 11
S6 13 3 1 13 0 4 14 1
4 14 14 O 10 1 7 6
7 5 11 3 13 11 0 8
11 8 6 13
11 2 0 11 4 11 11 13
14 15 7 4 13 12 8 1
0 8 9 1 3 7 4 10
13 3 10 14 14 10 7 9
S7 12 3 15 5
9 5 6 0
7 5 12 2 8 0 15 14
10 15 5 2
6 8 9 3
1 6 2 12
2 8 15 13 11 4 1 14
4 6 8 10 1 9 7 4
15 11 3 7 12 14 10 8
1 10 4 12 2 0 13 15
S8 9 3 5 6 6 10 12 9
14 5 11 0 13 15 0 3
0 12 14 9 3 5 5 6
7 2 8 11
1
Testdes.vhd LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.all; USE ieee.std_logic_unsigned.all; ENTITY des IS PORT( --
clk
: in
std_logic;
rst
: in
std_logic;
rdy_next_next_cycle : out rdy_next_cycle : out rdy
: out
std_logic;
std_logic;
std_logic;
data_out
: out
ds
: out
workclk
-- output will be ready in two clock cycles - optional signal
-- output will be ready in one clock cycle - optional signal -- output is ready NOW
std_logic_vector(0 to 63); std_logic; : out
std_logic
); end des; architecture testdes of des is signal workclk_sig : std_logic :='0'; signal key_in_sig : std_logic_vector(0 to 63)
:=x"965A83E333997352";
signal data_in_sig : std_logic_vector(0 to 63) :=x"66377F06B3BB1D8D"; signal cur_state_sig:
std_logic_vector(3 downto 0) := x"0";
signal next_state_sig: std_logic_vector(3 downto 0) := x"0"; signal input_valid_sig: std_logic; signal rst_sig:
std_logic;
signal ds_sig:
std_logic;
signal decipher_sig:
std_logic := '1';
component des56 IS PORT( indata
: in
std_logic_vector (0 TO 63);
inkey
: in
std_logic_vector (0 TO 63);
outdata
: out
std_logic_vector (0 TO 63);
decipher
: in
std_logic;
ds
: in
std_logic;
clk
: in
std_logic;
rst
: in
std_logic;
rdy_next_next_cycle : out rdy_next_cycle : out rdy
: out
std_logic;
std_logic;
std_logic
-- output will be ready in two clock cycles - optional signal
-- output will be ready in one clock cycle - optional signal -- output is ready NOW
); end component; begin process(clk) variable clkcount : integer range 0 to 100000 :=0; begin
2
if rising_edge(clk) then clkcount:=clkcount+1; if clkcount=1000 then workclk_sig <= NOT workclk_sig; clkcount:=0; end if; end if; end process; process (workclk_sig) variable count : integer range 0 to 1000 :=0; begin workclk <= workclk_sig; ds <= ds_sig; if rising_edge(workclk_sig) then workclk <= workclk_sig; ds <= ds_sig; cur_state_sig <= next_state_sig; case cur_state_sig is when x"0" => rst_sig <= '1'; next_state_sig <= x"1"; when x"1" => --------coder/decoder/codeer/...--------------------------------------if decipher_sig = '0' then decipher_sig <= '1'; else decipher_sig <= '1';
-- altijd decipher
end if; --------coder/decoder/codeer/...--------------------------------------next_state_sig <= x"2"; when x"2" => rst_sig <= '0'; next_state_sig <= x"3"; when x"3" => data_in_sig <= x"66377F06B3BB1D8D"; key_in_sig <= x"965A83E333997352"; next_state_sig <= x"C"; when x"C" => next_state_sig <= x"D"; when x"D" => ds_sig <= '1'; next_state_sig <= x"E"; when x"E" => next_state_sig <= x"F"; when x"F" => ds_sig <= '0'; --------pauze om te (de)coderen---------------------------------------count:=count+1; if count=25 then
3
count:=0; next_state_sig <= x"0"; else next_state_sig <= x"F"; end if; --------pauze om te (de)coderen---------------------------------------when others => next_state_sig <= x"0"; end case; end if; end process; u1: des56 port map(indata => data_in_sig, inkey => key_in_sig, outdata => data_out, decipher => decipher_sig, ds => ds_sig, clk => workclk_sig, --clk => clk, rst => rst_sig, rdy_next_next_cycle => rdy_next_next_cycle, rdy_next_cycle => rdy_next_cycle, rdy => rdy); end testdes;
4
Simulation library compilation Het compileren van de simulatie bibliotheken helpt bij het aanvullen van de HDL bibliotheken in de EDK. Dit geeft de kans alsook vanuit de platform studio een simulatie te draaien. Hierbij moet wel opgemerkt worden dat dit niet bestaat uit een eenvoudige wizard. Ook is het handig te weten welke bibliotheken afhankelijk zijn van elkaar, want er moet van de meest elementaire bibliotheek vertrokken worden. Pas daarna kunnen de meer geavanceerde bibliotheken bijgevoegd worden zoals “simprim” en “unisim”. Eerst moet de algemene bibliotheek worden gecompileerd via een wizard.
5
Daarna moeten de aparte bibliotheken die gecompileerd werden afzonderlijk toegevoegd worden. Hierbij is volgorde van uiterst belang (ze zijn onderling afhankelijk).
6
7
Hieronder volgt een volgende bibliotheek, die afhankelijk was van de vorige.
8
Daarna moeten deze bibliotheken toegevoegd worden aan het project en als alles goed verloopt, komen er uiteindelijk naast alle toegevoegde vhdl bestanden, een groen vinkje te staan.
9
Hoe een nieuw IP aanmaken.
10
11
User_logic.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; library proc_common_v2_00_a; use proc_common_v2_00_a.proc_common_pkg.all; entity user_logic is generic ( C_DWIDTH
: integer
:= 32;
C_NUM_CE
: integer
:= 5 );
port ( Bus2IP_Clk
: in std_logic;
Bus2IP_Reset
: in std_logic;
Bus2IP_Data
: in std_logic_vector(0 to C_DWIDTH-1);
Bus2IP_BE
: in std_logic_vector(0 to C_DWIDTH/8-1);
Bus2IP_RdCE
: in std_logic_vector(0 to C_NUM_CE-1);
Bus2IP_WrCE
: in std_logic_vector(0 to C_NUM_CE-1);
IP2Bus_Data
: out std_logic_vector(0 to C_DWIDTH-1);
IP2Bus_Ack
: out std_logic;
IP2Bus_Retry
: out std_logic;
IP2Bus_Error
: out std_logic;
IP2Bus_ToutSup
: out std_logic
); end entity user_logic; architecture IMP of user_logic is signal slv_reg0
: std_logic_vector(0 to C_DWIDTH-1); --indata part1
signal slv_reg1
: std_logic_vector(0 to C_DWIDTH-1); --indata part2
signal slv_reg2
: std_logic_vector(0 to C_DWIDTH-1); --key part1
signal slv_reg3
: std_logic_vector(0 to C_DWIDTH-1); --key part2
signal slv_reg4
: std_logic_vector(0 to C_DWIDTH-1); --command
signal slv_reg_write_select
: std_logic_vector(0 to 4);
signal slv_reg_read_select
: std_logic_vector(0 to 4);
signal slv_ip2bus_data
: std_logic_vector(0 to C_DWIDTH-1);
signal slv_read_ack
: std_logic;
signal slv_write_ack
: std_logic;
signal indata_sig
: std_logic_vector (0 TO 63);
signal inkey_sig
: std_logic_vector (0 TO 63);
signal outdata_sig signal status
: std_logic_vector (0 TO 63); : std_logic_vector (0 TO 31);
component des56 PORT( indata
: in
std_logic_vector (0 TO 63);
inkey
: in
std_logic_vector (0 TO 63);
outdata decipher ds
: out : in : in
std_logic_vector (0 TO 63); std_logic; std_logic;
12
clk
: in
std_logic;
rst
: in
std_logic;
rdy_next_next_cycle : out rdy_next_cycle : out rdy
: out
std_logic;
std_logic;
std_logic
-- output will be ready in two clock cycles - optional signal
-- output will be ready in one clock cycle - optional signal -- output is ready NOW
); end component; begin slv_reg_write_select <= Bus2IP_WrCE(0 to 4); slv_reg_read_select <= Bus2IP_RdCE(0 to 4); slv_write_ack
<= Bus2IP_WrCE(0) or Bus2IP_WrCE(1) or Bus2IP_WrCE(2) or Bus2IP_WrCE(3) or Bus2IP_WrCE(4);
slv_read_ack
<= Bus2IP_RdCE(0) or Bus2IP_RdCE(1) or Bus2IP_RdCE(2) or Bus2IP_RdCE(3) or Bus2IP_RdCE(4);
SLAVE_REG_WRITE_PROC : process( Bus2IP_Clk ) is begin if Bus2IP_Clk'event and Bus2IP_Clk = '1' then if Bus2IP_Reset = '1' then
--bij reset alle registers op 0 zetten
slv_reg0 <= (others => '0'); slv_reg1 <= (others => '0'); slv_reg2 <= (others => '0'); slv_reg3 <= (others => '0'); slv_reg4 <= (others => '0'); else case slv_reg_write_select is -- alle 5 registers nodig voor schrijven naar IP when "10000" =>
-- telkens 1 van de 5bits die op 1 staat
for byte_index in 0 to (C_DWIDTH/8)-1 loop --regX wordt opgesplitst per byte if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg0(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; when "01000" => for byte_index in 0 to (C_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg1(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; when "00100" => for byte_index in 0 to (C_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg2(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; when "00010" => for byte_index in 0 to (C_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg3(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; when "00001" => for byte_index in 0 to (C_DWIDTH/8)-1 loop if ( Bus2IP_BE(byte_index) = '1' ) then slv_reg4(byte_index*8 to byte_index*8+7) <= Bus2IP_Data(byte_index*8 to byte_index*8+7); end if; end loop; when others => null;
13
end case; end if; end if; end process SLAVE_REG_WRITE_PROC; -- implement slave model register read mux SLAVE_REG_READ_PROC : process( slv_reg_read_select, slv_reg0, slv_reg1, slv_reg2, slv_reg3, slv_reg4 ) is begin case slv_reg_read_select is when "10000" => slv_ip2bus_data <= outdata_sig(0 to 31); -- alleen de eerste 3 registers nodig voor lezen van IP when "01000" => slv_ip2bus_data <= outdata_sig(32 to 63); when "00100" => slv_ip2bus_data <= status; when others => slv_ip2bus_data <= (others => '0'); end case; end process SLAVE_REG_READ_PROC; indata_sig <= slv_reg0 & slv_reg1;
-- na samenvoeging zetten we de signialen op de bus
inkey_sig <= slv_reg2 & slv_reg3; U1: des56 PORT MAP( indata => indata_sig, inkey => inkey_sig, outdata => outdata_sig, decipher => slv_reg4(31), ds --clk
=> slv_reg4(30), => Bus2IP_Clk,
clk
=> slv_reg4(28),
rst
=> slv_reg4(29),
rdy_next_next_cycle => status(0), rdy_next_cycle => status(1), rdy => status(2)); ------------------------------------------- Example code to drive IP to Bus signals -----------------------------------------IP2Bus_Data
<= slv_ip2bus_data;
IP2Bus_Ack
<= slv_write_ack or slv_read_ack;
IP2Bus_Error
<= '0';
IP2Bus_Retry
<= '0';
IP2Bus_ToutSup
<= '0';
end IMP;
14
Application_code.c #include "xparameters.h" #include "stdio.h" #include "xutil.h" #include "xbasic_types.h" #include "xstatus.h" #include "xio.h" #define BaseAddress 0x00000000 #define InData32 BaseAddress
// input Data bit 0-31
#define InData64 BaseAddress+4 // input Data bit 32-63 #define InKey32 BaseAddress+8 // input Key bit 0-31 #define InKey64 BaseAddress+12 // input Key bit 32-63 #define Command BaseAddress+16 // command register #define OutData32 BaseAddress
// encrypted/decrypted Data bit 0-31
#define OutData64 BaseAddress+4 // encrypted/decrypted Data bit 31-63 #define Status #define niets
BaseAddress+8 // status register 0x00000000
#define decipher 0x00000001 #define ds
0x00000002
#define reset
0x00000004
#define klok 0x00000008 #define ready 0x4 int main (void) { int i,stat; Xuint32 Reg32Value; xil_printf("\r\n================== START main() ===================\r\n"); // reset core XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low + reset low XIo_Out32((Xuint32)Command,(Xuint32)0x00000008); //klok high + reset low XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low + reset low XIo_Out32((Xuint32)Command,(Xuint32)0x0000000C); //klok high + reset high XIo_Out32((Xuint32)Command,(Xuint32)0x00000004); //klok low + reset low XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low + reset low // set key XIo_Out32((Xuint32)InKey32,(Xuint32)0x965A83E3); //low 32bit Key XIo_Out32((Xuint32)Command,(Xuint32)0x00000008); //klok high XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low XIo_Out32((Xuint32)InKey64,(Xuint32)0x33997352); //High 32bit Key XIo_Out32((Xuint32)Command,(Xuint32)0x00000008); //klok high XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low xil_printf("\r\n InKey = 0x965A83E3 33997352 \r\n"); // set data XIo_Out32((Xuint32)InData32,(Xuint32)0x66377F06); //low 32bit data XIo_Out32((Xuint32)Command,(Xuint32)0x00000008); //klok high XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low XIo_Out32((Xuint32)InData64,(Xuint32)0xB3BB1D8D); //High 32bit data XIo_Out32((Xuint32)Command,(Xuint32)0x00000008); //klok high XIo_Out32((Xuint32)Command,(Xuint32)0x00000000); //klok low xil_printf("\r\n InData = 0x66377F06 B3BB1D8D \r\n"); // start encryption -- generate rising edge data strobe
15
XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x0000000B); //klok high + ds high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + ds low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher
XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000009); //klok high + decipher XIo_Out32((Xuint32)Command,(Xuint32)0x00000001); //klok low + decipher //outdata opvragen xil_printf("\r\n Outdata = %8x %8x \r\n", (unsigned int)XIo_In32((Xuint32)OutData32), (unsigned int)XIo_In32((Xuint32)OutData64)); //status register opvragen stat=XIo_In32((Xuint32)Status); xil_printf("\r\n Status = %8x \r\n",stat); xil_printf("\r\n=================== EXIT main() ===================\r\n"); return 0; }
16
i