2016-04-30 28 views
1

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

Ferda

enter image description here

回答

2

我想,这个问题可以在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)你O内存小块的分配很多(在gets_bits()),你永远不会释放它;如果你真的想用直接分配的内存(但你的情况是没有必要的),记得要释放它

2)尽量避免直接分配的内存和C风格的数组; 3)如果您真的需要直接在C++中分配内存,请使用new/delete并避免malloc()/free()。在C型阵列的情况下,不存在差别,但,分配对象,malloc()不能构造(和free()不能破坏)它们

4)你的get_Bits()/applyDotFunc()是过于复杂。给看看吧,你会看到applyDotFunc()回报1时value1 & value2是奇数高位,并返回0时value1 & value2是即使高位。这样就可以避免阵列(假设通过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.:对不起我的英文不好

+0

嗨maxx66,我不写C++代码多年,这个代码是为一门功课,我会运行一次。所以我没有尽力写出完美的代码。有人(我的导师)检查了产生的LAT表,这是真的。这对我来说很重要。感谢您的时间与兴趣 :) –

4

这里是一个计算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; 
      } 
     } 
    } 

完整代码,可以发现如下:

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; 
} 

希望这有助于