Forum: Mikrocontroller und Digitale Elektronik Verschlüsselungsspezis


von Jöt Z. (joetze)


Lesenswert?

Liebe Gemeinde,

ich habe 2 über CAN verbundene Geräte.
Zu Beginn einer Sitzung authentifizieren die sich folgendermaßen:

request (7 byte): 15 2F 19 43 22 B4 0B
reponse (3 byte): 38 75 EF

Hat irgendein Mathegott eine Idee, wie man vom Einen aufs Andere kommt?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ich sehe da nichts, was auf eine Verschlüsselung hindeutet.

von Jens M. (schuchkleisser)


Lesenswert?

Wenn die Sequenz fix ist, ahme sie nach.

Wenn sie nicht fix ist und der Programmierer nicht vollkommen behindert 
war, reicht ein Sample nicht aus, und selbst 1 Million Samples reichen 
ziemlich sicher nicht zum Erraten eines Challenge-Response-Verfahrens 
und seiner Parameter aus.

Was sind das denn für hochgeheime Geräte? Vielleicht gibt es in den 
unendlichen Weiten der allwissenden Müllhalde schon Infos dazu?!

von MaWin O. (mawin_original)


Lesenswert?

Jöt Z. schrieb:
> Hat irgendein Mathegott eine Idee, wie man vom Einen aufs Andere kommt?

Wenn man eine Formel angibt, um vom einen auf das andere in diesem einen 
Beispiel zu kommen, wird dir das exakt gar nichts bringen.

von Jöt Z. (joetze)


Lesenswert?

Ich habe leider z.Zt. nur den Mitschnitt einer einzelnen Sitzung und war 
eigentlich auf der Suche nach den niedrig hängenden Früchten:
es gibt ja Leute, die durch bloßes Hingucken sehen, dass hier 
offensichtlich was addiert, verodert, invertiert wurde.
Dass ein einzelnes Sample für komplexere Berechnungen nicht reicht ist 
mir schon klar. Aber die erwarte ich eigentlich gar nicht ...

von Alexander (alecxs)


Lesenswert?

ich habe das Thema auch gerade. mein Ansatz ist die Firmware zu 
analysieren

von Jöt Z. (joetze)


Lesenswert?

Bisher bin ich davon ausgegangen, das da kein Schlüssel wie beim 
challenge-response verfahren involviert ist.
Eher dachte ich, dass das eine für uCs schnelle und ressourcensparende 
Berechnung ist.
Bei ähnlich gelagerten Problemen war das nur eine Addition der 
challengebytes mit ignoriertem Übertrag, manchmal nach vorherigem 
Invertieren oder nur byteweises Verodern.

Also eher Authentifizierung durch Obskurität ...

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Und wenn du noch soviel vermutest und erzaehlst, was es sein koennte:
Ohne deutlich groessere Anzahl von Samples kann das nix werden.

Gruss
WK

Beitrag #7510392 wurde von einem Moderator gelöscht.
von Alexander (alecxs)


Lesenswert?

Cool, es funktioniert!1!11

von Rüdiger B. (rbruns)


Lesenswert?


von Jöt Z. (joetze)


Lesenswert?

Rüdiger,

besten Dank für die Links.
Speziell im letzten Link wurde ja genau das bestätigt, was auch meine 
bisherige Erfahrung war:
Shiften, rotieren etc. sind bei derartigen Problemen absolut üblich und 
mit Phantasie, Intuition und Erfahrung kommt man da auch zu Ergebnissen.

Die Kollegen hier, die sofort auf dem "... geht nicht ..." Trip waren, 
haben garantiert hier keine hands-on Erfahrung.
Dass es Möglichkeiten zur Authentifizierung gibt, an denen man sich die 
Zähne ausbeisst weiß ich selber. Aber in den wenigsten Fällen geht es um 
Fort Knox oder den Großrechner vom CIA. Jede Authentifizierung muss in 
einem vernünftigen Verhältnis zur vorhandenen Rechenkapazität und 
Speicherplatz stehen und wartbar sein. Entwickler sind auch nur Menschen 
und wie gut Abschreckung durch die niedrige Frustrationstoleranz von 
Angreifern funktioniert, sehen wir in diesem thread ...

