SBox的线性近似表计算

时间:2016-04-30 08:46:32

标签: c++ cryptography

我有一个密码学家庭作业要求LAT表计算许多4 * 4 s-box。为此,我写了一个简单的C ++程序。我将问题文本附加为图像。我不确定教练给出的公式是否是LAT表计算的通用公式,或者他自己做了。我的问题是我准备的软件给出了一个全零的LAT表。我没有这个公式的测试向量。我将附上以下代码。如果知道线性近似表的人可以检查程序并告诉我什么是问题,我将非常高兴。 (我检查了位转换部分,它工作正常!) 提前谢谢..

Ferda

enter image description here

2 个答案:

答案 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:抱歉我的英语不好