Forum: Mikrocontroller und Digitale Elektronik Xmega mit AVR1318 Controller fehlerhafte AES Decryption


von Kemal ö. (Firma: - -) (alchalade)


Lesenswert?

Hallo zusammen,
seit gestern Experimentiere und recherchiere die ganze zeit warum die 
Entschlüsselung von eine Verschlüsselte Variable nicht ordentlich 
funktioniert.

Verfahren         : AES 128
C Entschlüsselung : AVR1318
Microcontroller   : ATxmega128A4U


Ich Verschlüssel einen String in C# mit "RijndaelManaged" habe auch das 
selbe mit "AesManaged" probiert ob der Fehler eventuell auf der PC seite 
liegt.

Der Code der die Variable Verschlüsselt.

#############################################
#                  VERSCHLUESSELUNG  C#     #
#############################################
1
public static byte[] encrypt(string input)
2
        {
3
            byte[] encrypted;
4
            using (RijndaelManaged myRijndael  = new RijndaelManaged())
5
            {
6
                myRijndael.KeySize = 128;   // 16 byte
7
                myRijndael.BlockSize = 128; // 16 byte
8
                myRijndael.Mode = CipherMode.CBC;
9
                myRijndael.Key = new byte[16] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 }; //key;
10
                myRijndael.IV = new byte[16] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };
11
                ICryptoTransform encryptor = myRijndael.CreateEncryptor(myRijndael.Key, myRijndael.IV);
12
                using(MemoryStream ms_encrypt  =  new MemoryStream())
13
                {
14
                    using (CryptoStream cs = new CryptoStream(ms_encrypt, encryptor, CryptoStreamMode.Write))
15
                    {
16
                        
17
                        using (StreamWriter sw = new StreamWriter(cs))
18
                        {
19
                            sw.Write(input);
20
                        }
21
                        encrypted = ms_encrypt.ToArray();
22
                    }
23
                }
24
                
25
            }
26
27
            return encrypted;
28
        }
#############################################
#                  ENTSCHLUESSELUNG   C     #
#############################################
1
#include "AES_driver.h"
2
3
#define BLOCK_LENGTH 16
4
#define BLOCK_COUNT 2
5
uint8_t  lastsubkey[BLOCK_LENGTH];
6
/* Key used when AES encryption is done operations. */
7
uint8_t key[BLOCK_LENGTH]  = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36};
8
uint8_t init[BLOCK_LENGTH]  = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
9
10
/* Variable used to check if decrypted answer is equal original data. */
11
bool success;
12
13
14
15
    success = true;
16
17
  /* Before using the AES it is recommended to do an AES software reset to put
18
   * the module in known state, in case other parts of your code has accessed
19
   * the AES module. */
20
  AES_software_reset();
21
  uint8_t hebele[32];
22
  success = AES_lastsubkey_generate(key, lastsubkey);
23
  if(!success)
24
  {  
25
    lcd_gotoxy_8(0,3);
26
    lcd_putc('X');
27
    return;
28
  }
29
  /* Do AES Cipher Block Chaining encryption and decryption on three blocks. */
30
  uint8_t lenni[32] = {0x4c,0x65,0x6e,0x6e,0x69,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
31
  //success = AES_CBC_encrypt(lenni, hebele, key,init,2);
32
  success = AES_CBC_decrypt(card.content.data.client_name, hebele, lastsubkey,init,2);
33
  /* Check if decrypted answer is equal to plaintext. */
34
  if(success)
35
  {  for(uint8_t i = 0; i < BLOCK_LENGTH * BLOCK_COUNT ; i++ ){
36
      lcd_gotoxy_8(0+i,2);
37
      if(i>=16)
38
        lcd_gotoxy_8(0+i-16,3);
39
        lcd_putc(hebele[i]);
40
    }
41
  }
42
  return;
##################
# ENDE CODE      #
##################


Ich habe es auch mit den Originellen "Key" anstatt mit dem "lastsubkey" 
versucht aber ledier auch ohne erfolg.

die Variable Lenni habe ich zu Probe verschlüsselt und entschlüsselt 
alles i.O.

Vielen Dank voraus.
Grüße,
Kemal

: Verschoben durch User
von Maxx (Gast)


Lesenswert?

Und du bist dir sicher, dass ein C "A" das Gleiche ist, wie ein C# "A" ?
Im Speziellen: Schau dir an, wie ein C# char definiert ist und wie in 
Ansi C.

von Kemal ö. (Firma: - -) (alchalade)


Lesenswert?

Ich bin komischerweise nicht auf die Idee gekommen da ich bisher alles 
normal (byte weise) auf die Chipkarte geschrieben habe und alles kam 
über die Chipkarte mittels Kartenleser an den Controller richtig an. 
Jetzt habe ich direkt die Bytes verschlüsselt die ich auch bei dem 
Micro-Controller verschlüsselt und entschlüsselt habe. Dennoch werden 
die nicht richtig verschlüsselt.

: Bearbeitet durch User
von Kemal ö. (Firma: - -) (alchalade)


Lesenswert?

Update : Problem gelöst.
Ich habe dieses Projekt von einem übernommen irgend wo tief im Code 
wurden die uint8 Werte die nachher einen text darstellen sollen 
kontrolliert bzw. gefiltert. Die 32 ist die kleinste Zahl die ein 
Zeichen darstellt. Alle Zeichen  die Kleiner als 32 waren, wurden auf 32 
gesetzt. Also wurde quasi die Verschlüsselter Text manipuliert.

Der Code hat also vom Anfang an funktioniert. :FacePalm

Für den Fall jemand irgendwann einen Ähnlichen Fehler macht lösche ich 
diesen Thread nicht.

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.