对于SPN crypograpic功能的实现(与研究相关(,我正试图将4位推到int中。
我可以确定错误,但我不知道如何修复它(目前可能盯着它看太久了(。
private int applySBox(int a, boolean inverse, boolean verbose) {
// split int (16 bit) into parts of 4 bit keeping the right order
int[] parts = new int[4];
for(int i = 0; i < 4; i++) {
parts[4 - i - 1] = a & 0b1111;
a = a >> 4;
}
// Apply the SBox to each 4 bit
// E.g. 1101 traverse (enc) = 1001, inverse (dec) = 0010
for(int i = 0; i < 4; i++) {
if(inverse) {
parts[i] = sbox.inverse(parts[i]);
} else {
parts[i] = sbox.traverse(parts[i]);
}
}
int result = 0;
// put back together
for(int i = 0; i < 4; i++) {
result = parts[i] & 0b1111;
// TODO: Reassigning does not help here, needs shift and &
result = result << 4;
}
return result;
}
在SBox之前,我可能会得到一个值1100111011001111
作为密文
在分割部分,我得到了这样的东西:
Fragment[0]: 0001100011110000
Round Value: 0001100011110000
Current key: 1101011000111111
New r Value: 1100111011001111
---
Before SBox: 1100_1110_1100_1111
Part[0] before SBox: 1100
Part[1] before SBox: 1110
Part[2] before SBox: 1100
Part[3] before SBox: 1111
Part[0] after SBox: 1011
Part[1] after SBox: 0000
Part[2] after SBox: 1011
Part[3] after SBox: 0101
根据我必须使用的SBox的定义,我知道这是正确的
这意味着,为了得到结果,我必须将0到3部分打包到一个int1011_0000_1011_0101
中,这将是正确的结果
我可以清楚地看到它不起作用,因为我总是用result = parts[i] & 0b1111;
覆盖结果——我似乎找不到修复方法
如何将每个int都有4位数据(从0到3(的int[]数组推送到包含16位数据的int结果中?
如果将位向左移位,则最右边的位将填充零。因此,您需要对结果进行异或或运算。
尝试更换
result = parts[i] & 0b1111;
带有
result ^= parts[i] & 0b1111;
或
result |= parts[i] & 0b1111;
否则,您只需重新分配值并删除之前的4位块。
你的意思是:
result = (result << 4) | parts[i];
或者,同样的东西写得不同:
result |= parts[i] << (4 * (4-i));
如果是这样的话,是的,你盯着屏幕看得太久了;得到了方眼睛";正如他们所说!
更新:由于OP意味着锁定四个部分是可以的。这是一个未经测试的traverse
变体的一行:
return sbox.traverse(a & 0b1111)
| sbox.traverse(a >> 4 & 0b1111) << 4
| sbox.traverse(a >> 8 & 0b1111) << 8
| sbox.traverse(a >> 12 & 0b1111) << 12