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

📄 destest.c

📁 应用于MCS51的DES算法,最小的RAM占用率,只要
💻 C
📖 第 1 页 / 共 3 页
字号:
                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的变换.
            switch( i )
            {   //将数据移到高四位
                case 0: Des_Temp[0]=S_Box_0[l][j]<<4;break;//移位是将CODE中的低四位,变为高四位
                case 1: Des_Temp[1]=S_Box_1[l][j]<<4;break;
                case 2: Des_Temp[2]=S_Box_2[l][j]<<4;break;
                case 3: Des_Temp[3]=S_Box_3[l][j]<<4;break;
                case 4: Des_Temp[4]=S_Box_4[l][j]<<4;break;
                case 5: Des_Temp[5]=S_Box_5[l][j]<<4;break;
                case 6: Des_Temp[6]=S_Box_6[l][j]<<4;break;
                case 7: Des_Temp[7]=S_Box_7[l][j]<<4;break;
            }
        }
        //SETP  6  进行原文的左右边交换,即PlainText_Left<>PlainText_Right
        for(i=0;i<8;i++)    //Left swap Right
        {
        	j=PlainText_Left[i];
        	PlainText_Left[i]=PlainText_Right[i];
        	PlainText_Right[i]=j;
        }
        //SETP  7  按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
        //将置换后所得的数据与现在的右边进或操作,作为新的右边的数据PlainText_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];
            }
            PlainText_Right[i]=PlainText_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]=(PlainText_Right[j]&0xf0)+(PlainText_Right[j+1]>>4);
		Des_Temp[i+4]=(PlainText_Left[j]&0xf0)+(PlainText_Left[j+1]>>4);
		j=j+2;
	}
	//SETP  9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
	//完成后存入 PlainText[0-7].
	for(i=0;i<8;i++)
    {
        PlainText[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)
                PlainText[i]=PlainText[i]|des_bit_map[j];
        }
    }
    //密文返回,放在数组 *plain 当中
    plain=plain-8;
    for(i=0;i<8;i++)
    	*plain++=PlainText[i];
}
void Des_Decrypt(uchar *decrypt,uchar *key)
//入口: 密文放在 *decrypt N=8, 密钥放在 *key N=8
//出口: 返回明文在 *decrypt N=8.
{
	uchar i,j,l,Circle_Number;
    uchar byte_point,bit_point;
    uchar DecryptText[8];	//密文
    uchar SecretKey[8];		//密鈅
    uchar DecryptText_Right[8],DecryptText_Left[8];//左右两个密文
    uchar Des_Temp[8];
    #define RollKey DecryptText	//密文在完成左右变换以后,密文已不再使用.

	for(i=0;i<8;i++)
    {//保存数据
    	DecryptText[i]=*decrypt++;
    	SecretKey[i]=*key++;
    }
//SETP 1 按逆初使换位表IP(-1)进行第一次的变换,变换后的数据为 Des_Temp[0-7]
    for(i=0;i<8;i++)
    {
        Des_Temp[i]=0;
        for(j=0;j<8;j++)
        {
            bit_point=Initial_Permutation[i*8+j];
            byte_point=bit_point/8;
            bit_point=bit_point%8;
            if((DecryptText[byte_point]&des_bit_map[bit_point])!=0)
                Des_Temp[i]=Des_Temp[i]|des_bit_map[j];
        }
    }
    //SETP 2
    //将 Des_Temp[0-7]当中 8*8 的数据变换为左右两个 8*4 ,
    //放在 DecryptText_Right[0-7] 与 DecryptText_Left [0-7]当中
    for(i=0,j=0;i<8;i++)  //8个四位二进制
    {
        DecryptText_Left[i]=Des_Temp[j];
        i++;
        DecryptText_Left[i]=Des_Temp[j]<<4;
        j++;
    }
    for(i=0,j=4;i<8;i++)
    {
        DecryptText_Right[i]=Des_Temp[j];
        i++;
        DecryptText_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(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 对密钥进行变换,完成后存于 RollKey[0-7]当中
        //其有效数位为 8*6
        for(i=0;i<8;i++)
        {
            RollKey[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)
                    RollKey[i]=RollKey[i]|des_bit_map[j];
            }
        }
        //SETP 3  按扩充函数,对原文的右边 DecryptText_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((DecryptText_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) 与活动密钥 RollKey[0-7] 进行位或操作
        for(i=0;i<8;i++)
            Des_Temp[i]=Des_Temp[i]^RollKey[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  进行原文的左右边交换,即PlainText_Left<>PlainText_Right
        for(i=0;i<8;i++)    //Left swap Right
        {
        	j=DecryptText_Left[i];
        	DecryptText_Left[i]=DecryptText_Right[i];
        	DecryptText_Right[i]=j;
        }
        //SETP  7  按换位函数P对替代盒中输出的数据 Des_Temp[0-7]数据进行一次置换
        //将置换后所得的数据与现在的右边进或操作,作为新的右边的数据PlainText_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];
            }
            DecryptText_Right[i]=DecryptText_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]=(DecryptText_Right[j]&0xf0)+(DecryptText_Right[j+1]>>4);
		Des_Temp[i+4]=(DecryptText_Left[j]&0xf0)+(DecryptText_Left[j+1]>>4);
		j=j+2;
	}
	//SETP  9 按逆初使置换表进行第二次的变换,变换后的数据为即为DES的输出密文
	//完成后存入 PlainText[0-7].
	for(i=0;i<8;i++)
    {
        DecryptText[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)
                DecryptText[i]=DecryptText[i]|des_bit_map[j];

        }
    }
    //密文返回,放在数组 *plain 当中
    decrypt=decrypt-8;
    for(i=0;i<8;i++)
    	*decrypt++=DecryptText[i];
}

#define      Encrypt	0
#define		 Decrypt	1
void Des_Encrypt_Decrypt(uchar *Input,uchar *key,uchar mode)//DES算法
//入口: 明文放在 *Input N=8, 密钥放在 *key N=8
//      Mode=1 解密   Mode=0加密
//出口: 返回密文在 *Input N=8.
{
    uchar i,j,l,Circle_Number;
    uchar byte_point,bit_point;
    uchar InputText[8];//明文
    uchar SecretKey[8];//密鈅
    uchar InputText_Right[8],InputText_Left[8];//左右两个明文
    uchar Des_Temp[8];
    //#define Roll_key InputText	//明文在完成左右变换以后,原文已不再使用
    uchar Roll_key[8];

    for(i=0;i<8;i++)
    {//保存数据
    	InputText[i]=*Input++;
    	SecretKey[i]=*key++;
    }
    //SETP 1 按初使置换表进行第一次的变换,变换后的数据为 Des_Temp[0-7]
    for(i=0;i<8;i++)
    {
        Des_Temp[i]=0;
        for(j=0;j<8;j++)
        {
            bit_point=Initial_Permutation[i*8+j];
            byte_point=bit_point/8;
            bit_point=bit_point%8;
            if((InputText[byte_point]&des_bit_map[bit_point])!=0)

⌨️ 快捷键说明

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