?? 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 + -