Forum: Mikrocontroller und Digitale Elektronik ATmega128RFA1 - Nutzung des AES-Moduls


von Mirco (Gast)


Lesenswert?

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

von no_name (Gast)


Lesenswert?

Etwas mehr Informationen zum Problem sind notwendig ...
(0) Was (im Detail) funktioniert nicht?
(1) Was sagt das Register TRX_STATUS?

von no_name (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.