md5 hashen



  • Du hast keinen Speicher für str reserviert...
    Entweder

    char str[100]; // für 100 Zeichen
    

    oder

    char str* = malloc(100); // für 100 Zeichen
    ...
    free(str); // am Ende den mit malloc angefordertern Speicher freigeben
    


  • Solstice schrieb:

    Ich hab grad mal die nötigsten grundkenntnisse.

    "Mach" am besten ein oder zwei Tutorials und kleine Sachen, bevor du an sowas rangehst. Ansonsten wirst du mehr Frust als Lust haben.
    Strings, Speicher, Zeiger etc. sollten dir ein Begriff sein.



  • gut ok... soweit...
    Mit speicherverwaltung kenn ich mich leider noch ned aus...

    Soweit funzt es jetzt, aber die funktion... wie ruf ich die jetzt auf...
    ich hab bereits:

    MDString(str);
    

    und

    str = MDString(str);
    

    und auch mit dem Zweiten Parameter experimentiert.
    irgendwie scheind die funktion anders zu funktionieren wie ich sonst so kenne.

    hab ich das gefühl...

    im momantanen:

    main(){
    	char str[100];
    scanf("%s",&str);
    MDString(str);
    printf ("%s",str);
    }
    

    liefert er mir nur das zurück was ich eingegeben habe....

    Ich hoff ich hab euch dann genug gelöchert...

    Edit:
    Sie sind mir grob ein begriff.
    ich hatte vorher noch nie mit der deklaration von nem string *string gearbeitet.
    Zeiger ham wir erst kürzlich gehabt.

    aber halt net so tiefgreifend wie ihr ^^
    Speicherverwaltung kommt noch...

    mfg,
    Sol



  • ihoernchen schrieb:

    Solstice schrieb:

    Ich hab grad mal die nötigsten grundkenntnisse.

    "Mach" am besten ein oder zwei Tutorials und kleine Sachen, bevor du an sowas rangehst. Ansonsten wirst du mehr Frust als Lust haben.
    Strings, Speicher, Zeiger etc. sollten dir ein Begriff sein.

    FullAck! Denn seine Selbsteinschätzung würde ich vorsichtig mal als "dezent übertrieben" einstufen 🤡



  • Solstice schrieb:

    main(){
      char str[100];
      scanf("%s",&str);
      MDString(str);
      printf ("%s",str);
    }
    

    liefert er mir nur das zurück was ich eingegeben habe....

    Ja, denn genau das hast Du codiert. Der Hash steckt in der Varaiblen 'digest' von MDString()!

    main(){
      char str[100];
      char digest[16];
      scanf("%s",&str);
      MDString2(&str, &digest);
      printf ("%.16s",&digest);
    }
    

    Kann sein, dass da ein paar '&' zuviel drin sind, meine Pure-C Zeiten liegen mittlerweile schon Jahre zurück...



  • Wie du meinst ^^
    Es is halt so, dass ich es halt nebenher in der schule lern und ich mich so interressier.
    Jetzt wollt ich halt mal was größeres machen, als nur durchschnittsrechner oder spielereien, sondern was, was ich auch gebrauchen kann.

    Nebenbei mach ich noch php, da bin ich besser drin, aber das is mit C irgendwann nicht mehr zu vergleichen.
    Am anfang isses ja noch relativ gleich, aber auf der komplexen ebene von C Häng ich dann...

    Im Prinzip ist das was ich machen will, ein php-script in ein c-programm umschreiben.

    in php ist die md5 halt schon von vornherein da, daher is das kein Thema.
    Die PHP is bei mir schon fertig und funzt.

    Für das C Programm fehlt mir nur noch der md5 Umwandler.
    Dann fertig.

    mfg,
    Sol

    Edit.:
    Wieder zu langsam...
    Gut.. die adressen haste schon richtig eingegeben.
    Ich hab mal wieder vergessen was wir erst letzte woche gehabt haben... mit den Speicherplätzen, dass man da die adressen nehmen soll "&string".

    So ich hoff die restlichen Probleme kann ich selber beheben.. will euch ja nicht alles machen lassen. Vielen dank für die Hilfe.

    mfg,
    Sol



  • Na, dann viel Erfolg!!



  • Doch noch ein problem... sry...

    Ich müsste nun einen eingegebenen Hash Wert mit dem erstellten Hash Wert vergleichen. Da digest aber 16 stellen hat, und mein anderer string 32 Stellen (im Array belegt) hab ich mir Folgendes einfallen lassen:

    main(){
      char str[100];
      char test[16];
        char test2[16];
      scanf("%s",&str);
      MDString2(&str, &digest);
    
      for (i = 0; i < 16; i++)
      {
     printf ("%.02x", digest[i]);
      }
     printf ("\n\n");
    
      for (i = 0; i < 32; i++)
      {
    test[i] = getchar();
      }
    
    // ein Arrayelement mit 2 Zusammengehörigen HEX belegen
      for (i = 0; i < 32; i++)
    	  if (1%2==1)
    	  {
    	int var = (i+1)/2;
    	test2[var] = test[i-1].test[i];
    	  }
    
      for (i = 0; i < 16; i++)
    	  printf("%x",test2[i]);
    
    printf ("\n\n");
    
    getchar();  //Verzögerung
    getchar();
    
      return 0;
    }
    

    Allerdings funktioniert das nicht so wie ich mir das so wunderbar vorstelle...

    error C2224: Der linke Teil von '.test' muss eine Struktur/Union sein
    

    Mist 🙄

    Weiß einer rat?
    später will ich beide vergleichen, und wenn das geht, kann ich mein und das md5 Programm miteinander verbinden. Die eingabe oben von dem 32 Stellen test ist dem wie es im anderen teil des programms ist, nachempfunden, auch damit ihr wisst, wie die belegungen sind.

    Vll. önnt ihr mir nochmal helfen... ich hab mich echt angestrengt und gegoogels was das zeug hält...

    mfg,
    Sol



  • Nimm sprintf, dann hast Du das direkt wie Du es brauchst in dem bei sprintf angegebenen Buffer liegen.

    ---
    If you are forced to reinvent the wheel at least try to invent a better one!



  • Ok... sprintf kenn ich noch überhaupt nicht...
    könntest du mir das freundlicherweise näher erklären?

    danke.

    mfg,
    Sol

    Hmm...
    Also ich habs schon soweit, dass es mir beides identisch ausgibt, aber er hat es nicht identisch in den arrays drinstehn.
    Ich fummel da immer noch...
    gibts nicht sowas wie ne implode oder explode funktion wie bei PHP?
    das würd mir n schritt weiterhelfen.

    mfg,
    Sol



  • So... im moment habe ich:

    Ausgabe von digest per %x ist der Ausgabe von dem Eingabestring mit %c gleich.

    ich müsste das aber ja so haben, dass beide dieselbe Ausgabe mit %c oder %x haben,

    So ist es im Moment:

    Array 1(Hexadezimal Formatiert):

    a[0] = 8f;
    a[1] = a1;
    a[2] = 4c;
    a[3] = dd;
    a[4] = 75;
    a[5] = 4f;
    a[6] = 91;
    a[7] = cc;
    a[8] = 65;
    a[9] = 54;
    a[10] = c9;
    a[11] = e7;
    a[12] = 19;
    a[13] = 29;
    a[14] = ce;
    a[15] = e7;
    

    Array 2(Zeichenformatiert (ASCII)):

    a[0] = 8; a[1] = f;
    a[2] = a; a[3] = 1;
    a[4] = 4; a[5] = c;
    a[6] = d; a[7] = d;
    a[8] = 7; a[9] = 5;
    a[10] = 4; a[11] = f;
    a[12] = 9; a[13] = 1;
    a[14] = c; a[15] = c;
    a[16] = 6; a[17] = 5;
    a[18] = 5; a[19] = 4;
    a[20] = c; a[21] = 9;
    a[22] = e; a[23] = 7;
    a[24] = 1; a[25] = 9;
    a[26] = 2; a[27] = 9;
    a[28] = c; a[29] = e;
    a[30] = e; a[31] = 7;
    

    Vll seht ihr schon das Problem.
    Sie haben Zwar in allem den Gleichen inhalt, aber im prinzip doch nicht, weil Array 2 ist ja in ASCII und hat 32 Einzelzeichen und Array 1 hat 15 Einzelzeichen, die in HEX formatiert sind...
    wie jetzt also diese Vergleichen?



  • Lösung doch gefunden:

    for (i = 0; i < 16; i++)
      {
    
        sprintf(hex, "%x", digest[i]);
    
        for (j = 0; j <2 ; j++)
    	{
    		var = i*2+j+1;
    	printf ("%c//%c\n",hex[j],test[var]);
    	if (hex[j] != test[var])
    	ishash = 'n';
    	}
      }
    if (ishash == n)
    printf("F*CK!!");
    else
    printf("YEEHAAA");
    

    Also einfach wars net 🙄

    Nochmal Thx für die Hilfe...

    mfg,
    Sol


Anmelden zum Antworten