2016-05-12 17 views
1

Ich versuche, zu vergleichen und Spiel Hashes:Vergleichen Hashes in c

#include <stdio.h> 
#include <string.h> 
#include "sha256.h" 

int main() 
{ 
    unsigned char password[]={"abc"}, gen_hash[32]; 
    SHA256_CTX ctx; 

    sha256_init(&ctx); 
    sha256_update(&ctx,password,strlen(password)); 
    sha256_final(&ctx,gen_hash); 

    unsigned char orig_hash[] = {"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"}; 

    if(strcmp(orig_hash, gen_hash) == 0) 
    { 
    printf("%s\n", "match"); 
    } 
    return 0; 
} 

Aber wenn ich beide Hashes zu vergleichen, sie sind nicht das gleiche. Weiß jemand zufällig warum? Ich dachte beide Variablen sind gleich, aber sind sie nicht?

+1

empfehlen die C++ Tag fallen, Err, ... nie – user4581301

+1

dagegen Ich würde sagen, die 'orig_hash' ist viel länger als 32 Zeichen ... –

+1

Sind Sie absolut sicher, dass 'gen_hash' eine Null-terminierte Zeichenkette ist und somit mit' strcmp' verwendbar ist – user4581301

Antwort

5

Zwei Punkte:

  1. Sie strcmp nicht verwenden, sondern memcmp, da die erzeugten Hash-gen_hash nicht am Ende '\ 0' hat.

  2. Sie definiert orig_hash als

    unsigned char orig_hash[] = {"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"};

, die eine Folge von Zeichen ist. Sie sollten es als eine Reihe von Zahlen definieren:

unsigned char orig_hash[] = {0xba, 0x78, 0x16, 0xbf, ...}; 
+0

ist es möglich, die "orig_hash" in diese Zahlen zu werfen? – Sam

+0

Besetzung, nein. das würde zu einem viel größeren Array führen. Jede hexadezimale Ziffer hat 4 Bits, und wenn sie als ein Zeichen dargestellt wird, ist die Ziffer höchstwahrscheinlich 8 Bits. Du musst das auf die harte Tour machen. – user4581301

+0

@Sam Nein. Sie müssen es mit den Werten initialisieren, genau wie mit der Zeichenkette ... Fügen Sie einfach '0x' zu jedem Paar hexadezimaler Zahlen hinzu. –