Cómo implementar el algoritmo 3DES en lenguaje C...
#include
#include
#include
# incluir "des.h"
/declaración de función
int Do_DES(char* strSrc, char* strKey, char* strDest, char bandera );
int Do_3DES(char* strSrc, char* strKey, char* strDest, char bandera);
//función principal
int main( int argc, char** argv)
{
char src16[16+1],key16[16+1],key48[48+1],dest16[16+1 ] ;
if(argc !
{
fprintf(stderr, "Uso: [%s -e|-d s|3]\n", argv [0]);
salir(1);
}
if(strcmp(argv[2],"-s") == 0 )
{
if(strcmp(argv[1],"-e") == 0)
{
fprintf ( stderr, "Ingrese la cadena que desea cifrar (número 16 hexadecimal):\n");
memset(src16,0,sizeof(src16));
scanf ("%s",src16);
fprintf(stderr, "Ingrese la cadena de clave (número hexadecimal de 16):\n");
memset(key16,0 , sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES (src16,key16,dest16,'e' );
fprintf(stderr, "Resultado: [%s]\n",dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr," Ingrese la cadena que desea descifrar ( Número hexadecimal):\n");
memset(src16,0,sizeof(src16));
scanf("%s",src16);
fprintf(stderr, "Ingrese la cadena de clave (número de 16 hexadecimales):\n");
memset(key16,0,sizeof(key16));
scanf("%s",key16);
memset(dest16,0,sizeof(dest16));
Do_DES(src16,key16,dest16,'d'); /p>
fprintf
(stderr, "Resultado:[%s]\n",dest16);
}
else
devuelve -1;
}
else if(strcmp(argv[2],"-3") == 0)
{
if(strcmp(argv[1 ],"-e") == 0)
{
fprintf(stderr, "Ingrese la cadena que desea cifrar (número 16 hexadecimal):\n") ;
memset(src16,0,sizeof(src16));
scanf("%s", src16);
fprintf(stderr, "Por favor ingrese la cadena de clave (número hexadecimal de 16):\n");
memset(key48,0,sizeof(key48));
scanf("%s", key48) ;
memset(dest16,0,sizeof(dest16));
Do_3DES(src16,key48,dest16,'e');
fprintf(stderr , "Resultado: [dest16);
}
else if(strcmp(argv[1],"-d") == 0)
{
fprintf(stderr, "Ingrese la cadena que desea descifrar (número 16 hexadecimal):\n");
memset(src16,0,sizeof(src16)) ;
scanf("%s",src16);
fprintf(stderr, "Ingrese la cadena de clave (número hexadecimal de 16):\n");
fprintf(stderr, "Ingrese la cadena de clave (número de 16 hexadecimales):\n");
memset(key48,0,sizeof(key48));
scanf("%s",key48);
memset(dest16,0,sizeof(dest16));
Do_3DES(src16, key48,dest16,'d');
fprintf(stderr, "Resultado:[%s]\n",dest16);
}
else
return -1 ;
}
más
devuelve -1;
devuelve 0;
}
/ Realizar operación de cifrado o descifrado DES
int Do_DES(char* strSrc, char* strKey, char* strDest, char flag)
{
int i,j;
subclave de carácter unsigned[16][48+1],byte8[8+1],bits[64+1],strTmp[64+1];
carácter sin firmar L0[32+1],R0[32+1],Lx[32+
1],Rx[32+ 1];
if(!( bandera == 'e' || bandera == 'E' || bandera == 'd' || bandera == 'D '))
devuelve -1;
if(strSrc == NULL || strKey == NULL)
devuelve -2;
if(bandera == 'e' || bandera == 'E')
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey, 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits) ;
Des_GenSubKey(bits,subKey);
BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
>Des_IP(bits, strTmp);
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);
for(i=0;i<16;i++)
{
memcpy(Lx,R0,32);
Des_F (R0,subKey[i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+32,L0,32) ;
Des_IP_1(bits,strTmp);
BitToByte(strTmp,64,byte8);
ByteToBCD(byte8,8,strDest);
}
else
{
memset(byte8,0,sizeof(byte8));
BCDToByte(strKey , 16, byte8);
memset(bits,0,sizeof(bits));
ByteToBit(byte8, 8, bits);
Des_GenSubKey(bits,subKey) ;
BCDToByte(strSrc, 16, byte8);
ByteToBit(byte8, 8, bits);
Des_IP(bits, strTmp) ;
memcpy(L0,strTmp,32);
memcpy(R0,strTmp+32,32);
for(i=0 ;i< 16;i++)
{
memcpy(Lx,R0,32);
Des_F(R0,subKey[15-i],Rx);
Do_XOR(L0,32,Rx);
memcpy(L0,Lx,32);
memcpy(R0,Rx,32);
}
memcpy(bits,R0,32);
memcpy(bits+3
2,L0,32);
Des_IP_1(bits,strTmp);
BitToByte( strTmp,64,byte8);
ByteToBCD(byte8,8, strDest);
}
Devuelve 0;
}
//Realizar operación de cifrado o descifrado 3DES
int Do_3DES(char* strSrc, char* strKey, char* strDest, char flag)
{
char unsigned strBCDKey[32+1],strByteKey[16+1];
carácter sin signo strMidDest1[16+1],strMidDest2[16+1];
carácter sin signo strLKey[16+1],strMKey[16+1],strRKey[16+ 1];
if(!( bandera == 'e' || bandera == 'E' || bandera == 'd' || bandera == 'D'))
devolver -1;
if(strSrc == NULL || strKey == NULL)
devolver -2;
if(strlen (strKey ) < 32)
return -3;
if(bandera == 'e' || bandera == 'E')
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy( strBCDKey,strKey,32);
memset(strLKey,0,sizeof(strLKey)) ;
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof( strRKey));
memcpy(strRKey,strBCDKey+16 ,16);
Do_DES(strSrc,strLKey,strMidDest1,'e');
Do_DES(strMidDest1,strRKey, strMidDest2,'d');
Do_DES(strMidDest2,strLKey,strMidDest1,'e');
memcpy(strDest,strMidDest1,16);
}
else
{
memset(strBCDKey,0,sizeof(strBCDKey));
memcpy(strBCDKey,strKey,32);
memset(strLKey,0,sizeof( strLKey));
memcpy(strLKey,strBCDKey,16);
memset(strRKey,0,sizeof(strRKey));
memcpy(strRKey, strBCDKey+16,16);
Do_DES(strSrc,strLKey,strMidDest1, 'd');
Do_DES(strMidDest1,strRKey,strMidDest2,'e');
Do_DES(strM
idDest2,strLKey,strMidDest1,'d');
memcpy(strDest,strMidDest1,16);
}
Devuelve 0;
}