[C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Jetzt scheitert's eigentlich nur noch am Vergleich. Obwohl das PW gefunden werden müsste, findet die Ausgabe nicht statt ... :huh:

(Beispielhafte) Usereingabe in die Kommandozeile: ./code -l 5 -c ahlo d3751d33f9cd5049c4af2b462735457e4d3baf130bcbb87f389e349fbaeb20b9 (Klartext zum Hash wäre hier "hallo")

@ bingo88
Danke, hab's schon gemerkt. ;)
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Oh, du machst da was ganz böses. Deine sha256 gibt einen Zeiger auf eine lokale Variable zurück. Wenn die Funktion verlassen wird, wird diese Variable ungültig und du hast einen dangling pointer. Der strcmp Aufruf dereferenziert dann diesen Pointer, aber da kann schon wieder was ganz anderes drinnen stehen (weswegen dann eventuell auch der Vergleich fehlschlägt).

Entweder du machst die Variable static, dann bleibt sie erhalten, oder du erzeugst ein dyn. Array (was du dann später aber wieder löschen musst). Die static-Variante hat den Nachteil, dass die Variable beim nächsten Funktionsaufruf überschrieben wird (gleicher Zeiger -> anderer String). Das kann zu extrem unschönen Bugs führen.

Edit: Abgesehen davon hast du eine globale Variable "hash" und eine lokale mit demselben Namen. Oft wird bei globalen ein "g_" vorangestellt, um Namenskollisionen zu vermeiden.
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

wieso wusste ich nur, dass du die nsa hacken willst! :P
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Hui, hab's jetzt so probiert:
Code:
unsigned char hash = malloc(SHA256_DIGEST_LENGTH * sizeof(char));
Aber da kriege ich unschöne Rückmeldungen ...
error: subscripted value is neither array nor pointer
wieso wusste ich nur, dass du die nsa hacken willst! :P
Na ja, sooo viele Anwendungszwecke für Permutationen gibt's dann auch nicht. War wohl schnell klar, wofür ich's brauchen würde?! ;)

[Edit]
*faceplam*

Sternchen vergessen: unsigned char* ...

Trotzdem kriege ich immer noch keine Ausgabe von wegen PW gefunden.
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Hui, hab's jetzt so probiert:
Code:
unsigned char hash = malloc(SHA256_DIGEST_LENGTH * sizeof(char));
Aber da kriege ich unschöne Rückmeldungen ...
error: subscripted value is neither array nor pointer
unsigned char *hash ;-)

Hast du meinen letzen Edit auch gesehen?
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Auf's fehlende Sternchen bin ich schon selber drauf gekommen und die globale Variable heißt jetzt g_hash, danke. Trotzdem kriege ich immer noch nicht "PW gefunden! PW = hallo" ausgegeben ...

Außerdem kriege ich (schon die ganze Zeit) "warning: pointer targets in return differ in signedness", was auch immer das heißen soll. So ein warning habe ich überhaupt noch nie gesehen.
Irgendwas mit signed und unsigned passt nicht zusammen.
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Außerdem kriege ich (schon die ganze Zeit) "warning: pointer targets in return differ in signedness", was auch immer das heißen soll. So ein warning habe ich überhaupt noch nie gesehen.
Irgendwas mit signed und unsigned passt nicht zusammen.
return value: (signed) char
hash: unsigned char

Entweder hash oder den return value anpassen.

Edit: Notfalls nen cast von unsigned char auf char *hust*
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Die sha256 Funktion unsigned zu machen bringt auch nichts. Genau so wenig, wie das unsigned vor char* hash zu löschen. Ich weiß auch nicht, wo ich das free(hash) hintun soll. Nach dem return kann ich es schlecht einfügen, aber in der main geht's auch nicht, weil unser hash Array ja lokal in sha256() ist ...

Und das eigentliche Problem bleibt, dass nach wie vor Übereinstimmungen der Hashes nicht erkannt werden?!
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Die sha256 Funktion unsigned zu machen bringt auch nichts. Genau so wenig, wie das unsigned vor char* hash zu löschen. Ich weiß auch nicht, wo ich das free(hash) hintun soll. Nach dem return kann ich es schlecht einfügen, aber in der main geht's auch nicht, weil unser hash Array ja lokal in sha256() ist ...
Ich habe jetzt einfach mal den return Wert gecastet, nur damit die Warnung verschwindet:
Code:
return (char*)hash;

An dem anderen arbeite ich gerade ^^
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

und wenn ihr den hash mittels call-by-reference der sha256 funke übergebt? dann habt ihr in der main direkt den zeiger auf den hash bla blubb. wisst scho, wie ichs mein ^^ dann könnt ihr den auch aus der main heraus freigeben *denk*
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

So, ich habe das jetzt mal grob überarbeitet. Ich habe nicht auf alles geachtet, hier sind ein paar Punkte:

  • Jedes malloc braucht irgendwann ein free
  • malloc mit size = 0 ist uncool (bei dir mit inputLen = 0 geschehen)
  • Dyn. Arrays mit der richtigen Größe anlegen. Wenn in deinen Command Line Args die Größenangaben drinnen stehen, kannst du das Array erst anlegen, nachdem du diese Größe hast.
  • Off-by-one Fehler: Wenn der SHA256 als String 64 Zeichen lang ist, brauchst du 65 Zeichen Speicher (wegen dem Nullzeichen am Ende - kann man zwar weglassen, da verlassen sich aber einie Funktionen drauf, dass das da ist - strcmp zum Beispiel)
  • Generell: Fehlerbehandlung, z. B. return values von malloc != NULL. Habe jetzt auch nicht alles eingebaut (ohne Cmd line args gibt es übrigens ein SIGSEGV), ich wollte ja "nur" den Bug fixen...
  • sha256: Das SHA256_Final liefert dir den binären Hash, daher auch das unsigned char. Du musst das erst wieder in einen Hex-String umwandeln, damit das mit strcmp später klappt.
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Okay, unklar ist mir dabei folgendes:

