5

对于一些学生的东西,我需要用 Java 实现一个 Feistel 网络。

我从 3 个手动回合开始,如下所示:

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

如果我想要 10 轮,我需要复制这些东西 10 次并调整变量,有没有更好的方法来做到这一点?也许为时已晚,但我想不出解决方案...

4

2 回答 2

6

您可以简单地向前交换向后:

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

在每一轮之后,您通过在参考级别(并使用)左右交换temp来临时存储参考:

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

请注意,您不会在此处复制值,您只需交换引用,因此这是在恒定时间内完成的。如果您想加密/解密长消息并且不想浪费时间再次复制,这可能很有用。

所以会发生什么,你最初有三个列表 L、R 和 K

现在在第一轮中,您只需按元素修改提升列表,如代码中所示:

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

重要的是你不写keys[i],而是使用keys[r](索引是当前轮次):这意味着你当然至少有10键来做算术。

请注意,您可以覆盖right[i],因为您以后不会重用该值。因此,您可以进行内联修改。

修改后,您交换缓冲区。您需要考虑的唯一方面是,对于最后一轮,在执行操作后,缓冲区也将被交换。因此最后一个leftright也将被交换。您可以(1)在 for 循环之后进行额外的交换;(2) 考虑掉期并假装leftright,反之亦然;或 (3) 使用if- 子句来防止最后一次交换。

于 2015-05-13T00:46:34.053 回答
1

使用二维数组

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

然后:

  • leftArray[0][0]相当于left1[0];
  • leftArray[0][1]相当于left1[1];
  • rightArray[0][0]相当于right1[0];
  • rightArray[2][2]相当于right3[2];
  • ...

然后使用嵌套循环来迭代你需要做的事情

for(int i=0; i<rouds; i++){
  //set your variables
  for(int j=0; j<right.length; j++){
  //do computation here
  }
}
于 2015-05-13T01:55:33.143 回答