Forum: PC-Programmierung Passwörter mit Masterpasswort ver- und entschlüsseln


von Thomas H. (thomas_h694)


Lesenswert?

Hallo,
ich möchte gerne in c/c++ (Arduino) Zugangsdaten ver- und endschlüsseln 
mittels eines "Masterpasswortes" das man natürlich eingeben / übertragen 
muss. Das ganze wird dann auf einem EEPROM gespeichert.

Leider finde ich hierfür kein passendes Beispiel, ich vermute da brauche 
ich ja keinen shared key etc. Meine Idee ist dass ich einen Key aus 
einem Passworthashwert erstelle. Ich habe schon ein wenig mit AES.h uns 
crypto.h experimentiert, leider bisher ohne Erfolg.

Was ich eigenlich nur brauche ist eine Methode zum ver - und eine zum 
entschlüsseln mittels eines Keys, wobei dieser natürlich jeweils gleich 
sein muss, damit am Ende wieder das gleiche rauskommt. Also in etwa 
sowas:

String ciphertext = decypt(String message, byte* key);
wobei
message der klartext ist,
ciphertext der verschlüsselte Text,
key der key.

und

String message = encypt(String ciphertext, byte* key);

Kann mir jemand ein passenden, möglichst einfachen, funktionierendes 
Beispielcode verlinken oder nennen oder wenigstens ein paar tips geben, 
z.B. welche verschlüsselungsmethode dafür genommen werden sollte?

Danke und viele Grüße

Thomas

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Wenn dein Masterkey sowieso auch im Flash liegt:
ein simples XOR mit dem Masterkey (am besten mindestens so lang wie das 
längste Passwort, was er "beschützt") ist (in diesem speziellen Fall) 
auch nicht unsicherer als AES.

von Oliver S. (oliverso)


Lesenswert?

1
return password == Geheim;

Oliver

: Bearbeitet durch User
von Thomas H. (thomas_h694)


Lesenswert?

Εrnst B. schrieb:
> Wenn dein Masterkey sowieso auch im Flash liegt:
> ein simples XOR mit dem Masterkey (am besten mindestens so lang wie das
> längste Passwort, was er "beschützt") ist (in diesem speziellen Fall)
> auch nicht unsicherer als AES.

Hallo, nein der Masterkey soll nicht im Flash liegen, er soll aus einem 
eingegebenem Passwort "generiert" werden.

von Εrnst B. (ernst)


Lesenswert?

Thomas H. schrieb:
> Hallo, nein der Masterkey soll nicht im Flash liegen, er soll aus einem
> eingegebenem Passwort "generiert" werden.

Je nachdem welche Angriffsvektoren es da gibt, bleibt XOR eine 
Möglichkeit.

Problem wäre z.B. wenn der Angreifer den EEPROM-Inhalt kennt und ein 
entschlüsseltes Passwort bei Verwendung mitlesen kann, kann er die 
anderen Passwörter und den Masterkey errechnen.

von Hmmm (Gast)


Lesenswert?

Thomas H. schrieb:
> Hallo, nein der Masterkey soll nicht im Flash liegen, er soll aus einem
> eingegebenem Passwort "generiert" werden.

Das Stichwort lautet "Key Derivation Function".

Die macht aus dem Passwort einen Key, z.B. für AES.

von Oliver S. (oliverso)


Lesenswert?

Thomas H. schrieb:
> String message = encypt(String ciphertext, byte* key);

Un was machst du dann mit dem Klartext in message?

Oliver

von Thomas H. (thomas_h694)


Lesenswert?

Oliver S. schrieb:
> Thomas H. schrieb:
>> String message = encypt(String ciphertext, byte* key);
>
> Un was machst du dann mit dem Klartext in message?
>
> Oliver

Auf einem Display anzeigen.
Es geht mir nur darum, dass niemand wenn er das EEPROM auslesen würde, 
an die Passwörter kommt.

von Dieter D. (dieter_dosenkohl)


Lesenswert?

Ich hoffe für dich dass das nur eine Bastelei ist und du das nicht am 
Ende produktiv einsetzen willst.

von Andreas B. (bitverdreher)


Lesenswert?

Dieter D. schrieb:
> Ich hoffe für dich dass das nur eine Bastelei ist und du das nicht am
> Ende produktiv einsetzen willst.

Na, ja. Besser als ein Zettel unter dem Kopfkissen wird das schon 
werden. ;-)

von Oliver S. (oliverso)


Lesenswert?

Thomas H. schrieb:
> Auf einem Display anzeigen.
> Es geht mir nur darum, dass niemand wenn er das EEPROM auslesen würde,
> an die Passwörter kommt.

Dann frage ich nochmal:

Wie programmierst du dann die Abfrage, ob jemand das richtige Passwort 
eingegeben hat?

Oliver

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Oliver S. schrieb:
> Wie programmierst du dann die Abfrage, ob jemand das richtige Passwort
> eingegeben hat?

Ein-Weg Hash Funktionen - Wurden noch nicht erfunden, oh, warte, doch, 
wurden sie.

von Oliver S. (oliverso)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Ein-Weg Hash Funktionen - Wurden noch nicht erfunden, oh, warte, doch,
> wurden sie.

Die Frage war nicht, wie DU das lösen würdest, sondern der TO.

Oliver

von chris (Gast)


Lesenswert?