In sha256():
- Die for-Schleife brauche ich nicht mehr und will ich weg haben. Aber dann funktioniert das ganze nicht mehr (wenn ich auch hash lösche, das ja eh nur darin vorkommt, und bei return rawHash angebe)?! Wieso ist die so wichtig?
- Was könnte ich aus sha256() alles rausschmeißen, damit die Funktion wirklich nur noch den Hash berechnet und zurückgibt? i und alles mit *hash, oder?

Meine for-Schleife in der main() soll prüfen, ob nach der Auswertung der Kommandozeile durch getopt() noch irgendwas übrig ist. In unserem Fall der eingegebene Hash. Dieser wird dann einfach in die globale Variable g_hash gespeichert. Und das funktioniert ja auch. :)
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

- Die for-Schleife brauche ich nicht mehr und will ich weg haben. Aber dann funktioniert das ganze nicht mehr (wenn ich auch hash lösche, das ja eh nur darin vorkommt, und bei return rawHash angebe)?! Wieso ist die so wichtig?
Jo klar, die wandelt dir ja auch den binären Hashwert ("Rohwerte") in eine Hex-Repräsentation (Hex-String) um. Wenn du die weglässt, kannst du natürlich nicht mehr mit strcmp vergleichen, da dein Eingabe-Hash ja ein Hex-String und kein binärer Hash ist. Äpfel mit Birnen vergleichen und so ;-)

Was könnte ich aus sha256() alles rausschmeißen, damit die Funktion wirklich nur noch den Hash berechnet und zurückgibt? i und alles mit *hash, oder?
Kurz: nichts. Lang: siehe unten

Code:
char* sha256(char *string) {
         int i = 0; // Schleife
         SHA256_CTX sha256; // SHA256
         unsigned char rawHash[SHA256_DIGEST_LENGTH]; // SHA265 - Rohe Hashwerte
         char *hash = NULL; // SHA256 - Hash als Hex-String 

         // Alles SHA256
         SHA256_Init(&sha256);
         SHA256_Update(&sha256, string, strlen(string));
         SHA256_Final(rawHash, &sha256); 

         // Speicher für Hex-String (Zruückgeben eines Zeigers auf eine lokale Variable hatten wir ja schon)
         hash = malloc(65 * sizeof(char)); 

         // Konvertiert binären Hash in Hex-String (gleiches Format wie Vergleichsstring)
         for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
                 sprintf(hash + (2 * i), "%02x", rawHash[i]);
         }         

         // Nullzeichen setzen
         hash[64] = '\0'; 

         // Der char* cast kann hier weg, den hatte ich noch übersehen...
         return hash;
 }
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

^^ Ich habe gerade rausgefunden, woher mein Denkfehler kam: Ich dachte, sprintf würde, genau wir printf, was ausgeben. Tut's aber nicht. Stattdessen werden Daten nur in einem Buffer gespeichert. Jetzt ist auch klar, warum ich die Schleife brauche und das nicht rausschmeißen kann.

Ich überleg mir dann mal den MPI Teil ...
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Jupp, das klingt nachvollziehbar ;-)
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Durch mpi habe ich es zwar geschafft, dass alle Nodes arbeiten, aber leider machen die bei mir alle das selbe, anstatt die Berechnungen sinnvoll untereinander zu verteilen ...

Davon abgesehen, habe ich noch folgendes erfahren/rausgefunden:
- Statt dem SH256 Init/Update/Final gäb's anscheinend auch eine einzige für uns notwendige SHA256() Funktion?! Allerdings finde ich dazu absolut nichts auf google, und was ich auch eingebe, ich habe entweder zu viele, zu wenige, oder ungültige Parameter.
- Das, was wir dann in der for-Schleife in sha256() machen, ist angeblich höchst ineffizient (Hex Strings Vergleichen). Stattdessen sollten wir das besser in Byte Strings umwandeln und die dann bspw. mit XOR vergleichen. Hierzu finde ich zwar das, aber die scheinen sich nicht einig zu sein, wer denn nun eine brauchbare Lösung gefunden hat?!

^^ Die beiden Punkte sind jetzt nicht sooo tragisch. Der Code mag ineffizient sein, aber er macht zumindest schon mal das richtige. Mir wäre sehr geholfen, wenn mir bitte wer bei der Verteilung auf 3 Nodes mit mpi helfen könnte.

[Edit]
Man könnte vielleicht über diese Formel die Anzahl aller möglichen Zeichen-Kombinationen aus dem Charset berechnen, und die dann durch die Anzahl der Nodes dividieren. Anschließend jede Node 1/3 berechnen lassen?!

Ich habe jetzt eine Fakultäts-Funktion eingebaut und unten in der main() herumgewerkt, aber v. a. das if-else Konstrukt macht natürlich noch nicht, was es soll. Da müssten jetzt noch die jeweiligen Drittel rein. Außerdem würden sich die Nodes derzeit alles gegenseitig überschreiben, wenn die mit den selben Arrays arbeiten?!

Anhang anzeigen code.zip
 
Zuletzt bearbeitet:
Zurück