slakkis Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 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
søppel Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 Linux/*nix: http://www.openssl.org/docs/crypto/md5.html Eller så klart: man 3 md5 Vet ikke om Windows har noe slikt - eller om du må laste ned og installere noe. Sjekk på www.msdn.com ... eller så kan man kanskje installere OpenSSL for Windows også. Lenke til kommentar
slakkis Skrevet 6. oktober 2004 Forfatter Del Skrevet 6. oktober 2004 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 mvh Håkon Lenke til kommentar
søppel Skrevet 6. oktober 2004 Del Skrevet 6. oktober 2004 (endret) g++ prog.cpp -l ssl -o prog Segfaulten får du finne ut av selv, jeg har ikke tid. Compiler med debug-symboler; g++ -ggdb3 prog.cpp -l ssl -o prog ..og bruk "gdb prog". Endret 6. oktober 2004 av søppel Lenke til kommentar
slakkis Skrevet 6. oktober 2004 Forfatter Del Skrevet 6. oktober 2004 Den kompilerer, men får "segmentation fault" når jeg skal kjøre programmet Kan det være noe i sourcen som er feil ? Lenke til kommentar
sumptrollet Skrevet 6. oktober 2004 Del Skrevet 6. oktober 2004 Den kompilerer, men får "segmentation fault" når jeg skal kjøre programmet Kan det være noe i sourcen som er feil ? Prøv med gdb eller valgrind eller til nøds strace. Å finne ut hvorfor du har en segmentation fault kun utfra å titte i kildekoden er tilnærmet håpløst. Lenke til kommentar
søppel Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 (endret) #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 7. oktober 2004 av søppel Lenke til kommentar
zyp Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 #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
GeirGrusom Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 C++.NET: __gc Byte[] System::Cryptography::MD5::ComputeHash(__gc Byte[] buffer) Men nå er .NET litt teit å bruke i C++ igrunn, siden du forkaster noe av friheten du har i C++. Lenke til kommentar
slakkis Skrevet 7. oktober 2004 Forfatter Del Skrevet 7. oktober 2004 wow! Tusen hjertelig zyp! Dette var mer enn jeg forventet 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 Er ustø på en del basics enda i c++ Lenke til kommentar
zyp Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 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
slakkis Skrevet 7. oktober 2004 Forfatter Del Skrevet 7. oktober 2004 Aha, var ikke verre nei. takk for utrolig kjapt svar! Lenke til kommentar
sumptrollet Skrevet 7. oktober 2004 Del Skrevet 7. oktober 2004 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
zyp Skrevet 8. oktober 2004 Del Skrevet 8. oktober 2004 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
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å