Seltsames Problem mit sha-1

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Seltsames Problem mit sha-1

Beitrag von 3VAD_YNCAL » Mo Sep 10, 2012 1:42 am

Hallo zusammen,

ich habe mal testweise ein Programm geschrieben, dass praktisch eine Zeichenkette und gleichzeitig den zugehörigen SHA1-Hashwert ausgeben soll. Klappt auch alles soweit ganz gut, bis auf dieses störende Phänomen, dass bei manchen Zeichenketten der Hash-Wert nur 39 oder sogar nur 38 anstatt 40 Zeichen lang ist. Dies fiel mir auf, als ich auf die Idee kam folgendes auszuprobieren:
Anhand eines zweidimensionalen char-Array's, dass aus 10 x 8 Feldern besteht, d.h. 10 Zeilen mit jeweils 8 Spalten, werden mittels einer for-Schleife beim ersten Durchgang in der ersten Zeile alle 8 Felder (Spalten) mit dem ASCII-Zeichen '0' initialisiert (Variablenwert = 48).

Code: Alles auswählen

int i, j;

for( i = 0; i < 10; i++)
{
    for(j = 0; j < 8; j++ )
    {
        array[i][0] = 48;
        array[i][1] = 48;
        .                 = 48;
        .                 = 48;
        array[i][9] = i + 48;
    }
}
Sinn und Zweck soll sein, dass Zeichenketten (nur aus Ziffern bestehend) in aufsteigender Folge zusammen mit dem zugehörigen SHA1-Hashwert auf dem Bildschirm ausgegeben werden. Also (00000000 -- Hashwert, 00000001 -- Hashwert, 00000002 -- Hashwert...usw...usw...)

Ich habe mir hier fertigen Source-Code bestehend aus folgenden Quellcode-Dateien: sha1.h, sha1.c, sha.c & shatest.c runtergeladen. sha1.h und sha1.c habe ich dann in meinem Programm implementiert.

Woran könnte das liegen, dass solche Fehler beim hashen entstehen? Hat jemand von euch schon ähnliche Probleme bzw. sogar dasselbe Problem gehabt? Wie könnte man das lösen?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Seltsames Problem mit sha-1

Beitrag von cloidnerux » Mo Sep 10, 2012 6:15 am

In welcher Form kommt dein Hash? Als Zahl oder als Text?
Redundanz macht wiederholen unnötig.
quod erat expectandum

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Seltsames Problem mit sha-1

Beitrag von 3VAD_YNCAL » Mo Sep 10, 2012 10:54 am

Hallo cloidnerux,

das Problem wirkt sich praktisch so aus:

der String "00000000" hat z.B. folgenden Sha1-Hashwert: 70352f41061eda4ff3c322094af068ba70c3b38b.

Doch bei meinem Testprogramm wird folgender Wert ausgegeben: 70352f4161eda4ff3c322094af068ba70c3b38b.

D.h. bei meinem Hash fehlt ein Zeichen. Wenn man beide Hashes vergleicht, fällt auf das bei meinem Hash an neunter Stelle die 0 fehlt. Somit ist der Hash nicht mehr richig und nur 39 anstatt 40 Bytes lang.

Von "00000000" bis "00000010" werden z.B. nur sieben Hashes richtig erzeugt. Bei den restlichen fehlen wie schon im obigen Beispiel immer ein oder sogar zwei Zeichen im Hash.

(siehe Auflistung:)

"00000000" --> falsch bzw. unvollständiger Hash
"00000001" --> falsch bzw. ....
"00000002" --> richtig
"00000003" --> richtig
"00000004" --> falsch bzw. ....
"00000005" --> richtig
"00000006" --> richtig
"00000007" --> richtig
"00000008" --> richtig
"00000009" --> falsch bzw. ....
"00000010" --> richtig

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Seltsames Problem mit sha-1

Beitrag von Xin » Mo Sep 10, 2012 11:11 am

