SHA1 Hash: Datentyp-Problem

philippo

Mitglied
Hallo,

ich habe die sha1.c von http://www.packetizer.com/security/sha1/ in mein Projekt eingebunden und eine Function erstellt, die mir aus einer Datei, eine Checksumme erstellen soll. Das klappt auch super, nur will ich die Checksumme gleich prüfen und hier stosse ich auf ein Datentyp-Problem - und an die Grenzen meines C++ Wissens.

Hier mal die Function:
Code:
bool checkEAChecksum() {
	SHA1        sha;                        // SHA-1 class
    FILE        *fp;                        // File pointer for reading files
    char        c;                          // Character read from file
    unsigned    message_digest[5];          // Message digest from "sha"

	if (!(fp = fopen("X:\\DateiDieGeprueftWerdenSoll.txt","rb")))
        {
            AfxMessageBox(_T("Fehler! DateiDieGeprueftWerdenSoll.txt wurde nicht gefunden!"), MB_OK | MB_ICONERROR );
            return (false);
        }

    /*
        *  Reset the SHA1 object and process input
        */
    sha.Reset();

    c = fgetc(fp);
    while(!feof(fp))
    {
        sha.Input(c);
        c = fgetc(fp);
    }

    
    if (!sha.Result(message_digest))
    {
        AfxMessageBox(_T("sha: could not compute sha1 checksum"), MB_OK | MB_ICONERROR );
    }
    else
    {
        FILE *stream ;
		if((stream = freopen("d:\\file.txt", "w", stdout)) == NULL) exit(-1);

		printf( "%08x%08x%08x%08x%08x",
                message_digest[0],
                message_digest[1],
                message_digest[2],
                message_digest[3],
                message_digest[4]);
		printf("\n");

    }

	return(false);
}

Ich würde jetzt gerne den Output, was ich mit printf erzeuge (mit der gleichen Formatierung!), in einen CString packen, damit ich ihn vergleichen kann. Wie kriege ich das hin?

Ich wäre dankbar für jegliche Tips!
 
Hi.

Erstmal ist deine Schleife zum Einlesen "ungünstig", da sie endlos laufen wird wenn ein Fehler auftritt (ferror(fp) == true ist).
C++:
int c;
while ((c = fgetc(fp)) != EOF) {
  sha.Input(c);
}
if (ferror(fp)) /* ERROR: Datei nicht vollständig gelesen */
Allerdings ist es nicht gerade effizient Zeichen einzeln einzulesen, man liest normalerweise gleich einen ganzen Block in einen Puffer (mit fread).

Einen CString kannst du ebenso formatieren wie mit printf auch. Btw, warum verwendest du denn freopen und nicht einfach fprintf(stdout, "..", ...)?
C++:
CString str;
str.Format("%08x%08x%08x%08x%08x", message_digest[0],
                message_digest[1],
                message_digest[2],
                message_digest[3],
                message_digest[4]);
Gruß
 
Zurück