Welche Operation???

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Welche Operation???

    Hallo!

    Ich bin gerade dabei den MD5 code in PHP zu schreiben um ihm bei einer Präsentation ihn vorstellen zu können. Als grundlage benutze ich den Pseudocode von Wikipedia.

    http://de.wikipedia.org/wiki/Md5

    Nun bin ich bei folgender Stelle angekommen:

    temp := d
    d := c
    c := b
    b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b
    a := temp


    aber was muss ich bei der vorletzen Zeile machen??? welches Rechenzeichen steht zwischen der ) und dem leftrotate??? Wie kann ich das leftrotate verstehen???

    MFG STAN
    !MÖGE DIE MACHT MIT EUCH SEIN!

  • #2
    leftrotate bedeutet du schiebst das höchstwertige Bit zur niedrigsten Stelle und alle restlichen Bits um eine Stelle nach links rücken, e.g.

    orig.: 1100111000101100
    => 1001110001011001

    aber warum das Rad neuerfinden? es gibt genügend Code im Internet.

    Kommentar


    • #3
      Danke für die Hilfe, jetzt habe ich es gerallt!

      das ist wahr, aber die Bonuspunkte gibt es nur für selbstgeschriebenen Code...

      MFG STAN

      PS: Was steht denn nun da für ein "Rechenzeichen"?
      !MÖGE DIE MACHT MIT EUCH SEIN!

      Kommentar


      • #4
        Original geschrieben von Stan Sanctus
        Was steht denn nun da für ein "Rechenzeichen"?
        Code:
        f(x) = x² + 3x + 4
        Was steht denn da jetzt zwischen der 3 und dem x bloss für ein "Rechenzeichen" ...?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          In Mathe mag das sicher richtig sein, gild das auch für programmcode???
          !MÖGE DIE MACHT MIT EUCH SEIN!

          Kommentar


          • #6
            Ausgehend von der Referenzimplementation im RFC ...
            Code:
            /* F, G, H and I are basic MD5 functions. 
            Siehe [url]http://de.wikipedia.org/wiki/Md5#Algorithmus[/url] */
            #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
            
            /* ROTATE_LEFT rotates x left n bits. */
            #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
            
            /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
            Rotation is separate from addition to prevent recomputation. */
            #define FF(a, b, c, d, x, s, ac) {
             (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac);
             (a) = ROTATE_LEFT ((a), (s));
             (a) += (b);
            }
            /* Einsetzen vorheriger Definitionen in FF ergibt: */
            #define FF(a, b, c, d, x, s, ac) {
             (a) += (((b) & (c)) | ((~b) & (d))) + (x) + (UINT4)(ac);
             (a) = (((a) << (s)) | ((a) >> (32-(s))));
             (a) += (b);
            }
            /* Etwas lesefreundlicher: */
            #define FF(a, b, c, d, x, s, ac) {
             a = a + (b & c | ~b & d) + x + ac;  // Zeile 1
             a = a << s | a >> (32-s);           // Zeile 2
             a = a + b;                          // Zeile 3
            }
            /* Jetzt könnte man Zeile 1 und 2 vereinen, aber dann hat man 
            oben erwähnte 'recomputation' - man berechnet Zeile 1 doppelt,
            nämlich für jedes Vorkommen von a in Zeile 2 ein Mal: */
            #define FF(a, b, c, d, x, s, ac) {
             a = (a+(b&c|~b&d)+x+ac) << s | (a+(b&c|~b&d)+x+ac) >> (32-s);
             a = a + b;
            }
            /* Zuletzt kann man noch Zeile 3 hochziehen: */
            #define FF(a, b, c, d, x, s, ac) {
             a = ((a+(b&c|~b&d)+x+ac) << s | (a+(b&c|~b&d)+x+ac) >> (32-s)) + b;
            }
            Nun kann man FF(...) überall durch den langen Ausdruck hinterm = ersetzen.
            Da in der Referenzimplementation aber ein ganz anderer, performanterer Ansatz gewählt wurde, als für den Pseudocode bei Wikipedia, wird es mir an dieser Stelle doch zu aufwändig.
            Außerdem willst du dir die Zusatzpunkte sicher selbst verdienen.

            Falls du mit C nicht so viel anfangen kannst, wirf mal einen Blick auf http://www.tecknik.net/md5/md5.phps

            Kommentar


            • #7
              Original geschrieben von Stan Sanctus
              In Mathe mag das sicher richtig sein, gild das auch für programmcode???
              Welchen Programmcode?

              Du sagtest doch selbst, dass es Pseudocode sei.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar

              Lädt...
              X