Hallo zusammen!
Ich versuche mich im Rahmen meiner Bachelor-Thesis schon seit einiger
Zeit an der Nutzung des Verschlüsselungsmoduls des ATmega128RFA1.Ich
habe hierzu ein keines Programm geschrieben, das einen String
verschlüsseln, wieder entschlüsseln un die Übereinstimmung der
Klartext-Strings überprüfen soll. In der Beschreibung des Controllers
hört sich das Ganze recht simpel an, aber irgendwie läuft es bei mir
nicht. Hat vielleicht schon jemand von Euch die Hardwareverschlüsselung
verwendet und kann mir sagen, wo der Fehler im Programm liegt? Da ich
nicht mehr viel Zeit bis zu Abgabe habe, wäre ich für jede Hilfe
dankbar.
1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 | #include <string.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void) {
|
7 | char plainstring[1024] = "";
|
8 | char cipherstring[1024] = "";
|
9 | char string[1024] = "";
|
10 | char key[16] = "abcdefghijklmnop";
|
11 | uint8_t i;
|
12 |
|
13 | //LED-Pins als Output setzen
|
14 | DDRE = ((1<<PE1) | (1<<PE2) | (1<<PE3) | (1<<PE4));
|
15 |
|
16 | //LEDs ausschalten
|
17 | PORTE |= ((1<<PE2) | (1<<PE3) | (1<<PE4));
|
18 |
|
19 | //zu verschlüsselnden String (16 Byte) speichern
|
20 | strcpy(string, "Teststring______");
|
21 |
|
22 | //Transceiveer resetten
|
23 | TRXPR |= (1 << TRXRST);
|
24 |
|
25 |
|
26 | //VERSCHLÜSSELN
|
27 | //----------------------------------------------------
|
28 |
|
29 | //AES-Key in Key-Buffer schreiben
|
30 | for(i = 0; i < 16; i++)
|
31 | {
|
32 | AES_KEY = key[i];
|
33 | }
|
34 |
|
35 | //AES_MODE=0 -> ECB
|
36 | AES_CTRL &= ~(1 << AES_MODE);
|
37 | //AES_DIR=0 -> encryption
|
38 | AES_CTRL &= ~(1 << AES_DIR);
|
39 |
|
40 | //zu verschlüsselnde Daten in Puffer schreiben
|
41 | for (i = 0; i < 16; i++)
|
42 | {
|
43 | AES_STATE = string[i];
|
44 | }
|
45 |
|
46 | //Verschlüsselung starten
|
47 | AES_CTRL |= (1 << AES_REQUEST);
|
48 |
|
49 | //Zeit für Verschlüsselung geben
|
50 | _delay_ms(10);
|
51 |
|
52 | //verschlüsselte Daten in String speichern
|
53 | for(i = 0; i < 16; i++)
|
54 | {
|
55 | cipherstring[i] = AES_STATE;
|
56 | }
|
57 | //String abschließen
|
58 | cipherstring[16] = '\0';
|
59 | //----------------------------------------------------
|
60 |
|
61 |
|
62 | //ENTSCHLÜSSELN
|
63 | //----------------------------------------------------
|
64 |
|
65 | //AES_MODE=0 -> ECB
|
66 | AES_CTRL &= ~(0 << AES_MODE);
|
67 | //AES_DIR=1 -> decryption
|
68 | AES_CTRL |= (1 << AES_DIR);
|
69 |
|
70 | //zu entschlüsselnde Daten in Puffer schreiben
|
71 | for (i = 0; i < 16; i++)
|
72 | {
|
73 | AES_STATE = cipherstring[i];
|
74 | }
|
75 |
|
76 | //Entschlüsselung starten
|
77 | AES_CTRL |= (1 << AES_REQUEST);
|
78 |
|
79 | //Zeit zum entschlüsseln geben
|
80 | _delay_ms(10);
|
81 |
|
82 | //Plaintext in String speichern
|
83 | for(i = 0; i < 16; i++)
|
84 | {
|
85 | plainstring[i] = AES_STATE;
|
86 | }
|
87 | //String abschließen
|
88 | plainstring[16] = '\0';
|
89 | //----------------------------------------------------
|
90 |
|
91 |
|
92 | //ÜBEREINSTIMMUNGEN TESTEN
|
93 | //----------------------------------------------------
|
94 | if(!strcmp(string, "Teststring______"))
|
95 | {
|
96 | //LED einschalten
|
97 | PORTE &= ~(1<<PE2);
|
98 | }
|
99 |
|
100 |
|
101 | if(!strcmp(plainstring, "Teststring______"))
|
102 | {
|
103 | //LED einschalten
|
104 | PORTE &= ~(1<<PE3);
|
105 | }
|
106 | //----------------------------------------------------
|
107 | return(0);
|
108 | }
|
Sorry, wenn es ein wenig unübersichtlich ist. Ich habe die Aufsplittung
in einzelne Funktionen ersteinmal weg gelassen, um Fehler bei der
Stringübergabe auszuschließen.
Gruß
Mirco