von Rainer W. (rawi)


Lesenswert?

Jöt Z. schrieb:
> Jede Authentifizierung muss in einem vernünftigen Verhältnis zur
> vorhandenen Rechenkapazität und Speicherplatz stehen und wartbar sein.

Irgendwelche 128 oder 256 Bit zu verknoten, schafft fast jeder uC. Den 
Rechenaufwand hat derjenige, der das per Brülute Force knacken will.

von Dieter S. (ds1)


Lesenswert?

Jöt Z. schrieb:
>
> Die Kollegen hier, die sofort auf dem "... geht nicht ..." Trip waren,
> haben garantiert hier keine hands-on Erfahrung.

Du hast offensichtlich keine Ahnung von der Thematik.

Beispiel wie man so einen Challenge-Response mit minimalem Aufwand bauen 
könnte wäre TEA oder XTEA. Die brauchen jeweils unter 10 Zeilen Code für 
die Implementierung und keine zusätzlichen Daten-Tabellen. Die 
Schlüssellänge ist 128 Bits. Also Challenge damit verschlüsseln, vom 
Ergebnis 3 Bytes auswählen, fertig. Der 128 Bit Schlüssel bestimmt das 
Ergebnis. Viel Spaß beim Erraten des Schlüssels anhand eines Beispiels.

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Dieter S. schrieb:
>>
>> Die Kollegen hier, die sofort auf dem "... geht nicht ..." Trip waren,
>> haben garantiert hier keine hands-on Erfahrung.
>
> Du hast offensichtlich keine Ahnung von der Thematik.
+1

Mal ein simples Beispiel, warum dein Unterfangen anhand der Datenbasis 
etwas - hm - ambitioniert ist:

request (x) : 2
response (y) : 4

Da fallen mir aus dem Stand diverse Funktionen/Algorithmen ein, z.B:
y=x+2
y=x*2
y=x^2
y=2^x
y=(3^x) mod 5
...
So, und welcher ist jetzt "der Richtige"?

Gruss
WK

von MaWin O. (mawin_original)


Lesenswert?

Jöt Z. schrieb:
> Die Kollegen hier, die sofort auf dem "... geht nicht ..." Trip waren,
> haben garantiert hier keine hands-on Erfahrung.

Das ist ja an Arroganz kaum mehr zu überbieten.
Dir ist schon klar, dass du EIN Beispiel gegeben hast.
DAS wurde kritisiert.

Beitrag #7510691 wurde vom Autor gelöscht.
von Chris S. (schris)


Lesenswert?

Hallo, 7byte challange ist meistens DES Verschluesselung.
Wird noch sehr selten genutzt.

Hier ein Codebeispiel, sei es für challange und response
Im Prinzip aus einer entropy, im konkreten Fall mehrere Durchläufe von
den unteren Bits des Timers bei WDT Timeout, also Laufzeitaenderungen
beim WDT sowie Temeperaturwerte (8bit überlauf des Timers) welcher 
Temperaturabhängig ist.

Response verwendet den 56bit encryption key und wendet ihn auf ein 64bit
UID an , hier triple des. Der checksum entscheidet welcher mittlere Key
bei triple DES verwendet wird, es stehen 10 zur Auswahl.
Das Resultat wird auf 7byte reduziert und dies ist der Key für den
112bit des_hash, welcher aud dem 8byte PID generiert wird.
Aus diesem Hash werden 3bytes ausgesucht, zwei Flags invertieren oder
ändern MSB/LSB und dann wird noch ein xor mit einem 16bit Wert gemacht.
Diese generierte Zahl wird zurüchgeschickt und im Empfänger wird sei es
das Timing sowie das Resultat verifiziert und der Result des Ergebnis
mit der xor Funktion gecheckt.

