#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int Count(unsigned char Byte) //统计发生改变的位数
{
int i, j=0;
for (i=0; i<8; i++)
if (Byte&(0x01<<i)) j++;
return j;
}
unsigned char *full_array2(int n) //产生随机数(定义全排列函数)
{
int l=0,k;
static unsigned char P[256];
srand((unsigned)time(NULL));
for(int i=0;i<n*2;i++)
{
P[l++]=(unsigned char)(rand()%(n+1));
for(int j=0;j<l-1;j++) //确保产生的随机数不相同
{
if(P[j]==P[l-1])
{
l--;
break;
}
}
}
k=l;
for(i=0;i<=n;i++) //把没有出现的0~n依次补写于P[l]后面
{
int flag=0;
for(int j=0;j<k;j++)
if(P[j]==i)
{
flag=1;
break;
}
if(!flag)
{
P[l]=i;
l++;
}
}
return P;
}
unsigned char *sp(unsigned char *DArea, unsigned char *DTab,unsigned char DD[256]) //迭代
{
int i;
unsigned char R[256];
for(i=0;i<256;i++)
R[i]=DTab[DArea[i]];
for(i=0;i<256;i++)
DD[i]=R[DTab[i]];
return DD;
}
void jf(unsigned char *DArea,unsigned char *data,double &ave,double &equ)
{
double diff[256],sum1=0,sum2=0;
int i;
for(i=0;i<256;i++)
{
diff[i]=Count(DArea[i]^data[i]); //DArea[i]与data[i]异或
sum1+=diff[i];
}
ave=sum1/256.; //变化量的均值
for(i=0;i<256;i++)
{
sum2+=(diff[i]-ave)*(diff[i]-ave);
}
equ=sum2/256.; //变化量的方差
}
void main()
{
int b,i,m1,m2,j=0;
FILE *fp;
char filename[20];
double ave,equ;
unsigned char DArea[256],*DTab,*data,DD[256];
srand((unsigned)time(NULL));
start:
printf("请输入提供采样数据的随机文件名:\n");
scanf("%s",filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("没有找到文件:%s\n",filename);
goto start;
}
fread(DArea,256,1,fp);
fclose(fp);
DTab=full_array2(255);
printf("\n***********************DArea内容如下*******************************\n\n");
for(i=0;i<256;i++){
printf("%4d",DArea[i]);
if((i+1)%16==0) printf("\n");
}
printf("\n***********************DTab内容如下*******************************\n\n");
for(i=0;i<256;i++){
printf("%4d",DTab[i]);
if((i+1)%16==0) printf("\n");
}
printf("\n替换后结果如下:\n");
for(i=0;i<256;i++)
{
printf("%4d",DTab[DArea[i]]); //将DTab作为S-盒;DArea为输入数据,作为偏移量。
if((i+1)%16==0) printf("\n");
}
printf("\n移位后结果如下:\n");
for(i=0;i<256;i++)
{
printf("%4d",DArea[DTab[i]]);//将DArea作为S-盒;DTab为输入数据,作为偏移量。
if((i+1)%16==0) printf("\n");
}
data=sp(DArea,DTab,DD);
for(m1=0;m1<9;m1++)
{
data=sp(data,DTab,DD);//迭代
if(m1==2||m1==4||m1==7)
{
printf("\n第%d轮迭代后数据如下:\n\n",m1+1);
for(m2=0;m2<256;m2++)
{
printf("%4d",data[m2]);
if((m2+1)%16==0) printf("\n");
}
}
}
printf("\n\n输入要进行迭代的轮数:");
scanf("%d",&b); //迭代b次
printf("\n%d轮迭代后的统计结果:\n轮数 平均值 方差\n",b);
for(j=0;j<=b;j++)
{
data=sp(data,DTab,DD);
jf(DArea,data,ave,equ);
printf(" %d %.4f %.4f\n",j,ave,equ);
}
}