Gå til innhold

Kode som genererer HMAC-SHA1 checksum?


Anbefalte innlegg

Videoannonse
Annonse

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 av nahoy
Lenke til kommentar

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 av nahoy
Lenke til kommentar
  • 1 måned senere...
[...]

 

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
[...]

 

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
[...]

 

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
...

 

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
  • 1 måned senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...