3VAD_YNCAL hat geschrieben:Ich habe mir hier fertigen Source-Code bestehend aus folgenden Quellcode-Dateien: sha1.h, sha1.c, sha.c & shatest.c runtergeladen. sha1.h und sha1.c habe ich dann in meinem Programm implementiert.
Nur zum Verständnis... Du hast diese Implementation unverändert übernommen?
3VAD_YNCAL hat geschrieben:der String "00000000" hat z.B. folgenden Sha1-Hashwert: 70352f41061eda4ff3c322094af068ba70c3b38b.

Doch bei meinem Testprogramm wird folgender Wert ausgegeben: 70352f4161eda4ff3c322094af068ba70c3b38b.

D.h. bei meinem Hash fehlt ein Zeichen. Wenn man beide Hashes vergleicht, fällt auf das bei meinem Hash an neunter Stelle die 0 fehlt.
9. Stelle... es fehlt eine 0. Null ist verdächtig... Welche Ziffern fehlen bei den anderen Hashwerten?

Kannst Du die Datenstruktur mal posten, in der Du den Hash liegen hast und mit dem Du ihn da reinkopierst, bzw. wie Du die Ausgabe machst?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Seltsames Problem mit sha-1

Beitrag von 3VAD_YNCAL » Mo Sep 10, 2012 11:37 am

Xin hat geschrieben: Nur zum Verständnis... Du hast diese Implementation unverändert übernommen?
Ja. Habe an den Quelldateien die ich runter geladen habe nichts verändert. Einfach nur in meinem Programm implemetiert.
Xin hat geschrieben:9. Stelle... es fehlt eine 0. Null ist verdächtig... Welche Ziffern fehlen bei den anderen Hashwerten?
Es fehlt immer eine 0 an den Hashes die fehlerhaft sind.
Xin hat geschrieben:Kannst Du die Datenstruktur mal posten, in der Du den Hash liegen hast und mit dem Du ihn da reinkopierst, bzw. wie Du die Ausgabe machst?
Also in meinem Programm geschieht das praktisch in Echtzeit. D.h. unmittelbar nach dem der String z.B. "00000000" erzeugt wurde, wird der string an eine Funktion übergeben, der den Hash erzeugt.

Hier der Quellcode der Funktion:

Code: Alles auswählen

