2015-05-13 8 views
5

Für einige Studenten Sachen muss ich ein Feistel Netzwerk in Java implementieren.Mutliround Feistel Netzwerk in Java

Ich begann mit 3 manuellen Runden, wie folgt aus:

// round 1 
    int[] left1 = right; 
    int[] right1 = new int[right.length]; 

    for(int i = 0; i < right.length; i++){ 
     right1[i] = left[i]^(right[i]^keys[0]); 
    } 

    // round 2 
    int[] left2 = right1; 
    int[] right2 = new int[right.length]; 

    for(int i = 0; i < right.length; i++){ 
     right2[i] = left1[i]^(right1[i]^keys[1]); 
    } 

    // round 3 
    int[] left3 = right2; 
    int[] right3 = new int[right.length]; 

    for(int i = 0; i < right.length; i++){ 
     right3[i] = left2[i]^(right2[i]^keys[2]); 
    } 

Wenn ich 10 Runden haben möchte ich brauchen würde, dieses Zeug 10mal zu kopieren und die Variablen anzupassen, gibt es einen besseren Weg, dies zu tun ? Vielleicht ist es zu spät, aber ich nicht von einer Lösung denken kann ...

+5

Nur wickeln einer von ihnen in eine wie die, die für die Schleife tun müssen, um laufen sind Sie bereits mit –

+0

dann habe ich ein Problem mit left1 immer mit dem ursprünglichen Recht überschrieben, brauche ich die linken und rechten Arrays aus der vorherigen Runde. – fsp

Antwort

6

Sie können einfach tauschen vorwärts ein rückwärts:

//initialization 
int[] left = {};//setup left 
int[] right = {};//setup right 
//keys 
int[] keys = {};//setup keys 

for(int r = 0; r < 10; r++) {//the number of rounds 
    for(int i = 0; i < right.length; i++){ 
     right[i] = left[i]^(right[i]^keys[r]); 
    } 

    //swap lists to do the next round 
    int[] temp = left; 
    left = right; 
    right = temp; 
} 
//remark: the result (right) will be stored in left 
//use left as resulting right 

Nach jeder Runde, tauschen Sie links und rechts durch, um auf Referenzniveau zu tun (und verwenden temp) vorübergehend zu speichern Referenz:

int[] temp = left; 
left = right; 
right = temp; 

Beachten Sie, dass Sie dies nicht tun Kopie die Werte hier, Sie einfach Referenzen tauschen, dies so ist in konstanter Zeit erfolgen. Dies kann nützlich sein, wenn Sie lange Nachrichten verschlüsseln/entschlüsseln wollen und keine Zeit mit dem erneuten Kopieren verschwenden möchten.

Also, was passiert ist, Sie zunächst drei Listen L, R und K

nun in der ersten Runde haben, können Sie einfach den Lift ändern, elementweise, wie Sie in Ihrem Code gezeigt haben:

for(int i = 0; i < right.length; i++){ 
    right[i] = left[i]^(right[i]^keys[r]); 
} 

Wichtig ist, dass Sie nicht keys[i] schreiben, sondern verwenden keys[r] (der Index der aktuellen Runde ist): es bedeutet, dass Sie mindestens 10 Tasten haben die Arithmetik natürlich zu tun.

Beachten Sie, dass Sie right[i] überschreiben können, da Sie diesen Wert später nicht wiederverwenden. Sie können also Inline-Änderungen vornehmen.

Nach den Änderungen tauschen Sie die Puffer aus. Der einzige Aspekt, den Sie berücksichtigen müssen, ist, dass für die letzte Runde nach der Operation auch die Puffer ausgetauscht werden. Somit werden auch die letzten left und right getauscht. Sie können entweder (1) einen zusätzlichen Swap nach der for-Schleife ausführen; oder (2) den Swap berücksichtigen und so tun, als sei leftright und umgekehrt; oder (3) verwenden Sie eine if -Klausel, um den letzten Austausch zu verhindern.

+1

Sie haben die Dinge für mich erledigt, danke, vor allem der Austausch Teil. – fsp

1

Verwendung 2-dimensionales Array

int rounds = 10 // number of rounds 
int leftArray = new int[rounds][right.length]; 
int rightArray = new int[rounds][right.length]; 

Dann:

  • leftArray[0][0] entspricht left1[0];
  • leftArray[0][1] entspricht left1[1];
  • rightArray[0][0] entspricht right1[0];
  • rightArray[2][2] entspricht right3[2];
  • ...

dann eine verschachtelte Schleife verwenden, um die Dinge, die Sie

for(int i=0; i<rouds; i++){ 
    //set your variables 
    for(int j=0; j<right.length; j++){ 
    //do computation here 
    } 
} 
+0

danke CommuSoft –

Verwandte Themen