⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 char check_key.c

📁 des加解密密钥的验证检测算法
💻 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 + -