void sha1_hash( unsigned char *string )
{
    SHA1Context  sha;
    unsigned int i;

    SHA1Reset( &sha );
    SHA1Input( &sha, ( const unsigned char * ) string, strlen( string ) );

    if( !SHA1Result( &sha ) )
    {
        fprintf( stderr, "ERROR-- could not compute message digest!!!\n" );
    }

    else
    {
	for( i = 0; i < 5; i++ )
	{
	    printf( "%X", sha.Message_Digest[i] );
	}
    }
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Seltsames Problem mit sha-1

Beitrag von Xin » Mo Sep 10, 2012 12:21 pm

3VAD_YNCAL hat geschrieben:
Xin hat geschrieben:9. Stelle... es fehlt eine 0. Null ist verdächtig... Welche Ziffern fehlen bei den anderen Hashwerten?
Es fehlt immer eine 0 an den Hashes die fehlerhaft sind.
Und es ist immer die 1., 9., 17. oder 25. Stelle...? ^^
3VAD_YNCAL hat geschrieben:

Code: Alles auswählen

	    printf( "%X", sha.Message_Digest[i] );
Schau mal hier: Formatstring

und probier mal

Code: Alles auswählen

	    printf( "%0.8X", sha.Message_Digest[i] );
aus.


PS: Ein schönes Beispiel, wo exakte Informationen Helfen Probleme zu lösen. Es fehlt eine Null und die Stelle. Das mag erstmal unverdächtig klingen, aber jemandem, der die Frage beantworten soll, kann das schon den richtigen Tipp geben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Seltsames Problem mit sha-1

Beitrag von 3VAD_YNCAL » Mo Sep 10, 2012 1:43 pm

Xin hat geschrieben: Und es ist immer die 1., 9., 17. oder 25. Stelle...? ^^
3VAD_YNCAL hat geschrieben:

Code: Alles auswählen

	    printf( "%X", sha.Message_Digest[i] );
Schau mal hier: Formatstring

und probier mal

Code: Alles auswählen

	    printf( "%0.8X", sha.Message_Digest[i] );
aus.
Lieber Xin,

vielen vielen Dank.

Code: Alles auswählen

printf( "%0.8X", sha.Message_Digest[i] );
....did the Job. Es funktioniert jetzt. :D
Nur wenn ich das so kompiliere kommt folgende Warnmeldung:

Code: Alles auswählen

hash.c: In Funktion »hash2write«:
hash.c:83:5: Warnung: »0«-Kennzeichen ignoriert mit Genauigkeit und Format »%X« gnu_printf [-Wformat]
Woran liegt das?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Seltsames Problem mit sha-1

Beitrag von Xin » Mo Sep 10, 2012 1:53 pm

3VAD_YNCAL hat geschrieben:Lieber Xin,

vielen vielen Dank.
You're welcome... dafür ist's Forum ja da.

Die führende Null wurde ignoriert, "%0.8X" sollte aussagen, dass die Ausgabe 8 Zeichen groß sein sollte und falls die Zahl zu kurz ist, mit Nullen aufgefüllt wird....
3VAD_YNCAL hat geschrieben:

Code: Alles auswählen

printf( "%0.8X", sha.Message_Digest[i] );
....did the Job. Es funktioniert jetzt. :D
Nur wenn ich das so kompiliere kommt folgende Warnmeldung:

Code: Alles auswählen

hash.c: In Funktion »hash2write«:
hash.c:83:5: Warnung: »0«-Kennzeichen ignoriert mit Genauigkeit und Format »%X« gnu_printf [-Wformat]
Woran liegt das?
%X gehört aber wohl nicht zum Standard... Idealerweise solltest Du also etwas schreiben, was den String entsprechend formatiert, sonst weiß man nicht, wie es auf anderen Compilern aussieht.

Schreib Dir eine Funktion, die Dir aus dem Integer einen 8 Zeichen langen String zurückliefert.
sprintf() liefert Dir die Länge des Strings zurück. Im Idealfall wurden 8 Zeichen gedruckt. Im schlechtesten Fall nur eins: z.B. "0".
Also nimm einen Buffer und pack da Deine Hex-Darstellung rein:

Code: Alles auswählen

char buffer[] = "00000000xxxxxxxx";

int length = sprintf( &buffer[8], "%x", value );

printf( "%s", &buffer[  length ] );
Ist der mit sprintf() gedruckte String zu kurz, fügen sich die '0'en vorher an.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Seltsames Problem mit sha-1

Beitrag von nufan » Mo Sep 10, 2012 1:58 pm

Versuch mal:

Code: Alles auswählen

printf( "%08X", sha.Message_Digest[i] );
Also ohne den Punkt im String.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Seltsames Problem mit sha-1

Beitrag von 3VAD_YNCAL » Mo Sep 10, 2012 2:25 pm

Xin hat geschrieben: Schreib Dir eine Funktion, die Dir aus dem Integer einen 8 Zeichen langen String zurückliefert.
sprintf() liefert Dir die Länge des Strings zurück. Im Idealfall wurden 8 Zeichen gedruckt. Im schlechtesten Fall nur eins: z.B. "0".
Also nimm einen Buffer und pack da Deine Hex-Darstellung rein:

Code: Alles auswählen

char buffer[] = "00000000xxxxxxxx";

int length = sprintf( &buffer[8], "%x", value );

printf( "%s", &buffer[  length ] );
Ist der mit sprintf() gedruckte String zu kurz, fügen sich die '0'en vorher an.
Okay - cool. Das werde ich auf jeden Fall ausprobieren. :)
dani93 hat geschrieben: Versuch mal:

Code: Alles auswählen

    printf( "%08X", sha.Message_Digest[i] );
Also ohne den Punkt im String.
Jawohl - jetzt meckert auch der Compiler nicht mehr. :D

Ich kann es nicht oft genug schreiben. Dieses Forum ist der absolute Hammer. :P
Nochmals vielen vielen Dank an ALLE. Jetzt passt alles. Ihr seid die Besten.

Liebe Grüße
Dave

Antworten