2017-12-02 5 views
-1

verweisen auf http://php.net/manual/en/function.sha1.phpWie mache ich SHA1 in c, die rohe Ausgabe zurückgibt?

Wenn die optionale raw_output auf TRUE gesetzt ist, dann wird die SHA1-Extrakt statt in Raw-Binary-Format mit einer Länge von 20, andernfalls wird der Rückgabewert zurückgegeben wird, ist ein 40-stellige Hexadezimalzahl.

Mein aktueller Code ist

char *concat = "somestring"; 
int i = 0; 
unsigned char hash[SHA_DIGEST_LENGTH]; 
char buf[SHA_DIGEST_LENGTH*2]; 

memset(buf, 0x0, SHA_DIGEST_LENGTH*2); 
memset(hash, 0x0, SHA_DIGEST_LENGTH); 

SHA1((unsigned char *)concat, strlen(concat), hash); 

for (i=0; i < SHA_DIGEST_LENGTH; i++) { 
    sprintf((char*)&(buf[i*2]), "%02x", hash[i]); 
} 

printf("<<sha1=%s>>\n", buf); 

Es funktioniert gut, aber String in Hex zurück.

Was ist der beste Ansatz, um das zu erreichen?

Danke.

+0

Bitte zeigen/beschreiben Sie die gewünschte Ausgabe/Ergebnis. Ein Array von 20 Bytes mit dem Wert? Drucken, das nicht möglich ist (zumindest wird es keine vernünftige Möglichkeit geben, druckbare Zeichen zu sein). – Yunnosch

+0

Ich frage mich, was die PHP-Dokumentation damit zu tun hat. Lesen Sie in jedem Fall Ihren Code. Sie haben einen Teil, der den Hash in Hex konvertiert. Benutze diesen Code nicht. –

+0

@Yunnosch Ich weiß nicht, wie es aussehen soll. – stakantin

Antwort

0

Was Sie bereits erhalten den Hash in roher Form (unter der Annahme, dass SHA1 funktioniert), wenn Sie schreiben möchten, dass dies nur tun (mit fwrite oder dergleichen), aber es ist nicht lesbar wie die Hex-Form ist.

+0

Ich brauche es nicht für Menschen lesbar, es wird in einer anderen Operation (base64) verwendet werden. – stakantin

1

Die Lösung war sehr einfach und offensichtlich. Ich musste nur das Format ändern:

von

sprintf((char*)&(buf[i*2]), "%02x", hash[i]); 

zu

sprintf((char*)&(buf[i*2]), "%c", hash[i]); 

Vielen Dank an alle, mich zu zeigen auf der richtigen Stelle!

Verwandte Themen