我有一个密码学家庭作业要求LAT表计算许多4 * 4 s-box。为此,我写了一个简单的C ++程序。我将问题文本附加为图像。我不确定教练给出的公式是否是LAT表计算的通用公式,或者他自己做了。我的问题是我准备的软件给出了一个全零的LAT表。我没有这个公式的测试向量。我将附上以下代码。如果知道线性近似表的人可以检查程序并告诉我什么是问题,我将非常高兴。 (我检查了位转换部分,它工作正常!) 提前谢谢..
Ferda
答案 0 :(得分:5)
这是一个用于计算DES s-box的线性近似表的伪代码。
int x_i =0, y_i = 0, y_j=0,x_j =0, parity_11=0;
int temp=0;
for(x_i=0;x_i<64;x_i++){
for(y_i=0;y_i<16;y_i++){
for(x_j=0;x_j<64;x_j++){
y_j=sbox_1[x_j];
y_j=y_j&y_i;
temp=x_j&x_i;
parity_11=(parity(temp)+parity(y_j))%2;
parity_x_y[x_i][y_i]+=parity_11;
}
}
}
完整代码可以在以下网址找到:
static const char sbox_1[] = {
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
};
int parity(unsigned int x){
unsigned int count = 0, i, b = 1;
for(i = 0; i < 8; i++){
if( x & (b << i) ){count++;}
}
if( (count % 2) ){return 1;}
return 0;
}
int parity_x_y[64][16] ={};
void print_xor(){
int i=0,j=0;
for(i=0;i<64;i++){
j=0;
for(j=0;j<16;j++){
printf("%d ",parity_x_y[i][j]);
}
printf("\n");
}
}
void print_LAT(){
int x_i =0, y_i = 0, y_j=0,x_j =0, parity_11=0;
int temp=0;
print_xor();
for(x_i=0;x_i<64;x_i++){
for(y_i=0;y_i<16;y_i++){
for(x_j=0;x_j<64;x_j++){
y_j=sbox_1[x_j];
y_j=y_j&y_i;
temp=x_j&x_i;
parity_11=(parity(temp)+parity(y_j))%2;
parity_x_y[x_i][y_i]+=parity_11;
}
}
}
int j=0;
print_xor();
}
int main(){
print_LAT();
return 0;
}
希望这有帮助
答案 1 :(得分:3)
我认为问题出在applyDotFunc()
您永远不会使用第二个参数。我想,在value2ptr创建中,你的意图是使用value2
而不是value1
int applyDotFunc(int value1, int value2)
{
int value1arr[4] = { 0 };
int* value1ptr = get_bits(value1, 4);
value1arr[0] = value1ptr[0];
value1arr[1] = value1ptr[1];
value1arr[2] = value1ptr[2];
value1arr[3] = value1ptr[3];
int value2arr[4] = { 0 };
int* value2ptr = get_bits(value1, 4); // <-- should be value2 ?
value2arr[0] = value2ptr[0];
value2arr[1] = value2ptr[1];
value2arr[2] = value2ptr[2];
value2arr[3] = value2ptr[3];
---- 编辑 ----
请不要冒犯,但我会就你的代码给你一些建议。
按开放顺序
1)你分配了大量的内存(gets_bits()
)并且你永远不会释放它;如果你真的想使用直接分配的内存(但在你的情况下没有必要),请记得释放它
2)尽量避免直接分配内存和C风格的数组;相反,使用STL容器
3)如果你真的需要在C ++中直接分配内存,请使用new
/ delete
并避免malloc()
/ free()
。如果是C风格的数组没有区别,但分配对象malloc()
无法构造(free()
无法破坏)
4)您的get_Bits()
/ applyDotFunc()
过于复杂。看看它,你会看到applyDotFunc()
在value1 & value2
为奇数高位时返回1,在value1 & value2
为偶数高位时返回0。所以你可以避免数组和(假设传递value1 & value2
)你可以用这种更简单的方式编写它
int applyDotFunc (int valAnd)
{
int sumBits = 0;
for ( int k = 0 ; k < 4 ; ++k )
sumBits += (0 != (valAnd & (1 << k)));
return sumBits & 1 ;
}
5)当你只能使用一个时,你在findApprox
中使用三个周期;它可以是
void findApprox ()
{
int c, d, e;
for ( c = 1 ; c < 16 ; ++c ) //output mask
for ( d = 1 ; d < 16 ; ++d ) //input mask
{
approxTable[d][c] = -8; // initialize to -8; so there is no need
// to subtract at the end
for( e = 0 ; e < 16 ; ++e )
approxTable[d][c] += applyDotFunc(e & d) ^ applyDotFunc(sBox[e] & c); // a += x is simpler than a = a + x
}
}
6)你确定approxTable
指数从1到15吗?而不是从0到15?
7)在showApprox()
中,e
未使用
8)你使用全局变量;这是不必要的,(恕我直言)危险。避免他们像瘟疫一样。
p.s:抱歉我的英语不好