Red de conocimiento informático - Material del sitio web - Cómo implementar el algoritmo 3DES en lenguaje C...

Cómo implementar el algoritmo 3DES en lenguaje C...

/Función: Implementar algoritmos de cifrado y descifrado DES y 3DES

#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;

}