【发布时间】:2020-12-16 20:35:15
【问题描述】:
这里是c语言给的代码,s box表是{0xE, 0x4, 0xD, 0x1, 0x2, 0xF, 0xB, 0x8, 0x3, 0xA, 0x6, 0xC, 0x5, 0x9, 0x0, 0x7 };,当我们运行这段代码时,我们得到了错误的输出。我们应该从这段代码中得到线性逼近表。我认为我得到的错误出现在 sbox 输出部分。
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int UINT16;
UINT16 sbox_table[16] = {0xE, 0x4, 0xD, 0x1, 0x2, 0xF, 0xB, 0x8, 0x3, 0xA, 0x6, 0xC, 0x5, 0x9, 0x0, 0x7};
int lin_appr_table[16][16];
void construct_lin_appr_table()
{
UINT16 i, j, k;
UINT16 X, Y, x;
UINT16 X_xor, Y_xor;
int counter;
for (i=0 ; i<16 ; i++)//sbox input
{
for (j=0 ; j<16 ; j++)//sbox output
{
X=i;
Y=j;
counter=0;
for (k=0;k<16;k++)
{
X_xor=X&k;
Y_xor=Y&sbox_table[k];
if(X_xor^Y_xor==0) counter++;
}
lin_appr_table[i][j]=counter-8;
//Write the code that makes up the table
}
}
//Write the code that printed the table on the screen
for (i=0 ; i<16 ; i++)//sbox input
{
for (j=0 ; j<16 ; j++)//sbox output
{
printf("% d ", lin_appr_table[i][j]);
}
printf("\n");
}
}
int main()
{
construct_lin_appr_table();
getch();
return 0;
}
【问题讨论】:
-
注意
if(X_xor^Y_xor==0)中的运算符优先级。你的意思是if((X_xor^Y_xor)==0)? -
X_xor=X&k应该是X_xor = X & (1 << k)吗?只是猜测。 -
您可以在此处编辑帖子以显示预期输出吗? (我看到您几乎将其发布为答案,但最好在这里。)
-
这样做的目的是:上面的代码没有给我们这个期望的表,目的是找到代码中的错误,以便把这个表(期望的表)作为输出。跨度>
-
感谢您的推荐。希望得到答案
标签: c algorithm encryption cryptography des