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

📄 destest.c

📁 应用于MCS51的DES算法,最小的RAM占用率,只要
💻 C
📖 第 1 页 / 共 3 页
字号:
                Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
        }
    }
    //SETP 2
    //将 Des_Temp[0-7]当中 8*8 的数据变换为左右两个 8*4 ,
    //放在 InputText_Right[0-7] 与 InputText_Left [0-7]当中
    for(i=0,j=0;i<8;i++)  //8个四位二进制
    {
        InputText_Left[i]=Des_Temp[j];
        i++;
        InputText_Left[i]=Des_Temp[j]<<4;
        j++;
    }
    for(i=0,j=4;i<8;i++)
    {
        InputText_Right[i]=Des_Temp[j];
        i++;
        InputText_Right[i]=Des_Temp[j]<<4;
        j++;
    }
    //KEY-SETP  1  Initial key
    //按换位选择表 1 对密钥进行变换,舍去BIT8的奇偶校验位.有效位为bit1-7
    //完成后存于 Des_Temp[0-7] 当中,然后再回写入 SecretKey[0-7]当中
    for(i=0;i<8;i++)
    {
        Des_Temp[i]=0;
        for(j=0;j<7;j++)
        {
            bit_point=Key_Select_Permutation_1[i*7+j];
            byte_point=bit_point/8;
            bit_point=bit_point%8;
            if((SecretKey[byte_point]&des_bit_map[bit_point])!=0)
                Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
        }
    }
    for(i=0;i<8;i++)
        SecretKey[i]=Des_Temp[i];
    //进行十六次的循环迭代
    for(Circle_Number=0;Circle_Number<16;Circle_Number++)
    {
        if(mode==Encrypt)
        {	//加密过程
        	//密钥在进行左循环移位时位的次数
        	if ((Circle_Number==0)||(Circle_Number==1)||(Circle_Number==8)||(Circle_Number==15))
            	l=1;
        	else
            	l=2;
        	//KEY-SETP 2 对密钥时行左循环移位,最后存在 SecretKey[0-7]当中,总长只有7位
        	//在进行左循环移位时分为两组分别进行,即 SecretKey[0-3],SecretKey[4-7]
        	for(i=0;i<l;i++)
        	{
            	//前四个SecretKey[0-3]
            	if((SecretKey[0]&0x80)!=0)
                	SecretKey[3]=SecretKey[3]|0x1;
            	else
                	SecretKey[3]=SecretKey[3]&0xfe;
            	for(j=0;j<3;j++)
            	{
                	SecretKey[j]=SecretKey[j]<<1;
                	if((SecretKey[j+1]&0x80)!=0)
                    	SecretKey[j]=SecretKey[j]|0x2;
	                else
    	                SecretKey[j]=SecretKey[j]&0xfc;
        	    }
            	SecretKey[3]=SecretKey[3]<<1;
            	//后四个SecretKey[4-7]
            	if((SecretKey[4]&0x80)!=0)
                	SecretKey[7]=SecretKey[7]|0x1;
            	else
                	SecretKey[7]=SecretKey[7]&0xfe;
            	for(j=4;j<7;j++)
            	{
                	SecretKey[j]=SecretKey[j]<<1;
                	if((SecretKey[j+1]&0x80)!=00)
                    	SecretKey[j]=SecretKey[j]|0x2;
                	else
                    	SecretKey[j]=SecretKey[j]&0xfc;
            	}
            	SecretKey[7]=SecretKey[7]<<1;
        	}
        }
        else
        {   //解密过程
    		//密钥在进行右循环移位时位的次数
            if(Circle_Number==0)
            	l=0;
            else if ((Circle_Number==1)||(Circle_Number==8)||(Circle_Number==15))
                l=1;
            else
                l=2;
            //KEY-SETP 2 对密钥时行右循环移位,最后存在 SecretKey[0-7]当中,总长只有7位
            //在进行右循环移位时分为两组分别进行,即 SecretKey[0-3],SecretKey[4-7]
            for(i=0;i<l;i++)
            {
                for(j=0;j<4;j++)
                {
                	SecretKey[j]=SecretKey[j]>>1;
                	SecretKey[j+4]=SecretKey[j+4]>>1;
                }

                for(j=1;j<4;j++)
                {
                    if((SecretKey[j-1]&0x01)!=0)
                        SecretKey[j]=SecretKey[j]|0x80;
                    else
                        SecretKey[j]=SecretKey[j]&0x7f;
                    if((SecretKey[j+3]&0x01)!=0)
                        SecretKey[j+4]=SecretKey[j+4]|0x80;
                    else
                        SecretKey[j+4]=SecretKey[j+4]&0x7f;
                }

                if((SecretKey[3]&0x01)!=0)
                    SecretKey[0]=SecretKey[0]|0x80;
                else
                    SecretKey[0]=SecretKey[0]&0x7f;

     			if((SecretKey[7]&0x01)!=0)
                    SecretKey[4]=SecretKey[4]|0x80;
                else
                    SecretKey[4]=SecretKey[4]&0x7f;
            }
		}
        //KEY-SETP 3 按初使化置换表 2 对密钥进行变换,完成后存于 Roll_key[0-7]当中
        //其有效数位为 8*6
        for(i=0;i<8;i++)
        {
            Roll_key[i]=0;
            for(j=0;j<6;j++)
            {
                bit_point=Key_Select_Permutation_2[i*6+j];
                byte_point=bit_point/7;
                bit_point=bit_point%7;
                if((SecretKey[byte_point]&des_bit_map[bit_point])!=0)
                    Roll_key[i]=Roll_key[i]|des_bit_map[j];
            }
        }
        //SETP 3  按扩充函数,对原文的右边 InputText_Right[0-7]的8*4数据进行扩充,
        // 变为8*6放在 Des_Temp[0-7]当中
        for(i=0;i<8;i++)
        {
            Des_Temp[i]=0;
            for(j=0;j<6;j++)
            {
                bit_point=Extend_Function_E[i*6+j];
                byte_point=bit_point/4;
                bit_point=bit_point%4;
                if((InputText_Right[byte_point]&des_bit_map[bit_point])!=0)
                    Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
            }
        }
        //SETP 4 变换后的原文的右边 Des_Temp[0-7](8*6) 与活动密钥 Roll_key[0-7] 进行位或操作
        for(i=0;i<8;i++)
            Des_Temp[i]=Des_Temp[i]^Roll_key[i];
        //SETP 5 使用替代盒将8*6的数据 Des_Temp[0-7] 还原成8*4,仍存于 Des_Temp[0-7]
        //原数据为高6位,完成以后时高4位,替换盒中的两个维是[Bit8-3,Bit7-6-5-4]
        for(i=0;i<8;i++)
        {
            //ROW
            if((Des_Temp[i]&0x80)!=0)
                l=2;
            else
                l=0;
            if((Des_Temp[i]&0x04)!=0)
                l++;
            //Column
            j=(Des_Temp[i]>>3)&0x0f;
            //S Box out
            //根据i,j从替代盒中找出相应的数,进行8*6到8*4的变换.
            Des_Temp[i]=S_Box[i][l][j]<<4;;//移位是将CODE中的低四位,变为高四位
        }
        //SETP  6  进行原文的左右边交换,即InputText_Left<>InputText_Right
        for(i=0;i<8;i++)    //Left swap Right
        {
        	j=InputText_Left[i];
        	InputText_Left[i]=InputText_Right[i];
        	InputText_Right[i]=j;
        }
        //SETP  7  按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
        //将置换后所得的数据与现在的右边进或操作,作为新的右边的数据InputText_Right[0-7].
        for(i=0;i<8;i++)
        {
            l=0;
            for(j=0;j<4;j++)
            {
                bit_point=Permutation_Function_P[i*4+j];
                byte_point=bit_point/4;
                bit_point=bit_point%4;
                if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
                    l=l|des_bit_map[j];
            }
            InputText_Right[i]=InputText_Right[i]^l;
        }
    }//end of for(Circle_Number=0;Circle_Number<16;Circle_Number++)
    //完成16次的迭代
    //SETP  8  对左右边两个8*4的数据再进行合并,形成一个8*8的新的数据
    //完成后放在Des_Temp[0-7]当中
    for(i=0,j=0;i<4;i++)
    {
	   	Des_Temp[i]=(InputText_Right[j]&0xf0)+(InputText_Right[j+1]>>4);
		Des_Temp[i+4]=(InputText_Left[j]&0xf0)+(InputText_Left[j+1]>>4);
		j=j+2;
	}
	//SETP  9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
	//完成后存入 InputText[0-7].
	for(i=0;i<8;i++)
    {
        InputText[i]=0;
        for(j=0;j<8;j++)
        {
            bit_point=Initial_Permutation_Reverse[i*8+j];
            byte_point=bit_point/8;
            bit_point=bit_point%8;
            if((Des_Temp[byte_point]&des_bit_map[bit_point])!=0)
                InputText[i]=InputText[i]|des_bit_map[j];
        }
    }
    //密文返回,放在数组 *Input 当中
    Input=Input-8;
    for(i=0;i<8;i++)
    	*Input++=InputText[i];
}
void Des_Third_Encrypt(uchar *plain,uchar *key1,uchar *key2)
{   //三重DES算法加密
	Des_Encrypt_Decrypt(plain,key1,Encrypt);
	Des_Encrypt_Decrypt(plain,key2,Decrypt);
	Des_Encrypt_Decrypt(plain,key1,Encrypt);
}
void Des_Third_Decrypt(uchar *decrypt,uchar *key1,uchar *key2)
{   //三重DES算法解密
	Des_Encrypt_Decrypt(decrypt,key1,Decrypt);
	Des_Encrypt_Decrypt(decrypt,key2,Encrypt);
	Des_Encrypt_Decrypt(decrypt,key1,Decrypt);
}
//IC卡话机在呼叫网管中心后对下次话机密码重新生成,将12个时间字符串进行扩充,
//变为一个8*8的数据,作为DES运算的密钥.
void C12_TO_B64(uchar *ptr)//通信密码中的时间串扩展
//入口: 时间串.长度为12个字节,年-秒,年只有两位
//出口:放在*Ptr所指向的原来的串当中
//变换方式为先按BCD压缩为6个BYTE,然后在高端补上一个8bit的0和8bit的奇校验位,格式如下:
//原来:[Yh][Yl][Mh][Ml][Dh][Dl][Hh][Hl][mh][ml][Sh][Sl],如
//变换:[00][YY][MM][DD][HH][mm][SS][CC]
//如:输入:"010313125524" 2001年03月13日,12时55分24秒
//   输出:0x00,0x01,0x03,0x13,0x12,0x55,0x24,0x72
{
    uchar i,j;

    uchar turn_key[8];
	turn_key[0]=0;
    for(i=1,j=0;i<7;i++)
    {
	    turn_key[i]=((*ptr++)<<4)+((*ptr++)&0x0f);
	    j=j^turn_key[i];
	}
	turn_key[7]=j;
	ptr=ptr-12;
	for(i=0;i<8;i++,ptr++)
	   *ptr=turn_key[i];
}
//
//main()
//{
//	uchar time[15];
//	uchar Plain_Text[9],Key[9],Cipher_Text[9],Key2[9];
//	strcpy(time,"010313125524");//2001年03月13日,12时55分24秒
//	C12_TO_B64(time);
//	//加密
//	strcpy(Plain_Text,"\x10\x11\x12\x13\x14\x15\x16\x17");
//	strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
//	//Des_Encrypt(Plain_Text,Key);
//	Des_Encrypt_Decrypt(Plain_Text,Key,Encrypt);
//
//	//解密
//	//strcpy(Cipher_Text,Plain_Text);
//	strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
//	Des_Encrypt_Decrypt(Plain_Text,Key,Decrypt);
//	//Des_Decrypt(Cipher_Text,Key);
//
//	//加密
//	strcpy(Plain_Text,"\x12\x34\x56\x78\xab\xcd\xef\x01");
//	strcpy(Key,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
//	Des_Encrypt(Plain_Text,Key);
//	//解密
//	strcpy(Cipher_Text,Plain_Text);
//	strcpy(Key,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
//	Des_Decrypt(Cipher_Text,Key);
//
//	//三重DES算法
//	strcpy(Plain_Text,"\x10\x11\x12\x13\x14\x15\x16\x17");
//	strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
//	strcpy(Key2,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
//	Des_Third_Encrypt(Plain_Text,Key,Key2);
//
//	strcpy(Key,"\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f");
//	strcpy(Key2,"\x1a\x2b\x3c\x4d\x5e\x6f\x70\x81");
//	Des_Third_Decrypt(Plain_Text,Key,Key2);
//
//    while(1);
//}
/*        ===  测试用的数据  ===

明文:{0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17}
密钥:{0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f}
密文:{0x9a,0xf9,0xfa,0xf0,0x59,0x9c,0x04,0xf0}

明文:{0x12,0x34,0x56,0x78,0xab,0xcd,0xef,0x01}
密钥:{0x1a,0x2b,0x3c,0x4d,0x5e,0x6f,0x70,0x81}
密文:{0xF8,0x2B,0x1A,0x92,0xF4,0xDA,0xD5,0xE4}

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -