2015-05-13 16 views
5

Đối với một số nội dung của học sinh, tôi cần triển khai mạng Feistel trong Java.Mạng Mutliround Feistel trong Java

tôi bắt đầu với 3 vòng tay, như thế này:

// 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]); 
    } 

Nếu tôi muốn có 10 viên đạn tôi sẽ cần phải sao chép công cụ này 10 lần và điều chỉnh các biến, là có một cách tốt hơn để làm điều này ? Có lẽ nó đã quá muộn nhưng tôi không thể nghĩ ra một giải pháp ...

+5

Chỉ cần quấn một trong số họ trong một vòng lặp for như những người bạn đã sử dụng –

+0

sau đó tôi có một vấn đề với left1 luôn bị ghi đè bằng quyền gốc, tôi cần các mảng trái và phải từ vòng trước. – fsp

Trả lời

6

Bạn có thể dễ dàng trao đổi về phía trước một ngược:

//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 

Sau mỗi vòng, bạn hoán đổi trái và phải làm như vậy ở cấp tài liệu tham khảo (và sử dụng temp) để lưu trữ tạm thời tham khảo:

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

lưu ý rằng bạn không bản sao các giá trị ở đây, bạn chỉ đơn giản là trao đổi tài liệu tham khảo, do đó điều này được thực hiện trong thời gian liên tục. Điều này có thể hữu ích nếu bạn muốn mã hóa/giải mã các tin nhắn dài và không muốn lãng phí thời gian sao chép lại.

Vì vậy, những gì xảy ra là, ban đầu bạn có ba danh sách L, R và K

Bây giờ ở vòng đầu tiên, bạn chỉ cần sửa đổi danh sách thang máy, yếu tố khôn ngoan như bạn đã thấy trong mã của bạn:

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

Quan trọng là bạn không viết keys[i], nhưng sử dụng keys[r] (chỉ mục là vòng hiện tại): nó ngụ ý bạn có ít nhất 10 phím để thực hiện số học của khóa học.

Lưu ý rằng bạn có thể ghi đè right[i] vì bạn không sử dụng lại giá trị đó sau đó. Do đó, bạn có thể thực hiện các sửa đổi nội tuyến.

Sau khi sửa đổi, bạn trao đổi bộ đệm. Khía cạnh duy nhất bạn cần phải tính đến là ở vòng cuối cùng, sau khi thực hiện thao tác, các bộ đệm cũng sẽ được hoán đổi. Do đó, leftright cuối cùng cũng sẽ được hoán đổi. Bạn có thể (1) thực hiện hoán đổi bổ sung sau vòng lặp for; hoặc (2) xem xét hoán đổi và giả vờ leftright và ngược lại; hoặc (3) sử dụng if -nhận để ngăn chặn lần hoán đổi cuối cùng.

+1

bạn đã dọn dẹp mọi thứ cho tôi, cảm ơn, đặc biệt là phần trao đổi. – fsp

1

Sử dụng 2 chiều mảng

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

Sau đó:

  • leftArray[0][0] tương đương với left1[0];
  • leftArray[0][1] tương đương với left1[1];
  • rightArray[0][0] tương đương với right1[0];
  • rightArray[2][2] tương đương với right3[2];
  • ...

sau đó sử dụng một vòng lặp lồng nhau để lặp những điều bạn cần làm

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

CommuSoft của cảm ơn –

Các vấn đề liên quan