Forum: Mikrocontroller und Digitale Elektronik Device Electronic Signature menschenlesbar machen?


von Bauform B. (bauformb)


Lesenswert?

Mahlzeit!

Benutzt hier jemand die 96-Bit-UID der STM32-Familie? Die würde sich ja 
als Geräte-Seriennummer anbieten. Aus der Kryptografie-Ecke hört man, 
dass man alle 96 Bits nutzen muss, damit sie eindeutig bleibt. Dass 
effektiv viel weniger Bits drin stecken, wäre für eine Seriennummer ja 
nicht schlimm -- außer, jemand muss sie auf einen Zettel schreiben und 
am Telefon vorlesen.

Einfach als Hex wären das 24 Zeichen, aber immerhin unverwechselbare. 
Wenn die Nummer kürzer werden soll, muss man aufpassen, weil 0 und O 
immer verwechselt oder am Anfang weggelassen werden. Klein- und 
Großbuchstaben sind mühsam auszusprechen. Bleiben noch :+*! um auf 41 
verschiedene zu kommen. Damit könnte man drei Gruppen zu je 6 Zeichen 
verwenden. Gruppen sind immer gut und man braucht auf dem uC nur eine 
32-Bit-Division.

Dann fehlt noch eine Prüfziffer - ein ganz eigenes Thema...

Für Steckerpins gibt es eine Art Standard-Alphabet, indem verwechselbare 
Buchstaben wie OIJ nicht vorkommen. Gibt es sowas mit einem etwas 
größeren Zeichenvorrat? Wie macht man das richtig?

von Thomas Z. (usbman)


Lesenswert?

Nun du legst dir ein Alphabet an mit z.B mit 5 Bit, dann codierst du 
jeweils 5 Bit mit deinem Alphabet und shiftest diese Bits dann aus 
deiner Quelle raus.
Das geht natürlich auch mit 4 Bit oder 6 Bit.
Sehr viele Freischaltcodes basieren auf solchen Verfahren

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Bauform B. schrieb:
> Benutzt hier jemand die 96-Bit-UID der STM32-Familie? Die würde sich ja
> als Geräte-Seriennummer anbieten. Aus der Kryptografie-Ecke hört man,
> dass man alle 96 Bits nutzen muss, damit sie eindeutig bleibt.

Es ist etwas länger her dass ich da rein geschaut habe. Ganz so einfach 
war das mit der Seriennummer und Kryptografie nicht. Wenn ich das noch 
richtig im Kopf habe, dann sind in der Seriennummer bekannte 
Informationen wie der Typ encoded. Ich habe auch im Kopf, dass die 
x-y-Position des Chips auf dem Wafer in der Seriennummer kodiert ist. 
Das schränkt den Wertebereich der Seriennummer ein.

Kram dich mal durch die Doku von ST.

> Wie macht man das richtig?

Richtig gibt es nicht. Irgendwie muss der Informationsgehalt von 96-Bit 
kodiert werden. Manche Gruppen von Personen kommen mit manchen Systemen 
besser oder schlechter zurecht. Es gibt z.B. immer wieder Ansätze wie 
man Base64, Base32, usw. sicherer/besser lesbar machen kann.

Dann gibt es seit einiger Zeit Verfahren bei dem Wörter verwendet 
werden. Da kommen merkwürdige Phrasen raus. Ich glaube die PGP Word List 
https://en.wikipedia.org/wiki/PGP_word_list war einer der ersten Listen 
für solche Fälle (8 Bits pro Wort). S/KEY verwendet eine andere Liste in 
RFC2289 https://tools.ietf.org/html/rfc2289#page-4-19 (11 Bits pro 
Wort). Es gibt sicher noch andere.

Das heißt, mit der S/KEY Liste brauchst du mindestens 9 Wörter, mit der 
PGP-Liste 12. Eher mehr, wenn du eine Checksumme einbaust. Ob deine 
Benutzer dann in der Lage sind die Wörter richtig zu übertragen ...

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Hannes J. schrieb:
> Wenn ich das noch richtig im Kopf habe, dann sind in der
> Seriennummer bekannte Informationen wie der Typ encoded.
> Ich habe auch im Kopf, dass die x-y-Position des Chips auf
> dem Wafer in der Seriennummer kodiert ist.

So ganz pauschal ist das richtig, aber...

> Kram dich mal durch die Doku von ST.

Das war jetzt ein spannendes Abenteuer mit eindeutigem Ergebnis: 
Aussichtslos. ST hätte sich den Random Number Generator sparen können.

Anfangs dachte ich, es ist nur schlecht dokumentiert, aber immer gleich 
implementiert (vielleicht bis auf die allerersten Chips) -- bis ich die 
RM0376 und RM0377 gelesen hatte. Bei den L031, L032 und verwandten steht 
die x-y-Position nicht im ersten Wort, sondern hinter den anderen 
beiden, mit etwas ABSTAND (0x1FF8 0050, 0054, 0064). Na gut, ein 
Tippfehler in zwei Manuals, Copy+Paste. Die Manuals werden aber durchaus 
nicht einfach per Copy+Paste erzeugt, das Flash Size Register heißt mal 
F_ID, F_SIZE oder auch FLASH_SIZE, da ist UID vs. U_ID schon langweilig.

