Gå til innhold

tutorials på md5-hashing?


Anbefalte innlegg

Heisann folkens!

 

Sitter for tiden og lærer meg C++ og vil gjerne lære meg litt md5-hashing ol. da jeg har planer om å lage et lite program rundt dette

 

Etter som jeg forstår har ikke noen compilere noen headere eller noe som deklarerer for noen md5-funksjon

 

Satte meg ned og lette på google, noe som i dette tilfellet ble litt traumatisk for en newbie som meg :)

For hver header-fil jeg fant så fant jeg ut at de lignet IKKE på hverandre.

Og ikke en eneste side som jeg kunne finne hadde en pen og pyntelig forklaring om hvordan man brukte headerfilene som var på sidene.

 

Er det noen her som har en bra tutorial angående md5-hashing ?

Helst da for programmering under windows for øyeblikket..

 

evt. vet av en side hvor man har headerfiler PLUSS en forklaring hvordan man bruker dem, og hva man evt trenger i tillegg

 

 

PS: etter som jeg ser på sidene som jeg fant så ser det så utrolig komplisert ut å bruke md5-funksjonen i forhold til PHP hvor man bare trengte å skrive

$var = md5($var);

Er det så mye verre å få hashet en streng i C/C++ i forhold til PHP?..

 

mvh

 

Håkon

Lenke til kommentar
Videoannonse
Annonse

Heisann.

 

Satte meg ned og lekte med openssl under linux i går.'

Prøvde å snekre sammen et eksempelprogram som hasher en streng, men får det ikke til!

 

dette er koden

#include <iostream>
#include <openssl/md5.h>

using namespace std;

main()
{
   unsigned char md = 0;
   unsigned char var;
   unsigned long n = 1024;
   unsigned char d = 16;
   var = *MD5(&d, n, &md);

       cout << var;
}

 

Jeg har prøvd følgende kompileringskommandoer (noen på måfå..)

 

gcc -lstdc++ -o test3 test3.cpp

/tmp/ccJUaeqE.o(.text+0x34): In function `main':

: undefined reference to `MD5'

collect2: ld returned 1 exit status

 

 

gcc -lssl -o test test3.cpp

/tmp/cci3dorr.o(.text+0x49): In function `main':

: undefined reference to `std::cout'

/tmp/cci3dorr.o(.text+0x4e): In function `main':

: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, unsigned char)'

/tmp/cci3dorr.o(.text+0x77): In function `__static_initialization_and_destruction_0(int, int)':

: undefined reference to `std::ios_base::Init::Init[in-charge]()'

/tmp/cci3dorr.o(.text+0xa8): In function `__tcf_0':

: undefined reference to `std::ios_base::Init::~Init [in-charge]()'

/tmp/cci3dorr.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

collect2: ld returned 1 exit status

 

g++ -lssl -o test test3.cpp

Denne kompilerer faktisk MEN får segmentation fault når jeg prøver å kjøre programmet

 

g++ -lstdc++ -o test3 test3.cpp

/tmp/ccZQ9XQ9.o(.text+0x34): In function `main':

