2016-04-01 12 views
0

Ich versuche ein C-Programm zu erstellen, um eine unbekannte Zeichenfolge zu finden, die einer gegebenen SHA256-Summe entspricht. Das endgültige Programm sollte Zeichenfolgen des Formats "### ENCRYPTION" generieren, dann die SHA-Summe finden und mit dem bekannten Wert vergleichen. Allerdings habe ich Probleme, einfach die SHA-Summe zu generieren. Aus irgendeinem Grund, meine Methode, um die Summe der Druck fällt ab 1 Zeichen:Drucken SHA256 Summe

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6**0**c493bafd38baff5 

Aber mein Code generiert:

000ENCRYPTION=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb6c493bafd38baff5 

This link scheint ein ähnliches Problem zu beschreiben, scheint aber nicht ganz passt meine Problem.

Ich habe bereits ein Programm in Python gebaut, um das gleiche zu tun, aber jetzt möchte ich eine in C bauen, um Laufzeiten zu vergleichen. (Ich benutzte auch die CommonCrypto-Bibliothek von OS X, aber OpenSSL würde auch funktionieren.)

Jede Hilfe würde sehr geschätzt werden!

#include <stdio.h> 
#include <CommonCrypto/CommonDigest.h> 
#include <string.h> 

int main() { 
int c=0; 
char *input_sum="9dcaea0ae17e31d47640cb7c390976d8962823a55ea03fe43b0d061f5624069f"; // currently unused 
char *end="ENCRYPTION"; 
char temp[100]; // need to learn more about allocating memory 
unsigned char output[32]; // initializes output variable 

printf("Sum=f6bc212596f37e1855fb2bbfaf49b514c5ea79e332c57bb60c493bafd38baff5\n"); // Sum of 000ENCRYPTION from command line 

while(c < 5) { // limited to 5 right now for testing 
    sprintf(temp, "%03d", c); // creates leading zeros 
    sprintf(temp + 3, "%s", end); // appends string "end"; should ideally be moved outside loop 
    c++; 
    puts(temp); // visual check of input into cc_sha256 

    CC_SHA256(temp, (CC_LONG)strlen(temp), output); // function does sha256sum 

    int i; // for loop prints resulting byte array from cc_sha256 to hex; I believe the problem is here 
    for (i = 0; i < 32; i++) { 
     printf("%x", output[i]); 
    } 
    printf("\n"); 

} 
return 0; 
} 
+0

Es kompiliert in beide Richtungen. Ich versuche beide, die Sichtbarkeit zu erhöhen – MEcoder

+0

Sie erkennen, dass das Finden einer gegebenen Zeichenfolge, die Hashes zu einem bestimmten SHA256 Hash hat, wahrscheinlich durchschnittlich 2^256 Versuche erfordern wird, nehme ich an? Zwei verschiedene Strings zu finden, die auf denselben Wert hashen, wäre etwas einfacher, aber im Durchschnitt werden 2^255 Versuche benötigt ... Selbst wenn Sie 1.000.000.000 pro Sekunde ausprobieren können, wird dies in der Größenordnung von 1.8 * 10^60 erforderlich sein Jahre bis zum Abschluss ... – twalberg

+0

In diesem Fall ist das Format der Hash-Zeichenfolge bekannt (### ENCRYPTION), so dass maximal 1000 Versuche benötigt werden. – MEcoder

Antwort

0

Wo die Ausgabe 0c sein soll, gibt den Code nur den c Teil. Dies liegt daran, dass printf standardmäßig das Ergebnis mit der minimal möglichen Anzahl an Zeichen ausgibt. In diesem Fall sollten Sie printf sagen, dass das richtige Ergebnis zwei hexadezimale Ziffern enthält immer durch eine Breite zu geben, und durch die Angabe, dass eine Null soll in der höchstwertigen Nibble gebracht werden, wenn der Eingang kleiner ist als 0x10:

printf("%02x", output[i]); 
+0

Versuchte das. Jetzt gibt es nur noch ein Leerzeichen aus, wo eine Null sein soll – MEcoder

+0

printf ("% 02x", Ausgabe [i]); scheint zu funktionieren. Vielen Dank! – MEcoder

+0

@ user6023571 - Sorry für den Fehler, habe ich meine Antwort bearbeitet. – owacoder