Mersenne-Twister



  • Hi,

    ich habe großen Schwierigkeiten mit dieser Aufgabe:

    - Schreiben Sie eine Funktion, die auf ein Array von unsigned char mit der Funktion zu übergebender Länge eine Verschlüsselung mittels einer Stromchiffre implementiert.

    - Eine Stromchiffre gewinnt das Chiffrat C = M XOR S aus einer zu verschlüsselnden Nachricht, indem deren Klartext M bitweise der Exklusiv-Oder-Operation mit einem mithilfe eines Schlüssels K errechneten Schlüsselstrom S(K) unterzogen wird.

    - Verwenden Sie hier als Schlüsselstrom S(K) = P XOR K eine durch den Mersenne-Twister-Alghorithmus generierte Pseudozufallszahlenfolge P, welche mit dem zyklisch wiederholten Schlüssel K exklusiv-oder verknüpft wird.

    Hier ist die Mersenne-Funktion:

    unsigned int mersenne_twister() {
    #define N     624
    #define M     397
    #define HI    0x80000000
    #define LO    0x7fffffff
      static const unsigned int seed = 5489UL;
      static const unsigned int A[2] = { 0, 0x9908b0df };
      static unsigned int y[N];
      static int i = N+1;
    
      unsigned int e;
    
      if (i > N) {
        /* Initialisiere y mit Pseudozufallszahlen */
        y[0] = seed;
    
        for (i=1; i<N; ++i) {
          y[i] = (1812433253UL * (y[i-1] ^ (y[i-1] >> 30)) + i);
    
      }
    
      if (i == N) {
        /* Berechne neuen Zustandsvektor */
        unsigned int h;
    
        for (i=0; i<N-M; ++i) {
          h = (y[i] & HI) | (y[i+1] & LO);
          y[i] = y[i+M] ^ (h >> 1) ^ A[h & 1];
        }
        for ( ; i<N-1; ++i) {
          h = (y[i] & HI) | (y[i+1] & LO);
          y[i] = y[i+(M-N)] ^ (h >> 1) ^ A[h & 1];
        }
    
        h = (y[N-1] & HI) | (y[0] & LO);
        y[N-1] = y[M-1] ^ (h >> 1) ^ A[h & 1];
        i = 0;
      }
    
      e = y[i++];
      e ^= (e >> 11);
      e ^= (e << 7) & 0x9d2c5680;
      e ^= (e << 15) & 0xefc60000;
      e ^= (e >> 18);
    
      return e;
    #undef N
    #undef M
    #undef HI
    #undef LO
    }
    

    Ich weiß nicht wie man bei der Aufgabe vorgehen soll. Ich wäre dankbar über ein paar Tipps und Hilfen 🙂



  • Hi
    So in etwa könnte das gemeint sein

    // - Schreiben Sie eine Funktion, die auf ein Array von unsigned char mit der Funktion zu übergebender Länge eine Verschlüsselung mittels einer Stromchiffre implementiert. 
    void encode ( char* array, size_t arrlen, char* key, size_t klen )
    {
    	// Für jedes M(i) aus array setze M(i):= M(i) XOR (P XOR K)
    }
    
    int main(void)
    {
    	char array[] = "Verschluessele mich!";
    	char K[]="irgendein schluessel";
    	encode ( array, strlen(array), K, strlen(K));
    	return 0;
    }
    


  • Danke CJosef! Das ergibt sinn. Muss ich dann die Mersenne-Twister-Funktion in die encode-Funktion einsetzen damit das ganze funktioniert?


  • Mod

    rietzemod schrieb:

    Muss ich dann die Mersenne-Twister-Funktion in die encode-Funktion einsetzen damit das ganze funktioniert?

    Damit es funktioniert? Nein, dafür musst du erst einmal Punkt 2 aus der Aufgabenstellung umsetzen (Punkt 1 hat CJosef dir gemacht). Dann funktioniert deine Verschlüsselung an sich. Das solltest du natürlich mit einer passenden Entschlüsselungsfunktion auch testen.

    Die Zufallszahlen brauchst du erst in Punkt 3, in dem das Verfahren ausgebaut werden soll. Und ja, dann brauchst du die Zufallszahlen beim Verschlüsseln (und beim Entschlüsseln auch).



  • Ok Danke!

    Stromchiffre errechne ich dann wohl folgendermaßen oder?

    int M, S, C;
    C = M ^ S;
    printf("C: %d\n", C);
    

    und S errechne ich durch

    int P, K, S;
    S = P ^ K;
    printf("C: %d\n", C);
    

    Und P gewinne ich wiederum durch den Mersenne-Twister richtig? Wenn ja, wie muss ich dabei vorgehen?


  • Mod

    rietzemod schrieb:

    Ok Danke!

    Stromchiffre errechne ich dann wohl folgendermaßen oder?

    int M, S, C;
    C = M ^ S;
    printf("C: %d\n", C);
    

    und S errechne ich durch

    int P, K, S;
    S = P ^ K;
    printf("C: %d\n", C);
    

    Und P gewinne ich wiederum durch den Mersenne-Twister richtig?

    JA, das steht doch schon so in der Aufgabe.

    Wenn ja, wie muss ich dabei vorgehen?

    Du musst dir ein Protokoll ausdenken, wie du die gleiche Zufallszahlenfolge beim Entschlüsseln erneut erzeugen kannst. Da der MT ein PRNG ist, ist dies prinzipiell möglich (und gewünscht) sofern du beim Verschlüsseln und Entschlüsseln den gleichen Seed benutzt. Da in der Aufgabe keine Vorgabe steht, nehme ich mal an, dass es dir frei gestellt ist, wie du das Problem angehst.



  • SeppJ schrieb:

    Du musst dir ein Protokoll ausdenken, wie du die gleiche Zufallszahlenfolge beim Entschlüsseln erneut erzeugen kannst. Da der MT ein PRNG ist, ist dies prinzipiell möglich (und gewünscht) sofern du beim Verschlüsseln und Entschlüsseln den gleichen Seed benutzt. Da in der Aufgabe keine Vorgabe steht, nehme ich mal an, dass es dir frei gestellt ist, wie du das Problem angehst.

    Ich weiß nicht wie das gehen soll 😞 Hat jemand noch einen Tipp für mich?


  • Mod

    rietzemod schrieb:

    Ich weiß nicht wie das gehen soll 😞 Hat jemand noch einen Tipp für mich?

    Guck dir an, was ein PRNG ist und wie er funktioniert. Die allereinfachste Methode, mit der du gleichartige Ergebnisse sicherstellen kannst, ist so einfach und offensichtlich, dass du dich hinterher schämen wirst, nicht sofort darauf gekommen zu sein.

    Alle komplexeren Protokolle (zumindest die, die mir gerade einfallen) sind eigentlich nur Abwandlungen davon.


Anmelden zum Antworten