Noch besser: das RM0454 erwähnt die UID-Register garnicht während sie im 
RM444 ausführlich beschrieben sind. Beide RM gelten aber für das gleiche 
Silizium (IDCODE 0x460 und 0x466). Alternativ hätten verschiedene Chips 
den gleichen IDCODE; das will ich nun wirklich nicht glauben.

>> Wie macht man das richtig?
> Dann gibt es seit einiger Zeit Verfahren bei dem Wörter verwendet
> werden. Da kommen merkwürdige Phrasen raus. Ich glaube die PGP Word List
> https://en.wikipedia.org/wiki/PGP_word_list war einer der ersten Listen
> für solche Fälle (8 Bits pro Wort). S/KEY verwendet eine andere Liste in
> RFC2289 https://tools.ietf.org/html/rfc2289#page-4-19 (11 Bits pro
> Wort). Es gibt sicher noch andere.

Cool! Aber irgendwie geht das in die falsche Richtung...

> Ob deine Benutzer dann in der Lage sind die Wörter
> richtig zu übertragen ...

Der Fehler ist ja eigentlich das Loch in der Maschinenlesbarkeit. Jedes 
Telefon kann QR-Code lesen und hat Internet, warum denke ich immer noch 
an Papier und Bleistift?

von A. B. (Gast)


Lesenswert?

Bauform B. schrieb:
> Noch besser: das RM0454 erwähnt die UID-Register garnicht während sie im
> RM444 ausführlich beschrieben sind. Beide RM gelten aber für das gleiche
> Silizium (IDCODE 0x460 und 0x466). Alternativ hätten verschiedene Chips
> den gleichen IDCODE; das will ich nun wirklich nicht glauben.

Die G0x0 (mit dem RM0454) haben (soweit ich das an ein paar realen 
Exemplaren überprüft habe) aber dennoch die gesamte Peripherie der 
entsprechenden G0x1. Die Chips sind tatsächlich identisch, nur dass bei 
den G0x0 halt ein Teil eventuell nicht uneingeschränkt funktionsfähig 
ist. Sogar TS_CAL2 ist mit sinnvollen Werten im Flash drin, ebenso die 
UID. Allerdings waren bei einigen G0x0 in X- und Y-Koordinaten teilweise 
keine gültigen BCD-Ziffern, während ich das bei den G0x1 nicht gesehen 
habe. Kann natürlich sein, dass das ein Fehler im RM ist und nicht 
wirklich BCD gemeint ist ...

Aber unabhängig davon: Der OTP-Bereich ist sicher die sinnvollere 
Alternative. Gibt's bei den meisten STM32.

von Bauform B. (bauformb)


Lesenswert?

A. B. schrieb:
> Allerdings waren bei einigen G0x0 in X- und Y-Koordinaten teilweise
> keine gültigen BCD-Ziffern, während ich das bei den G0x1 nicht gesehen
> habe. Kann natürlich sein, dass das ein Fehler im RM ist und nicht
> wirklich BCD gemeint ist ...

Bei anderen Chips steht nur X & Y im Manual, aber ohne BCD dabei. Bei 
noch anderen steht nur "32 Bit" oder garnichts. Nichts ist unmöglich :)

> Der OTP-Bereich ist sicher die sinnvollere
> Alternative. Gibt's bei den meisten STM32.

Bei einem L4 mit den 2K-Pages würde ich auch das normale Flash benutzen, 
ist ja für einen guten Zweck ;) Aber die eingebaute Seriennummer spart 
die ganze Verwaltung; von wegen eindeutig...

von Max G. (l0wside) Benutzerseite


Lesenswert?

Thomas Z. schrieb:
> Nun du legst dir ein Alphabet an mit z.B mit 5 Bit, dann codierst
> du jeweils 5 Bit mit deinem Alphabet und shiftest diese Bits dann aus
> deiner Quelle raus.
Das könnte dann z.B.
3FY7 AA8C VE44 1234 Z575 lauten. Theoretisch liefern 0-9 und A-Z 
zusammen 36 Codes. Ein paar Verwechslungskandidaten solltest du aber 
berücksichtigen:
F/S am klassischen Telefon
1/I
0/O
Z/2
B/W
M/N
R/L in manchen asiatischen Sprachen

Ja, das ist nicht trivial. Irgendwas mit 4,5 Bit je Symbol wäre 
vermutlich optimal (d.h. zwei Symbole kodieren jeweils 9 Bit, gibt halt 
eine große Lookup Table mit 512 Einträgen). Dann wären mit 22 Symbolen 
noch 3 Bit für eine Checksumme übrig.

Oder du jagst die UUID durch einen Hash (MD5 oder so) und hoffst, nie 
eine Kollision zu bekommen. Dann musst du nur noch 16 oder 32 Bit 
kodieren.

von Bauform B. (bauformb)


Lesenswert?

Max G. schrieb:
> F/S am klassischen Telefon
> 1/I
> 0/O
> Z/2
> B/W
> M/N
> R/L in manchen asiatischen Sprachen

ja, das hatte ich befürchtet, dankeschön. Aber ich glaube, es reicht 
ganz knapp für 5 Bit, ich lasse nur F/S, 1/I, 0/O und Z/2 aus. Wie 
gesagt, es ist ja maschinenlesbar, das muss man besser nutzen.

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.