warscheinlich Overkill, aber bitte,
1
#include <avr/pgmspace.h>
2
#include "xtea.h"
3
unsigned char EE_KEY[XTEA_KEYSIZEB] PROGMEM = { 246,26,39,117,100,240,254,48,107,192,108,56,234,54,195,3 };
4
unsigned char TEST_KEY[XTEA_KEYSIZEB] PROGMEM = { 193,104,46,209,249,154,141,242,31,247,183,73,175,133,168,105 };
5
6
uint8_t IV[XTEA_BLOCKSIZEB];
7
8
void load_key(const unsigned char*val) { uint8_t i; for(i=0;i<16;i++) key[i]^= pgm_read_byte(val++); }
9
void xor_IV(char*dat,char dst) {
10
    uint8_t i,j;
11
     for(i=XTEA_BLOCKSIZEB;i--;) if(dst) dat[i]^=IV[i]; else IV[i]^=dat[i];
12
}
13
void eeprom_read(uint8_t i, char*dat) {  
14
  uint16_t addr=8+i*XTEA_BLOCKSIZEB;
15
   for(i=XTEA_BLOCKSIZEB;i--;dat[i]=eeprom_read_byte((uint8_t*)addr++));
16
}
17
void eeprom_write(uint8_t i, char*dat) {  
18
  uint16_t addr=8+i*XTEA_BLOCKSIZEB;
19
   for(i=XTEA_BLOCKSIZEB;i--;eeprom_update_byte((uint8_t*)addr++,dat[i]));
20
}
21
void eeprom_ecb_read(uint8_t i, char*dat) {  
22
  load_key(EE_KEY); eeprom_read(i,dat);
23
  xtea_dec(dat,dat,key);   
24
}
25
void eeprom_ecb_write(uint8_t i, char*dat) {  
26
  load_key(EE_KEY);
27
  xtea_enc(dat,dat,key);   
28
  eeprom_write(i,dat);
29
  xtea_dec(dat,dat,key);  // restore data
30
}
31
void eeprom_cbc_read(uint8_t i, char*dat, uint8_t cnt) {  
32
  uint8_t j;
33
    eeprom_ecb_read(0,IV);
34
  while(cnt--) {
35
    eeprom_ecb_read(i,dat);
36
    load_key(TEST_KEY);
37
    xtea_dec(dat,dat,key);
38
    xor_IV(dat,1);
39
    dat+=XTEA_BLOCKSIZEB;
40
    eeprom_ecb_read(i++,IV);
41
  }
42
}
43
void eeprom_cbc_write(uint8_t i, char*dat, uint8_t cnt) {  
44
    eeprom_ecb_read(0,IV);
45
  while(cnt--) {
46
    xor_IV(dat,0);
47
    load_key(TEST_KEY);
48
    xtea_enc(IV,IV,key);
49
    eeprom_write(i++,IV); dat+=XTEA_BLOCKSIZEB;
50
  }
51
}
52
void data_set(uint8_t idx, uint8_t val) { IV[idx&(XTEA_BLOCKSIZEB-1)]=val; } // helper for IV initialisation

von chris (Gast)


Lesenswert?

Bei load_key,
1
 
2
key[i]^= pgm_read_byte(val++); 
3
durch 
4
key[i] = pgm_read_byte(val++);
ersetzen, ich verwende xor, damit ich nach dem init einen Bereich von
Daten zugreifen kann, mit anderer Verschluesselung, was danach nicht 
mehr
moeglich ist.

von Thomas H. (thomas_h694)


Lesenswert?

Oliver S. schrieb:
> Die Frage war nicht, wie DU das lösen würdest, sondern der TO.
>
> Oliver

Die Idee ist, dass gar keine Abfrage erfolgt. D.h., wird ein falsches 
Passwort eingegeben, werden die Daten falsch entschlüsselt und sind 
somit nutzlos ;-)

von Oliver S. (oliverso)


Lesenswert?

Ach so. Dann liegen nur die verschlüsselten Zugangsdaten im EEprom, der 
Key braucht dann doch gar nicht gespeichert werden.

Oliver

von Thomas H. (thomas_h694)


Lesenswert?

chris schrieb:
> key[i]^= pgm_read_byte(val++);
> durch
> key[i] = pgm_read_byte(val++);

chris schrieb:
> Bei load_key,
> key[i]^= pgm_read_byte(val++);
> durch
> key[i] = pgm_read_byte(val++);
> ersetzen, ich verwende xor, damit ich nach dem init einen Bereich von
> Daten zugreifen kann, mit anderer Verschluesselung, was danach nicht
> mehr
> moeglich ist.

Hallo und danke für den Beispielcode!
Muss ich für das Beispiel die "XTEA-Cipher library for Arduino" 
installieren?

Ich bekomme es noch nicht ans laufen, die lib hat keine Methoden 
"xtea_dec" und "xtea_end".

Des weiteren habe ich, um erstmal das kompilieren zu testen, die defines

#define XTEA_KEYSIZEB 16
#define XTEA_BLOCKSIZEB 16

gesetzt, Keysize müsste ja 16 sein und blocksize?
und noch die Variable

unsigned char key[XTEA_KEYSIZEB] = { 
193,104,46,209,249,154,141,242,31,247,183,73,175,133,168,105 };

deklariert.
Ist das so richtig?

Danke!

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Es ist die Standard Implementation fuer AVR, hier als Anhang.
Blocksize ist aber 64bits, also 8 bytes, keysize ist 128bits/16 bytes.

Zudem ist bei dem Code EEprom slot 0 mit IV (Initialisation Vector)
zu fuellen.

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.