Ho un file
testfile
e una stringateststring
.Stessi contenuti, diversi MD5 - File e stringaIn un guscio ho scritto:
echo "a" > testfile
poi
xxd testfile
così posso vedere i valori esadecimali della mia fileContent
uscita:0000000: 610a a.
vedere il mio codice:
int file; struct stat s; unsigned long size; char* buffer; char md5[MD5_DIGEST_LENGTH] file = open("testfile", O_RDONLY); if (file < 0) return false; if (fstat(file, &s) < 0) { close(file); return false; } size = s.st_size; //GET FILE SIZE printf("filesize: %lu\n", size); //PRINT FILESIZE FOR DEBUGGING buffer = (char*)mmap(0, size, PROT_READ, MAP_SHARED, file, 0); //MAP FILE CONTENT TO BUFFER MD5((unsigned char*)buffer, size, md5); //GENERATE MD5 munmap(buffer, size); //UNMAP BUFFER close(file); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", md5[i]); printf("\n"); unsigned char* teststring = "\x61\x0a"; //SAME STRING AS IN THE FILE MD5((unsigned char*)teststring, 2, md5); for (int i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", md5[i]); printf("\n");
esso stampa:
filesize: 2 60b725f10c9c85c70d97880dfe8191b3 e29311f6f1bf1af907f9ef9f44b8328b
due completamente diverse hash MD5.
Ho provato a scrivere ilbuffer
in un file
e scrivere ilteststring
in un file sono la stessa!
dal perché?
non è lobuffer
uguale alteststring
?
6
A
risposta
2
L'hash corretto è il primo hash, 60b725f10c9c85c70d97880dfe8191b3
.
$ echo "a" | md5
60b725f10c9c85c70d97880dfe8191b3
Il tuo secondo hash sembra essere l'hash di "\ x64 \ x0a", o il carattere 'd' seguito da un ritorno a capo:
$ echo "d" | md5
e29311f6f1bf1af907f9ef9f44b8328b
Sei sicuro il codice che avete inviato è quello che stai compilando/correndo? Hai dimenticato di ricompilare? Stai eseguendo un vecchio binario?
+1
"Sei sicuro che il codice che hai postato sia quello che stai compilando?" - Molto probabilmente no. 'char md5 []' deve essere unsigned, 'teststring' deve essere ** not ** unsigned per renderlo compilabile in primo luogo ... – DevSolar
Non sono un programmatore C/C++ quindi non posso fornire alcun aiuto troppo tecnico. In che formato è il file (Unicode/ASCII ecc.)? La lunghezza del buffer (una volta popolata) è uguale alla lunghezza del teststring? – series0ne
sì, entrambi hanno lunghezza = 2 caratteri; format = ascii – bricklore
stampa il buffer/stringa in esadecimale (non gli md5), vedi se sono diversi. se sono uguali, probabilmente è necessario utilizzare la funzione md5 in un modo diverso (alcune implementazioni richiedono di completare l'operazione md5) – x4rf41