Es gibt aber zig Variationen, wie auch einfache lookuptable mit 32 byte
und es wird einfach die Summe eines irgendein 8bit checksum bei jedem 
Zeichen susammengezahlt und dies mit der summe der einzelnen Lookups 
multipliziert und zusammengezahlt. Bit6 heisst, Wert +64  und
bit 7 heisst "resultat ist 0-value" . Bei bit 5 wird der Tabellenindex 
von hinten gelesen. Resultat wird dann mit je nach checksum 6 
unterschiedlichen Fixwerten verodert. Dies z.B. bei einem 6pin PIC mit 
einem sehr kleinen Speicher und eeprom welches auch Features flags sowie 
Serialnummer beinhaltet und pin/puk/... .

1
char*
2
challenge() {  // return 7byte 
3
  byte i=0,j,k; word t;
4
  j=4; memcpy(tmp+i,&entropy,j);  i+=j;
5
  eeread(EE_CNT,&t,2); t++; eewrite(EE_CNT,&t,2);
6
  j=2; memcpy(tmp+i,&t,j);  i+=j;
7
  eeread(EE_LFR,&t,2); t=lfr(t); eewrite(EE_CNT,&t,2);
8
  j=2; memcpy(tmp+i,&t,j);  i+=j;
9
  des_enc(tmp,tmp,DES_KEY);
10
  for(k=i=7,j=tmp[i];i--;k^=j)  // some randomizing
11
    j+=tmp[j],tmp[j]^=k;
12
    tmp[7]=0;
13
  return tmp;
14
}
15
16
byte
17
xor(void*out, void*in, byte size) { // return 0 if all resulting bits are zero
18
  byte i;
19
  for(i=0;size--;i|=out[size]) out[size]^=in[size];
20
  return i;
21
}
22
23
void
24
tdes(void*out, void*in, void*key1, void*key2, void*key3) {
25
  des_enc(out,in,key1);
26
  des_dec(out,out,key2);
27
  des_enc(out,out,key3);
28
}
29
30
void
31
response(char*dat) {  // from 7byte key challange it return 3byte response
32
  byte t,k,i,j; dword r=0,ret=0;
33
  des_key(key,dat);
34
  for(k=8,i=0,j=7;k--; j^=i) i+=key[k]; k>>=3; if(k>=10) k-=10; k<<=3; // checksum return value from 0-9  multiplied by 8 for indexing
35
  memcpy_P(tmp+16,P_UID,8);
36
  memcpy_P(tmp+8,P_KEYS+k,8);
37
  tdes(tmp,tmp+16,key,tmp+8,key);
38
  xor(tmp,tmp+16,8);
39
  for(k=i=7,j=tmp[i];i--;k^=j)      // some randomizing
40
    j+=tmp[i],tmp[i]^=k;
41
  for(j=i=0;i<7;i++)            // shift
42
    j=!!tmp[i]&0x80, tmp[i]<<=1, tmp[i]+=j;
43
  des_key(key,tmp);
44
  memcpy_P(tmp+8,P_PID,8);
45
  des_enc(tmp+16,tmp+8,key); xor(tmp+16,tmp+8,8);
46
  *tmp++;
47
  des_key(key,tmp);
48
  des_enc(tmp+24,tmp+8,key); xor(tmp+24,tmp+8,8);
49
  t=tmp[13]; i=t>>2; for(j=24;j--;r+=bit(tmp,128+i++)) r<<=1; 
50
  if(t&0x40) r^=0xfff; if(r&0x80) 
51
  for(j=24;j--;r>>=1) t=!!r&1,res<<=1,res+=t; else res=r;
52
  memcpy(&r,tmp+11,2); res^=r; r=0;
53
#ifdef EE_FLAGS 
54
  eeread(EE_FLAGS,&r+2,1); r&=0x550000; res^=r;
55
#endif
56
  return res;
57
}

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.