: undefined reference to `MD5'

collect2: ld returned 1 exit status

 

 

 

Jeg antar jeg mangler noen libs. men hvilken? Noen som kunne hjuplet meg litt?

Hva trengs å legge til i .cpp-fila mi, evt hvilken kommando jeg skal bruke.

 

PS: er koden ellers korrekt til sitt formål? Er litt usikker nemlig, lite forståelig manualen på

http://www.openssl.org/docs/crypto/md5.html#

for en nybegynner for meg :p

 

mvh

 

Håkon

Lenke til kommentar

#include <iostream>
#include <cstring> // for strlen
#include <openssl/md5.h>

using namespace std;


int main()
{

       char* data = "Dette er en test";
       unsigned char* digest = static_cast<unsigned char*>(malloc(MD5_DIGEST_LENGTH));

       MD5_CTX ctx;
       MD5_Init(&ctx);

       MD5_Update(&ctx, data, strlen(data));
       MD5_Final(digest, &ctx);

       for(int i = 0; i < 16; i++)
               cout << digest[i];
       cout << endl;

       return(0);
} // main

 

Returnerer ett-eller-annet.

 

Edit:

Kompiler:

g++ -ggdb -Wall prog.cpp -l crypt -o prog

 

Edit2:

Bruk reset (kommandoen) om den skulle kødde til konsollet.

Endret av søppel
Lenke til kommentar

#include <iostream>
#include <openssl/md5.h>

int main(int argc, char** argv) {
 // Lag et md5-context
 MD5_CTX ctx;
 // Lagringsplass for digest
 unsigned char digest[16];
 // Init md5
 MD5_Init(&ctx);
 // Gi strengdataene fra argv[1] til md5
 MD5_Update(&ctx, argv[1], strlen(argv[1]));
 // Beregn resultatet
 MD5_Final(digest, &ctx);
 // Skriv ut resultatet i hex-form
 std::cout << std::hex;
 for(int i = 0; i < 16; i++) {
   std::cout << int(digest[i]);
 }
 std::cout << std::endl;
}

Noe skitten kode, men den fungerte uten noen problemer.

Den lager en md5-sum av første kommandolinjeargument.

Kompiler den slik:

g++ md5.cpp -o md5 -lssl

Forøvrig har jeg testet den mot php for å garantere at den gir samme sum av en gitt string.

Lenke til kommentar

wow! Tusen hjertelig zyp! Dette var mer enn jeg forventet :D

 

Men jeg må stille noen spørsmål..

Hva gjør egentlig int argc mellom main-parantesene?

 

Jeg prøvde nemlig å gjøre om programmet slik at strengen som skulle hashes i stedenfor skulle skrives inn via cin.get eller rett og slett fra en variabel som er satt til strengen som jeg vil hashe. Men det gikk ikke helt etter planen.

 

prøvde meg på

main()
{
    int argc <--- ??
    char* pwd[] = "streng-som-skal-hashes"; <--- blir dette riktig foresten?

    // Lag et md5-context
   MD5_CTX ctx;
   // Lagringsplass for digest
   unsigned char digest[16];
   // Init md5
   MD5_Init(&ctx);
   // Gi strengdataene fra pwd til md5
   MD5_Update(&ctx, pwd, strlen(pwd));
   // Beregn resultatet
   MD5_Final(digest, &ctx);
   // Skriv ut resultatet i hex-form
   std::cout << std::hex;
   for(int i = 0; i < 16; i++) {
  std::cout << int(digest[i]);
}
std::cout << std::endl;	
}

 

Beklager hvis jeg spør for mye :p

Er ustø på en del basics enda i c++

Lenke til kommentar
Men jeg må stille noen spørsmål..

Hva gjør egentlig int argc mellom main-parantesene?

 

Jeg prøvde nemlig å gjøre om programmet slik at strengen som skulle hashes i stedenfor skulle skrives inn via cin.get eller rett og slett fra en variabel som er satt til strengen som jeg vil hashe. Men det gikk ikke helt etter planen.

Altså, argc (argument count) er et tall som sier hvor mange argumenter programmet starter med, altså hvor mange det er i argv (argument vector).

Det skal alltid være minst en i argv, ettersom den første er navnet på programmet slik det ble startet.

 

Hvis du vil bruke en egen string i stedet så lager du bare den først, så bytter du ut alle referanser til argv[1] med den.

 

Skrev om eksempelet mitt:

#include <iostream>
#include <openssl/md5.h>

int main(int argc, char** argv) {
 // Statisk string som skal hashes
 char data[] = "Hello";
 // Lag et md5-context
 MD5_CTX ctx;
 // Lagringsplass for digest
 unsigned char digest[16];
 // Init md5
 MD5_Init(&ctx);
 // Gi strengdataene fra data til md5
 MD5_Update(&ctx, data, strlen(data));
 // Beregn resultatet
 MD5_Final(digest, &ctx);
 // Skriv ut resultatet i hex-form
 std::cout << std::hex;
 for(int i = 0; i < 16; i++) {
   std::cout << int(digest[i]);
 }
 std::cout << std::endl;
}

Lenke til kommentar

Forøvrig har jeg testet den mot php for å garantere at den gir samme sum av en gitt string.

Tips, programmet md5sum følger med i de fleste distroer, så slipper du å klaske sammen et phpscript for å kalkulere sjekksummen. Skal du bruke md5 for å holde data hemmelig eller for å sikre integritet, så ville jeg heller sett på SHA-1 først som sist.

Lenke til kommentar
Tips, programmet md5sum følger med i de fleste distroer, så slipper du å klaske sammen et phpscript for å kalkulere sjekksummen.

Det var snakk om å starte opp commandline php, skrive en one-liner og trykke ctrl+d, ikke mye lengre enn å gjøre det med md5sum.

bash-2.05b$ php
<?=md5('hello')?>
5d41402abc4b2a76b9719d911017c592

bash-2.05b$ echo -n hello | md5sum
5d41402abc4b2a76b9719d911017c592  -

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...