C++ SBox的线性近似表计算

C++ SBox的线性近似表计算,c++,cryptography,C++,Cryptography,我有一份密码学作业,要求对大量的4*4 s盒进行LAT table计算。为此,我编写了一个简单的C++程序。我附上问题文本作为图像。我不确定老师给出的公式是用于车床计算的通用公式,还是他自己做的。我的问题是,我准备的软件给出了一个全零的LAT表。我没有这个公式的测试向量。我将在下面附上代码。如果了解线性近似表的人能检查一下程序并告诉我问题出在哪里,我将非常高兴。(我检查了位转换部分,工作正常!) 提前谢谢 费达 我想问题可能出在applyDotFunc() 永远不要使用第二个参数。我想,在val

我有一份密码学作业,要求对大量的4*4 s盒进行LAT table计算。为此,我编写了一个简单的C++程序。我附上问题文本作为图像。我不确定老师给出的公式是用于车床计算的通用公式,还是他自己做的。我的问题是,我准备的软件给出了一个全零的LAT表。我没有这个公式的测试向量。我将在下面附上代码。如果了解线性近似表的人能检查一下程序并告诉我问题出在哪里,我将非常高兴。(我检查了位转换部分,工作正常!) 提前谢谢

费达


我想问题可能出在
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];
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
       }
}
void findApprox()
{
int c,d,e;
对于(c=1;c<16;++c)//输出掩码
对于(d=1;d<16;++d)//输入掩码
{
approxTable[d][c]=-8;//初始化为-8;因此不需要
//最后减去
对于(e=0;e<16;++e)
可逼近的[d][c]+=applyDotFunc(e&d)^applyDotFunc(sBox[e]&c);//a+=x比a=a+x简单
}
}
6) 您确定
approxTable
索引从1到15吗?而不是从0到15

7) 在
showAbrox()
中,
e
未使用

8) 你使用全局变量;这是不必要的,也是危险的。像躲避瘟疫一样躲避它们


p、 s:抱歉我的英语不好

这里有一个psuedocode来计算DES s盒的线性近似表

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;
            }
        }
    }
int x_i=0,y_i=0,y_j=0,x_j=0,奇偶校验11=0;
内部温度=0;

对于(xi i=0;xiiHixx66),我多年没有编写C++代码,这段代码是为了一个我将运行一次的作业。所以我没有努力编写完美的代码。有人(我的导师)检查了结果的LAT表,这是真的。这对我来说是很重要的。谢谢您的时间和兴趣:
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;
}