Si può semplicemente scambiare avanti un all'indietro:
//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
Dopo ogni giro, si scambia a destra ea sinistra, così facendo, a livello di riferimento (e utilizzare temp
) per memorizzare di riferimento temporaneo:
int[] temp = left;
left = right;
right = temp;
Nota che non copia i valori qui, è sufficiente scambiare i riferimenti, questo è quindi fatto in tempo costante. Questo può essere utile se si desidera crittografare/decodificare i messaggi lunghi e non si vuole perdere tempo a copiare di nuovo.
Quindi, ciò che accade è, inizialmente si dispone di tre liste L, R e K
Ora, nel primo turno, è sufficiente modificare la lista ascensore, elemento-saggio, come avete dimostrato nel codice:
for(int i = 0; i < right.length; i++){
right[i] = left[i]^(right[i]^keys[r]);
}
importante è che non si scrive keys[i]
, ma utilizzare keys[r]
(l'indice essendo turno corrente): esso implica di avere almeno 10
chiavi per fare l'aritmetica, naturalmente.
Si noti che è possibile sovrascrivere right[i]
perché non si riutilizza tale valore in un secondo momento. Puoi così fare modifiche in linea.
Dopo le modifiche, si scambiano i buffer. L'unico aspetto che devi prendere in considerazione è che per l'ultimo round, dopo aver eseguito l'operazione, anche i buffer verranno scambiati. Pertanto verranno scambiati anche gli ultimi left
e right
. Puoi (1) fare uno scambio addizionale dopo il ciclo for; oppure (2) prendere in considerazione lo swap e fingere che left
sia right
e viceversa; o (3) utilizzare un valore di if
-clausa per impedire l'ultimo scambio.
Basta avvolgere uno di loro in un ciclo for come quelli che si sta già utilizzando –
poi ho un problema con left1 sempre sovrascritto con il diritto originale, ho bisogno degli array sinistro e destro del round precedente. – fsp