fsp*_*fsp 5 java encryption feistel-cipher
对于一些学生来说,我需要用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]);
}
Run Code Online (Sandbox Code Playgroud)
如果我想要10轮,我需要复制这些东西10次并调整变量,有更好的方法吗?也许现在为时已晚,但我想不出解决方案......
你可以简单地向前交换:
//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
Run Code Online (Sandbox Code Playgroud)
在每轮之后,您在参考级别(和使用temp)执行此操作左右交换以存储参考临时:
int[] temp = left;
left = right;
right = temp;
Run Code Online (Sandbox Code Playgroud)
请注意,您不要在此复制值,只需交换引用,这样就可以在恒定时间内完成.如果要加密/解密长消息并且不想浪费时间再次复制,这可能很有用.
所以会发生什么,你最初有三个列表L,R和K.
现在在第一轮中,您只需修改提升列表,就像您在代码中显示的那样:
for(int i = 0; i < right.length; i++){
right[i] = left[i] ^ (right[i] ^ keys[r]);
}
Run Code Online (Sandbox Code Playgroud)
重要的是你不写keys[i],但使用keys[r](索引是当前轮次):它意味着你至少有10键进行算术运算.
请注意,您可以覆盖,right[i]因为以后不会重用该值.因此,您可以进行内联修改.
修改后,您交换缓冲区.您需要考虑的唯一方面是,对于最后一轮,在执行操作之后,缓冲区也将被交换.因此,最后left也right将被交换.您可以(1)在for循环后执行额外的交换; 或(2)考虑交换,假装left是right,反之亦然; 或(3)使用if-clause来防止最后一次交换.