uint64_t + MD5

Salve a tutti!
Vorrei unire una serie di variabili in una String per poi firmarle con MD5. Tra le variabili ci sono dei dati uint64_t e non riesco a convertirli in String.

La libreria MD5: GitHub - tzikis/ArduinoMD5: The first easily-embeddable MD5 library for Arduino

Se mi riuscite a dare una mano anche in questo topic ne sarei grato :slight_smile: : Struct + AES +RF24 Help!!! - Software - Arduino Forum

Grazie in anticipo!

Se è solo per un checksum tanto vale trattare il tutto come un array di byte. Il numero di variabili è fisso? tipo una struct?

A me preoccupa che quella libreria faccia uso di memoria dinamica su un AVR.

Ciao, grazie per la risposta!
Diciamo che il valore MD5 fa parte di una Struct. Infatti sarebbe l'hash del resto della Struct.
Se dai un'occhiata all'altro topic che ho postato, il valore Data1 = "c5390e6ad642d182fe46e36c226589ff" sarebbe appunto l'MD5 del RESTO della struct. Ovviamente c5390e6ad642d182fe46e36c226589ff in quel caso non lo è altrimenti non avrei chiesto.

Un checksum a 8bit è troppo poco sicuro per i tuoi gusti? Un hash è impegnativo come calcolo

NegativeResistor:
Ovviamente c5390e6ad642d182fe46e36c226589ff in quel caso non lo è altrimenti non avrei chiesto.

... scusa ma non capisco questa tua frase ... cosa "non lo è" ? o meglio non è cosa ?

Inoltre ... se vuoi accedere ad una variabile in due modi diversi (uint64_t e array di byte) ti basa usare una union.

Guglielmo

RobertoBochet:
Un checksum a 8bit è troppo poco sicuro per i tuoi gusti? Un hash è impegnativo come calcolo

Beh diciamo che un MD5 è meglio... Anche se non è poi un gran che neppure quello dal punto di vista crittografico.

gpb01:
... scusa ma non capisco questa tua frase ... cosa "non lo è" ? o meglio non è cosa ?

Innanzitutto grazie per la risposta. Intendevo dire che quel valore (facendo riferimento all'altro post) non è l'md5 dei valori successivi dello Struct. È invece l'MD5 di una stringe casuale che non ricordo dove ho preso. È solo un esempio insomma.

gpb01:
Inoltre ... se vuoi accedere ad una variabile in due modi diversi (uint64_t e array di byte) ti basa usare una union.

Guglielmo

Mi pare che quella libreria voglia una String come input per elaborare l'hash. Quindi il mio obbiettivo è quello di comporre una String con tutti i dati che voglio hashare (ovvero tutte le altre variabili della Struct, tranne ovviamente la prima che deve essere appunto l'MD5). Il mio problema è appunto convertire quel benedetto uint64_t in una String da poter concatenare a quella finale. In pratica:

struct dataStruct {
String MD5 = "c5390e6ad642d182fe46e36c226589ff";
  unsigned long Data2 = 0215157474;
  byte Data3[16] = { 0xf3, 0x44, 0x81, 0xec, 0x3c, 0xc6, 0x27, 0xba, 0xcd, 0x5d, 0xc3, 0xfb, 0x08, 0xf2, 0x73, 0xe6, };
  uint64_t Data4 = 0x9281fc47b5LL;
  byte Data5 = 0x44;
} pacchetto;

String hashReady = String(Data2) + String(Data3) + String(Data4) + .....

pacchetto.MD5 = funzionehashMD5(hashReady)

... una domanda a latere ... su che Arduino fai girare il tutto ?

Guglielmo

gpb01:
... una domanda a latere ... su che Arduino fai girare il tutto ?

Guglielmo

:smiley: :smiley: :smiley:

Uno.... Per la precisione solo l'ATMEGA328p con forse l'XTAL esterno.... Ma direi di si senno è rincoglionito.. L'AES lo regge bene, in pochi ms mi fa un CBC 256b.... Penso che per un MD5 non ci siano problemi... Penso...

... i problemi sono nell'uso dell'allocazione dinamica della memoria e nel uso della classe String che, anche essa alloca dinamicamente la memoria.

Sei su una piccola MCU, con soli 2KB di SRAM, non hai un sistema operativo e non hai un "garbage collector" ... per cui ... in un attimo e la SRAM finisce ed il tuo programma impazzisce ... ed anche tu per capire il perché.

Per quanto possibile, su Arduino, evita tutto ciò che alloca dinamicamente la memoria, perché poi, diagnosticare i problemi, può diventare un incubo.

Per le stringhe impara ad usare le stringhe classiche del C (array di char) ed evita di usare la classe String.

Il tutto è stato detto e ripetuto centinaia di volte su questo forum ... basta fare un po' di ricerche :wink:

Guglielmo

md5 non è un sistema di cifratura a due vie! è un hash e si usa come sistema di controllo. Quindi la tua affermazione ha poco senso, cosa te ne devi dare del hash md5 della struct?
Come suggerisce Guglielmo la union ti renderebbe tutto più semplice, basta aggiungere un char farlocco alla fine della struct contenente '\0'
Anche a me il tutto sembra pesantino, come hai verificato il tempo di calcolo dell'AES?

gpb01:
Per le stringhe impara ad usare le stringhe classiche del C (array di char) ed evita di usare la classe String.

Ottimo. Mi informerò a riguardo. Grazie mille per il supporto!

RobertoBochet:
md5 non è un sistema di cifratura a due vie! è un hash e si usa come sistema di controllo. Quindi la tua affermazione ha poco senso, cosa te ne devi dare del hash md5 della struct?
Come suggerisce Guglielmo la union ti renderebbe tutto più semplice, basta aggiungere un char farlocco alla fine della struct contenente '\0'
Anche a me il tutto sembra pesantino, come hai verificato il tempo di calcolo dell'AES?

Infatti lo uso come sistema di controllo di integrità del contenuto del pacchetto cifrato oltre al CRC dell'RF24.

Per i tempi di calcolo c'è uno sketch di prova nella libreria. I tempi sono comunque dichiarati qui: new AES library - Libraries - Arduino Forum

Grazie mille del supporto!

Per un controllo di integrta basta un checksum a 16bit e stai tranquillo, se ci tieni al md5 usa pure quello.

RobertoBochet:
Per un controllo di integrta basta un checksum a 16bit e stai tranquillo, se ci tieni al md5 usa pure quello.

Hahahahahaha si preferisco l'MD5 :smiley: