📄 char check_key.c
字号:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
//***********************************************************************************************
void key_change( int k[64], int keyout[17][48]) //子函数,根据输入的64bits密钥,产生相应的16种子密钥;
{
int key[17][56];
int c[17][28];
int d[17][28];
int i=1,t;
int j;
int m,n;
int k0[56]; //定义的子函数变量;
//*******************************************************************************************
k0[0]=k[56];k0[1]=k[48];k0[2]=k[40];k0[3]=k[32];k0[4]=k[24];k0[5]=k[16];k0[6]=k[8];
k0[7]=k[0];k0[8]=k[57];k0[9]=k[49];k0[10]=k[41];k0[11]=k[33];k0[12]=k[25];k0[13]=k[17];
k0[14]=k[9];k0[15]=k[1];k0[16]=k[58];k0[17]=k[50];k0[18]=k[42];k0[19]=k[34];k0[20]=k[26];
k0[21]=k[18];k0[22]=k[10];k0[23]=k[2];k0[24]=k[59];k0[25]=k[51];k0[26]=k[43];k0[27]=k[35];
k0[28]=k[62];k0[29]=k[54];k0[30]=k[46];k0[31]=k[38];k0[32]=k[30];k0[33]=k[22];k0[34]=k[14];
k0[35]=k[6];k0[36]=k[61];k0[37]=k[53];k0[38]=k[45];k0[39]=k[37];k0[40]=k[29];k0[41]=k[21];
k0[42]=k[13];k0[43]=k[5];k0[44]=k[60];k0[45]=k[52];k0[46]=k[44];k0[47]=k[36];k0[48]=k[28];
k0[49]=k[20];k0[50]=k[12];k0[51]=k[4];k0[52]=k[27];k0[53]=k[19];k0[54]=k[11];k0[55]=k[3];
//******************************************************************************************
for(t=0;t<28;t++) //循环赋值于c[0][28];
{
c[0][t]=k0[t];
}
for(t=28;t<56;t++) //循环赋值于d[0][28];
{
d[0][t-28]=k0[t];
}
do
{
for(t=1;t<28;t++) //数据的循环左移1位,并保存于下一行数据中;
{
m=c[i-1][0];
c[i][t-1]=c[i-1][t];
c[i][27]=m;
m=d[i-1][0];
d[i][t-1]=d[i-1][t];
d[i][27]=m;
}
i++;
}while(i<=2); //2次左移1位的循环;
do
{
for(t=2;t<28;t++) //数据的循环左移2位,并保存于下一行数据中;
{
m=c[i-1][0];
n=c[i-1][1];
c[i][t-2]=c[i-1][t];
c[i][26]=m;
c[i][27]=n;
m=d[i-1][0];
n=d[i-1][1];
d[i][t-2]=d[i-1][t];
d[i][26]=m;
d[i][27]=n;
}
i++;
}while(i<=8); //6次左移2位的循环;
for(t=1;t<28;t++) //数据的循环左移1位,并保存于下一行数据中;
{
m=c[i-1][0];
c[i][t-1]=c[i-1][t];
c[i][27]=m;
m=d[i-1][0];
d[i][t-1]=d[i-1][t];
d[i][27]=m;
}
i++;
do
{
for(t=2;t<28;t++) //数据的循环左移2位,并保存于下一行数据中;
{
m=c[i-1][0];
n=c[i-1][1];
c[i][t-2]=c[i-1][t];
c[i][26]=m;
c[i][27]=n;
m=d[i-1][0];
n=d[i-1][1];
d[i][t-2]=d[i-1][t];
d[i][26]=m;
d[i][27]=n;
}
i++;
}while(i<=15); //6次左移2位的循环;
for(t=1;t<28;t++) //数据的循环左移1位,并保存于下一行数据中;
{
m=c[i-1][0];
c[i][t-1]=c[i-1][t];
c[i][27]=m;
m=d[i-1][0];
d[i][t-1]=d[i-1][t];
d[i][27]=m;
} //二维数组c[17][28],d[17][28]的数据全部产生并保存;
for(i=0;i<17;i++) //双重循环实现将c[17][28],d[17][28]的数据合并,存于key[17][56];
{
for(j=0;j<28;j++)
{
key[i][j]=c[i][j];
key[i][j+28]=d[i][j];
}
}
for(i=1;i<17;i++) //置换选择2的数据转换,声称16种子密钥;
{
keyout[i][0]=key[i][13];keyout[i][1]=key[i][16];keyout[i][2]=key[i][10];keyout[i][3]=key[i][23];keyout[i][4]=key[i][0];keyout[i][5]=key[i][4];
keyout[i][6]=key[i][2];keyout[i][7]=key[i][27];keyout[i][8]=key[i][14];keyout[i][9]=key[i][5];keyout[i][10]=key[i][20];keyout[i][11]=key[i][9];
keyout[i][12]=key[i][22];keyout[i][13]=key[i][18];keyout[i][14]=key[i][11];keyout[i][15]=key[i][3];keyout[i][16]=key[i][25];keyout[i][17]=key[i][7];
keyout[i][18]=key[i][15];keyout[i][19]=key[i][6];keyout[i][20]=key[i][26];keyout[i][21]=key[i][19];keyout[i][22]=key[i][12];keyout[i][23]=key[i][1];
keyout[i][24]=key[i][40];keyout[i][25]=key[i][51];keyout[i][26]=key[i][30];keyout[i][27]=key[i][36];keyout[i][28]=key[i][46];keyout[i][29]=key[i][54];
keyout[i][30]=key[i][29];keyout[i][31]=key[i][39];keyout[i][32]=key[i][50];keyout[i][33]=key[i][44];keyout[i][34]=key[i][32];keyout[i][35]=key[i][47];
keyout[i][36]=key[i][43];keyout[i][37]=key[i][48];keyout[i][38]=key[i][38];keyout[i][39]=key[i][55];keyout[i][40]=key[i][33];keyout[i][41]=key[i][52];
keyout[i][42]=key[i][45];keyout[i][43]=key[i][41];keyout[i][44]=key[i][49];keyout[i][45]=key[i][35];keyout[i][46]=key[i][28];keyout[i][47]=key[i][31];
}
}
/**************************************************************************************************************
函数功能:对输入的密钥进行奇偶和加密强度的特性验证;
入口参数:int key[8];
出口参数:返回字符类型值;
'0': ok!
'1': 密钥奇偶校验错误!
'2': 弱密钥!
'3': 半弱密钥!
'4': 可能的弱密钥!
**************************************************************************************************************/
char check_key(int key[8])
{
int k[64];
int check_key[64];
int keyout[17][48];
int key_byte[8];
int i,a;
int n=1;
int m=0;
for(i=0; i<8; i++)
{
key_byte[i]=key[i];
}
for(a=0;a<8;a++) //双重循环将8byte的字符转换成64bits的二进制码k[64];
{
for(i=0;i<8;i++)
{
if(key_byte[a]%2==1)
{
k[(a*8)+7-i]=1;
}
else
{
k[(a*8)+7-i]=0;
}
key_byte[a]=key_byte[a]>>1;
}
}
//******************************************************************************************
for(i=0;i<64;i++) //循环将k[64]赋值于check_key[64];
{
check_key[i]=k[i];
}
for(a=0;a<8;a++) //双重循环对输入的密钥进行奇偶校验;
{
for(i=1;i<8;i++)
{
check_key[a*8+i]=check_key[a*8+i]+check_key[a*8+i-1];
check_key[a*8+i]&=0x01;
}
if(check_key[a*8+7]==1)
continue;
else
{
return '1';
} //奇偶校验错误,返回0;
}
//****************************************************************************************
key_change( k, keyout); //调用子函数key(),返回16 种子密钥keyout[17][48];
//****************************************************************************************
for(a=1;a<16;a++) //对输出的子密钥进行加密强度检验;
{
m=0;
for(i=0;i<48;i++)
{
if(keyout[1][i]==keyout[a+1][i])
{
m=m+1;
}
}
printf("\n");
if(m==48)
{
n=n+1;
}
}
if(n==16) //检验密码对代码的加密强度,返回预定值;
return '2';
else if(n==8)
return '3';
else if(n==4)
return '4';
else if(n<4)
return '0';
}
//*****************************************************************************************
void main()
{
int key[8];
int i;
char r;
do
{
printf("Please input the key[8] datas:\n");
for(i=0; i<8; i++) //循环实现8byte的密钥数据输入;
{
scanf("%x",&key[i]);
}
//******************************************
r=check_key( key); //调用密钥校验函数;
//******************************************
printf("r=%c\n",r); //密码的加密性能检验;
if(r=='1')
printf("The input key[8] is error...\n");
else if(r=='2')
printf("The input key has no encryption strength,please change another one...\n");
else if(r=='3')
printf("The input key has more less encryption strength,please change another one...\n");
else if(r=='4')
printf("The input key has less encryption strength,please change another one...\n");
}while(r!='0');
printf("The input key canbe used in encryption!!!");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -