nahoy Skrevet 22. november 2007 Rapporter Del Skrevet 22. november 2007 Jeg skal lage et program der jeg er er nødt til å bruke hmac-sha1 checksummen av en fil. Finnes det noen bra biblioteker/kodesnutter som tar seg av den slags? Lenke til kommentar
DeadManWalking Skrevet 22. november 2007 Rapporter Del Skrevet 22. november 2007 Det finnes en klasse for dette hvis du bruker .NET 3.0 Link Lenke til kommentar
nahoy Skrevet 22. november 2007 Forfatter Rapporter Del Skrevet 22. november 2007 (endret) Bruker dev-c++, dessverre. Fant ut at man kan bruke openssl, men jeg har litt problemer med den. Når jeg kjører koden under, får jeg ikke samme checksum som når jeg bruker et krypteringsprogram. unsigned int outlen=20; char * test; char * thekey; thekey= new char [20]; HMAC(EVP_sha1(), "test", 4, (unsigned char*)"test", 4, (unsigned char*)thekey, &outlen); cout << thekey; når jeg kjører koden over, får jeg: 3FF6515CA77320205BE8E7D13FE1AF3B3DC42D5FB5 Når jeg bruker hashcalc, med samme verdier, får jeg: 0c94515c15e5095b8a87a50ba0df3bf38ed05fe6 Hva gjør jeg galt? Endret 22. november 2007 av nahoy Lenke til kommentar
nahoy Skrevet 23. november 2007 Forfatter Rapporter Del Skrevet 23. november 2007 Jeg har prøvd litt forskjellig, men kommer ingen vei. Les om hmac() her Lenke til kommentar
nahoy Skrevet 23. november 2007 Forfatter Rapporter Del Skrevet 23. november 2007 *sukk* Får vel bare gå til anskaffelse av visual da.. Lenke til kommentar
DeadManWalking Skrevet 23. november 2007 Rapporter Del Skrevet 23. november 2007 Hehe det er ikke så rask responstid her inne, hvis du gir det noen dager så pleier man å få svar på det meste. Selv om det ikke er så dumt å lære seg .NET 3.0, derimot hvis dette skal støtte flere platformer så kan du ikke bruke .NET. Hvis det var meningen å støtte flere platformer i utgangspunkte så ikke gå vekk i fra det. Lenke til kommentar
nahoy Skrevet 23. november 2007 Forfatter Rapporter Del Skrevet 23. november 2007 (endret) Programmet jeg lager skal først og fremst fungere i xp. Lager et program som blant annet skal bytte skrifttype zen vision:m's firmware. Trenger en hmac-sha1-funksjon for å lage checksummen som skal ligge på slutten av fila. Kommer til å legge ut programmet på nettet siden, så det er så klart en fordel om det hadde vært mulig at det var kompatibelt med andre os, men det kan jeg jo eventuelt endre senere, om jeg får svar. Edit: Fant visual studio 6.0 liggende og slenge her. Kan jeg bruke det? Edit:Fikk det til med openssl allikevel. Er ikke helt sikker på hva jeg gjorde feil, men her er den riktige koden min: char * thekey; unsigned int thekeylen=20; thekey= new char [20]; HMAC(EVP_sha1(), "CTL:N0MAD|PDE0.DPMP.", 20, (unsigned char*)"data", 4, (unsigned char*)thekey, &thekeylen); for(int i=0; i<thekeylen; i++) printf("%02x", thekey[i] & 0xff); delete[] thekey; Endret 24. november 2007 av nahoy Lenke til kommentar
kernel Skrevet 26. desember 2007 Rapporter Del Skrevet 26. desember 2007 [...] HMAC(EVP_sha1(), "CTL:N0MAD|PDE0.DPMP.", 20, (unsigned char*)"data", 4, (unsigned char*)thekey, &thekeylen); Dette ser ikke bra ut, er du uheldig så er "data" i read-only minne, og hvis OpenSSL modifiserer dette bufferet, så tryner programmet ditt. Jeg skjønner ikke problemet ditt i utgangspunktet, det er tonnevis av sha-1 implementasjoner med åpen kildekode, og man skriver jo HMAC funksjon derfra på 10 min. Ingen avhengigheter, ren C og 100% portabelt. Lenke til kommentar
Giddion Skrevet 27. desember 2007 Rapporter Del Skrevet 27. desember 2007 [...] HMAC(EVP_sha1(), "CTL:N0MAD|PDE0.DPMP.", 20, (unsigned char*)"data", 4, (unsigned char*)thekey, &thekeylen); Dette ser ikke bra ut, er du uheldig så er "data" i read-only minne, og hvis OpenSSL modifiserer dette bufferet, så tryner programmet ditt.... Velkommen til forumet kernel. Det er alltid bra med nye folk og meninger. Når det gjelder "data" så blir den sendt som en const unsigned char* så det er veldig liten sannsynlighet for at den blir endret i funksjonen. Lenke til kommentar
kernel Skrevet 27. desember 2007 Rapporter Del Skrevet 27. desember 2007 [...] HMAC(EVP_sha1(), "CTL:N0MAD|PDE0.DPMP.", 20, (unsigned char*)"data", 4, (unsigned char*)thekey, &thekeylen); Dette ser ikke bra ut, er du uheldig så er "data" i read-only minne, og hvis OpenSSL modifiserer dette bufferet, så tryner programmet ditt. ... Velkommen til forumet kernel. Det er alltid bra med nye folk og meninger. Når det gjelder "data" så blir den sendt som en const unsigned char* så det er veldig liten sannsynlighet for at den blir endret i funksjonen. Takker. Du har rett, hvis prototypen på HMAC funksjonen har const unsigned char* type på data og key buffer. Forsøkte å sjekke OpenSSL API doc'en, det eneste jeg fant var: #include <openssl/hmac.h> unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, const unsigned char *d, int n, unsigned char *md, unsigned int *md_len); som ser helt forskjellig ut, fra det OP brukte. Key og data buffer er byttet om, og md buffer mangler i koden til 'nahoy'. Lenke til kommentar
Giddion Skrevet 27. desember 2007 Rapporter Del Skrevet 27. desember 2007 ... Du har rett, hvis prototypen på HMAC funksjonen har const unsigned char* type på data og key buffer. Forsøkte å sjekke OpenSSL API doc'en, det eneste jeg fant var: #include <openssl/hmac.h> unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, const unsigned char *d, int n, unsigned char *md, unsigned int *md_len); som ser helt forskjellig ut, fra det OP brukte. Key og data buffer er byttet om, og md buffer mangler i koden til 'nahoy'. Du har helt rett. Det er noe som ikke stemmer. Lenke til kommentar
Wattengård Skrevet 28. desember 2007 Rapporter Del Skrevet 28. desember 2007 Sånn halvveis off topic: Visual C++ Express er vel gratis? Og har forsåvidt full funksjonalitet i forhold til betalvarene... -C- Lenke til kommentar
Mr. K Skrevet 28. desember 2007 Rapporter Del Skrevet 28. desember 2007 Visual C++ Express er gratis ja. Lenke til kommentar
nahoy Skrevet 19. februar 2008 Forfatter Rapporter Del Skrevet 19. februar 2008 Jaja.. Fikk det nå til i hvertfall. Lagde et program som lager og lager checksummer for zen vision:m firmware. Det funket fint. Her er slik koden min ble til slutt: // This program alters a nk.bin // file, calculates a new checksum // and replaces the existing one #include <cstdlib> #include <iostream> #include <fstream> #include <string> //openssl #include <openssl/hmac.h> using namespace std; int main(int argc, char *argv[]) { //some bytes from the original firmware to determine where the NULL block starts unsigned char startofnull[8] = {0x4C, 0x4C, 0x55, 0x4E, 0x14, 0x00, 0x00, 0x00}; char* filename; if(argv[1]) { filename=argv[1]; } else { filename="nk.bin"; } int nksize; int nullstart; char * nkdata; fstream nkbin (filename, ios::in|ios::out|ios::binary|ios::ate); if(!nkbin.is_open()) { cout << "Couldn't open " << filename << "\nExiting program\n\n"; system("pause"); EXIT_FAILURE; } nksize=nkbin.tellg(); nkdata = new char [nksize]; nkbin.seekg (0, ios::beg); nkbin.read(nkdata, nksize); cout << "Successfully read " << filename << " to memory.\nSize: " << nksize << endl; for(int j=0; j<nksize; j++){ for(int a=0; a<8; a++) { if(nkdata[j+a]!=startofnull[a])break; if(a==7) { nullstart=j; cout << "Found start of nullblock.\n"; cout << "That is byte number: " << nullstart << "\n\n"; } } } if(nullstart==0) { cout << "Couldn't find NULL block\nExiting program\n\n"; system("pause"); EXIT_FAILURE; } //current task is to write something which calculates the hash and creates a new null checksum char * thekey; unsigned int thekeylen=20; thekey= new char [20]; HMAC(EVP_sha1(), "CTL:N0MAD|PDE0.DPMP.", 20, (const unsigned char*)nkdata, nullstart, (unsigned char*)thekey, &thekeylen); cout << "New key to be inserted: "; for(int i=0; i<thekeylen; i++) printf("%02x", thekey[i] & 0xff); cout << "\n\n"; //inserting new key to file nkbin.seekg(nullstart+8); nkbin.write(thekey, 20); if(!nkbin.fail())cout << "Wrote to file without problems."; else(cout << "There were unknown error. Probably it has something to do with writing to the file"); //cleaning'n'closing nkbin.close(); delete[] thekey; delete[] nkdata; cout << "\n\n"; system("PAUSE"); return EXIT_SUCCESS; } Andre kan vel bruke den som mal hvis de skal gjøre noe lignende. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå