📄 newddes.c
字号:
/**********************************************************************/
/* */
/* HIGH LEVEL FUNCTION. END //COM */
/* */
/**********************************************************************/
/*===========================*/
#pragma OPTIMIZE(5,SIZE)
#pragma LARGE
#pragma CD PW(76)
/*---------------------------*/
/*---------------------------*/
#include <reg52.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <absacc.h>
#include <intrins.h>
/*------------------------*/
//
//
extern bit b_Temp1 ,b_Temp2 ,b_Temp3 ,b_Temp4 ,b_Temp5 ,b_Temp6 ,b_Temp7 ,b_Temp8 ;
extern bit b_Temp9 ,b_Temp10 ,b_Temp11,b_Temp12 ,b_Temp13 ,b_Temp14 ,b_Temp15 ,b_Temp16 ,b_Temp17;
extern bit b_Temp18 ,b_Temp19 ,b_Temp20 ,b_Temp21 ,b_Temp22 ,b_Temp23 ,b_Temp24 ,b_Temp25 ,b_Temp26 ;
extern bit b_Temp27 ,b_Temp28 ,b_Temp29 ,b_Temp30 ,b_Temp31 ,b_Temp32 ,b_Temp33 ,b_Temp34 ,b_Temp35 ;
extern bit b_Temp36 ,b_Temp37 ,b_Temp38 ,b_Temp39 ,b_Temp40 ,b_Temp41 ,b_Temp42 ,b_Temp43 ,b_Temp44 ;
extern bit b_Temp45 ,b_Temp46 ,b_Temp47 ,b_Temp48 ,b_Temp49 ,b_Temp50 ,b_Temp51 ,b_Temp52 ,b_Temp53 ;
extern bit b_Temp54 ,b_Temp55 ,b_Temp56 ,b_Temp57 ,b_Temp58 ,b_Temp59 ,b_Temp60 ,b_Temp61 ,b_Temp62 ;
extern bit b_Temp63,b_Temp64;
extern bit b_Bit64 ,b_Bit1 ,b_Bit2 ,b_Bit3 ,b_Bit4 ,b_Bit5 ,b_Bit6 ,b_Bit7 ,b_Bit8 ;
extern bit b_Bit9 ,b_Bit10 ,b_Bit11,b_Bit12 ,b_Bit13 ,b_Bit14 ,b_Bit15 ,b_Bit16 ,b_Bit17 ;
extern bit b_Bit18 ,b_Bit19 ,b_Bit20 ,b_Bit21 ,b_Bit22 ,b_Bit23 ,b_Bit24 ,b_Bit25 ,b_Bit26 ;
extern bit b_Bit27 ,b_Bit28 ,b_Bit29 ,b_Bit30 ,b_Bit31 ,b_Bit32 ,b_Bit33 ,b_Bit34 ,b_Bit35 ;
extern bit b_Bit36 ,b_Bit37 ,b_Bit38 ,b_Bit39 ,b_Bit40 ,b_Bit41 ,b_Bit42 ,b_Bit43 ,b_Bit44 ;
extern bit b_Bit45 ,b_Bit46 ,b_Bit47 ,b_Bit48 ,b_Bit49 ,b_Bit50 ,b_Bit51 ,b_Bit52 ,b_Bit53 ;
extern bit b_Bit54 ,b_Bit55 ,b_Bit56 ,b_Bit57 ,b_Bit58 ,b_Bit59 ,b_Bit60 ,b_Bit61 ,b_Bit62 ;
extern bit b_Bit63 ;
extern data unsigned char p_cCharToBit[8],p_cBitToChar[8];
extern idata unsigned char p_cChildKey[96];
extern idata unsigned char p_cChildKey[96];
extern data unsigned char p_cRightInitData[4],p_cLeftInitData[4];
extern data unsigned char p_cExpaindPermutation[6];
extern data unsigned char p_cCompressPermutation[4];
code unsigned char si[8][64] =
{
{14,4 ,13,1 ,2 ,15,11,8 ,3 ,10,6 ,12,5 ,9 ,0 ,7 ,
0 ,15,7 ,4 ,14,2 ,13,1 ,10,6 ,12,11,9 ,5 ,3 ,8 ,
4 ,1 ,14,8 ,13,6 ,2 ,11,15,12,9 ,7 ,3 ,10,5 ,0 ,
15,12,8 ,2 ,4 ,9 ,1 ,7 ,5 ,11,3 ,14,10,0 ,6 ,13},
{15,1 ,8 ,14,6 ,11,3 ,4 ,9 ,7 ,2 ,13,12,0 ,5 ,10,
3, 13,4 ,7 ,15,2 ,8 ,14,12,0 ,1 ,10,6 ,9 ,11,5 ,
0, 14,7 ,11,10,4 ,13,1 ,5 ,8 ,12,6 ,9 ,3 ,2 ,15,
13,8 ,10,1 ,3 ,15,4 ,2 ,11,6 ,7 ,12,0 ,5 ,14,9 },
{10,0 ,9 ,14,6 ,3 ,15,5 ,1 ,13,12,7 ,11,4 ,2 ,8 ,
13,7 ,0 ,9 ,3 ,4 ,6 ,10,2 ,8 ,5 ,14,12,11,15,1 ,
13,6 ,4 ,9 ,8 ,15,3 ,0 ,11,1 ,2 ,12,5 ,10,14,7 ,
1 ,10,13,0 ,6 ,9 ,8 ,7 ,4 ,15,14,3 ,11,5 ,2 ,12},
{7 ,13,14,3 ,0 ,6 ,9 ,10,1 ,2 ,8 ,5 ,11,12,4 ,15,
13,8 ,11,5 ,6 ,15,0 ,3 ,4 ,7 ,2 ,12,1 ,10,14,9 ,
10,6 ,9 ,0 ,12,11,7 ,13,15,1 ,3 ,14,5 ,2 ,8 ,4 ,
3 ,15,0 ,6 ,10,1 ,13,8 ,9 ,4 ,5 ,11,12,7 ,2 ,14},
{2 ,12,4 ,1 ,7 ,10,11,6 ,8 ,5 ,3 ,15,13,0 ,14,9 ,
14,11,2 ,12,4 ,7 ,13,1 ,5 ,0 ,15,10,3 ,9 ,8 ,6,
4 ,2 ,1 ,11,10,13,7 ,8 ,15,9 ,12,5 ,6 ,3 ,0 ,14,
11,8 ,12,7 ,1 ,14,2 ,13,6 ,15,0 ,9 ,10,4 ,5 ,3 },
{12,1 ,10,15,9 ,2 ,6 ,8 ,0 ,13,3 ,4 ,14,7 ,5 ,11,
10,15,4 ,2 ,7 ,12,9 ,5 ,6 ,1 ,13,14,0 ,11,3 ,8 ,
9 ,14,15,5 ,2 ,8 ,12,3 ,7 ,0 ,4 ,10,1 ,13,11,6 ,
4 ,3 ,2 ,12,9 ,5 ,15,10,11,14,1 ,7 ,6 ,0 ,8 ,13},
{4 ,11,2 ,14,15,0 ,8 ,13,3 ,12,9 ,7 ,5 ,10,6 ,1 ,
13,0 ,11,7 ,4 ,9 ,1 ,10,14,3 ,5 ,12,2 ,15,8 ,6 ,
1 ,4 ,11,13,12,3 ,7 ,14,10,15,6 ,8 ,0 ,5 ,9 ,2 ,
6 ,11,13,8 ,1 ,4 ,10,7 ,9 ,5 ,0 ,15,14,2 ,3 ,12},
{13,2 ,8 ,4 ,6 ,15,11,1 ,10,9 ,3 ,14,5 ,0 ,12,7 ,
1 ,15,13,8 ,10,3 ,7 ,4 ,12,5 ,6 ,11,0 ,14,9 ,2 ,
7 ,11,4 ,1 ,9 ,12,14,2 ,0 ,6 ,10,13,15,3 ,5 ,8 ,
2 ,1 ,14,7 ,4 ,10,8 ,13,15,12,9 ,0 ,3 ,5 ,6 ,11}
}; ////////s盒,用于代替运算
code unsigned char sht[] = {
1 ,1 ,2 ,2 ,2 ,2 ,2 ,2 , 1 ,2 ,2 ,2 ,2 ,2 ,2 ,1
};
/************** DES algorithm ****************/
//**************************** des **********************************
unsigned char Des(unsigned char *Key,unsigned char *Source, unsigned char *result,unsigned char IsEncrypt);
unsigned char DesEncrypt(unsigned char *Key,unsigned char *Source, unsigned char *result);
unsigned char DesDecrypt(unsigned char *Key,unsigned char *Source, unsigned char *result);
void InitPermutation(unsigned char *Source,unsigned char *p_cLInitData,unsigned char *p_cRInitData);
void GenerateChildKey(unsigned char *Key,unsigned char *Childkey);
void ExpandPermutation(unsigned char *p_cExpaindPermutation,unsigned char *p_cRightInitData);
void CompressPermutation(unsigned char *p_cCompressPermutation,unsigned char *p_cExpaindPermutation);
void StraigthPermutation(unsigned char *p_cCompressPermutation);
void FinalPermutation(unsigned char *result,unsigned char *p_cRightInitData,unsigned char *p_cLeftInitData);
//**************************************************************************
/*
void send_bytes(unsigned char *sd,unsigned char len)
{
unsigned char record;
for(record=0;record<len;record++)
{
TI=0;
SBUF=sd[record];
while(!TI);
}
}
*/
/////////////////////////////////////////////////////////////////////////////////
unsigned char DesEncrypt(unsigned char *Key,unsigned char *Source, unsigned char *result)
{
return Des(Key,Source,result,1);
}
unsigned char DesDecrypt(unsigned char *Key,unsigned char *Source, unsigned char *result)
{
return Des(Key,Source,result,0);
}
unsigned char Des(unsigned char *Key,unsigned char *Source, unsigned char *result,unsigned char IsEncrypt)
{
unsigned char data i,j,k;
// /**************产生子密钥*****************
GenerateChildKey(Key,p_cChildKey);
// /**************初试置换*******************
InitPermutation(Source,p_cLeftInitData,p_cRightInitData);
for(k=0;k<16;k++)
{
ExpandPermutation(p_cExpaindPermutation,p_cRightInitData);
if(IsEncrypt)j=k;
else j=15-k;
for(i=0;i<6;i++)p_cExpaindPermutation[i]=p_cExpaindPermutation[i]^p_cChildKey[j*6+i];
CompressPermutation(p_cCompressPermutation,p_cExpaindPermutation);
StraigthPermutation(p_cCompressPermutation);
for(i=0;i<4;i++)p_cCompressPermutation[i]^=p_cLeftInitData[i];
for(i=0;i<4;i++)
{
p_cLeftInitData[i]=p_cRightInitData[i];
p_cRightInitData[i]=p_cCompressPermutation[i];
}
}
FinalPermutation(result,p_cRightInitData,p_cLeftInitData);
return 0;
}
void InitPermutation(unsigned char *Source,unsigned char *p_cLInitData,unsigned char *p_cRInitData)
{
memcpy(p_cCharToBit,Source,8);
b_Bit1=b_Temp58;
b_Bit2=b_Temp50;
b_Bit3=b_Temp42;
b_Bit4=b_Temp34;
b_Bit5=b_Temp26;
b_Bit6=b_Temp18;
b_Bit7=b_Temp10;
b_Bit8=b_Temp2;
b_Bit9=b_Temp60;
b_Bit10=b_Temp52;
b_Bit11=b_Temp44;
b_Bit12=b_Temp36;
b_Bit13=b_Temp28;
b_Bit14=b_Temp20;
b_Bit15=b_Temp12;
b_Bit16=b_Temp4;
b_Bit17=b_Temp62;
b_Bit18=b_Temp54;
b_Bit19=b_Temp46;
b_Bit20=b_Temp38;
b_Bit21=b_Temp30;
b_Bit22=b_Temp22;
b_Bit23=b_Temp14;
b_Bit24=b_Temp6;
b_Bit25=b_Temp64;
b_Bit26=b_Temp56;
b_Bit27=b_Temp48;
b_Bit28=b_Temp40;
b_Bit29=b_Temp32;
b_Bit30=b_Temp24;
b_Bit31=b_Temp16;
b_Bit32=b_Temp8;
b_Bit33=b_Temp57;
b_Bit34=b_Temp49;
b_Bit35=b_Temp41;
b_Bit36=b_Temp33;
b_Bit37=b_Temp25;
b_Bit38=b_Temp17;
b_Bit39=b_Temp9;
b_Bit40=b_Temp1;
b_Bit41=b_Temp59;
b_Bit42=b_Temp51;
b_Bit43=b_Temp43;
b_Bit44=b_Temp35;
b_Bit45=b_Temp27;
b_Bit46=b_Temp19;
b_Bit47=b_Temp11;
b_Bit48=b_Temp3;
b_Bit49=b_Temp61;
b_Bit50=b_Temp53;
b_Bit51=b_Temp45;
b_Bit52=b_Temp37;
b_Bit53=b_Temp29;
b_Bit54=b_Temp21;
b_Bit55=b_Temp13;
b_Bit56=b_Temp5;
b_Bit57=b_Temp63;
b_Bit58=b_Temp55;
b_Bit59=b_Temp47;
b_Bit60=b_Temp39;
b_Bit61=b_Temp31;
b_Bit62=b_Temp23;
b_Bit63=b_Temp15;
b_Bit64=b_Temp7;
memcpy(p_cLInitData,p_cBitToChar,4);
memcpy(p_cRInitData,&p_cBitToChar[4],4);
}
void GenerateChildKey(unsigned char *Key,unsigned char *Childkey)
{
data unsigned char i,k;
/*******************************密钥置换*************************************/
memcpy(p_cCharToBit,Key,8);
b_Bit1=b_Temp57;
b_Bit2=b_Temp49;
b_Bit3=b_Temp41;
b_Bit4=b_Temp33;
b_Bit5=b_Temp25;
b_Bit6=b_Temp17;
b_Bit7=b_Temp9;
b_Bit8=b_Temp1;
b_Bit9=b_Temp58;
b_Bit10=b_Temp50;
b_Bit11=b_Temp42;
b_Bit12=b_Temp34;
b_Bit13=b_Temp26;
b_Bit14=b_Temp18;
//////row 2
b_Bit15=b_Temp10;
b_Bit16=b_Temp2;
b_Bit17=b_Temp59;
b_Bit18=b_Temp51;
b_Bit19=b_Temp43;
b_Bit20=b_Temp35;
b_Bit21=b_Temp27;
b_Bit22=b_Temp19;
b_Bit23=b_Temp11;
b_Bit24=b_Temp3;
b_Bit25=b_Temp60;
b_Bit26=b_Temp52;
b_Bit27=b_Temp44;
b_Bit28=b_Temp36;
//////row 3
b_Bit29=b_Temp63;
b_Bit30=b_Temp55;
b_Bit31=b_Temp47;
b_Bit32=b_Temp39;
b_Bit33=b_Temp31;
b_Bit34=b_Temp23;
b_Bit35=b_Temp15;
b_Bit36=b_Temp7;
b_Bit37=b_Temp62;
b_Bit38=b_Temp54;
b_Bit39=b_Temp46;
b_Bit40=b_Temp38;
b_Bit41=b_Temp30;
b_Bit42=b_Temp22;
//////row 4
b_Bit43=b_Temp14;
b_Bit44=b_Temp6;
b_Bit45=b_Temp61;
b_Bit46=b_Temp53;
b_Bit47=b_Temp45;
b_Bit48=b_Temp37;
b_Bit49=b_Temp29;
b_Bit50=b_Temp21;
b_Bit51=b_Temp13;
b_Bit52=b_Temp5;
b_Bit53=b_Temp28;
b_Bit54=b_Temp20;
b_Bit55=b_Temp12;
b_Bit56=b_Temp4;
/*******************************************************************/
/**************************16轮密钥移动*****************************/
for(k=0;k<16;k++)
{
for(i=0;i<sht[k];i++)
{
/************28*2个位左移移位****************************/
b_Bit60=b_Bit1;
b_Bit1=b_Bit2;
b_Bit2=b_Bit3;
b_Bit3=b_Bit4;
b_Bit4=b_Bit5;
b_Bit5=b_Bit6;
b_Bit6=b_Bit7;
b_Bit7=b_Bit8;
b_Bit8=b_Bit9;
b_Bit9=b_Bit10;
b_Bit10=b_Bit11;
b_Bit11=b_Bit12;
b_Bit12=b_Bit13;
b_Bit13=b_Bit14;
b_Bit14=b_Bit15;
b_Bit15=b_Bit16;
b_Bit16=b_Bit17;
b_Bit17=b_Bit18;
b_Bit18=b_Bit19;
b_Bit19=b_Bit20;
b_Bit20=b_Bit21;
b_Bit21=b_Bit22;
b_Bit22=b_Bit23;
b_Bit23=b_Bit24;
b_Bit24=b_Bit25;
b_Bit25=b_Bit26;
b_Bit26=b_Bit27;
b_Bit27=b_Bit28;
b_Bit28=b_Bit60;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -