Escribir programa de cifrado en lenguaje c
#include
#include "global.h"
#include "md5.h"
#definir S11 7
#definir S12 12
#definir S13 17
#definir S14 22
#definir S21 5
#definir S22 9
#definir S23 14
#definir S24 20
#definir S24 20 p>p>
#definirS31 4
#definir S32 11
#definir S33 16
#definir S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
static void MD5Transform PROTO_LIST (( UINT4 [ 4], carácter sin firmar
[64]));
codificación estática vacía PROTO_LIST
((carácter sin signo *, UINT4 *, int sin signo) );
static void Decodificar PROTO_LIST
((UINT4 *, unsigned char *, unsigned int));
static void MD5_memcpy PROTO_LIST ((POINTER, POINTER) , unsigned
int));
static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
static unsigned char PADDING[64] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0 , 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#define F(x, y, z) (((x) & (y))| ((~x) & (z )))
#define G( x, y, z) (((x) & (z)))| ((y) & (~z)))
#definir H(x, y, z) ((x) ^ (y) ^ (z))
#definir I(x, y, z) ((y) ^ ((x ) | (~z)))
#define ROTATE_ LEFT(x,
n) (((x) << (n)))| ((x) >> (32-(n))))
#definir FF(a, b, c, d, x , s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = GIRAR_ IZQUIERDA ((a), (s); )); (a) += (b);}
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac);\
(a) = ROTATE_LEFT ((a), ( s)) ; \
(a) += (b); \
}
#definir HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac);\
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + ( UINT4)(ac);\
(a) = ROTATE_LEFT ((a), (s));
(a) += (b);
}
void MD5Init (contexto)
MD5_CTX *contexto
{
contexto->count[ 0] = contexto->recuento[1] = 0;
contexto->estado[0] = 0x67452301;
contexto->estado[1] = 0xefcdab89;
contexto->estado[2] = 0x98badcfe;
contexto->estado[3] = 0x10325476;
}
void MD5Update (contexto, entrada , inputLen)
MD5_CTX *context;
unsigned char *entrada
unsigned int inputLen
{
unsigned int i, index, partLen;
index = (unsigned int)((context-& gt;count[0] >>3) & 0x3F);
if ((context->count[0] += ((UINT4)inputLen << 3))< ((UINT4)inputLen << 3))
contexto->count[1]++;
contexto->count[1] += ((UINT4)inputLen <<< 29);
partLen = 64 - index;
if ( inputLen <= partLen)
{
MD5_memcpy((PUNTERO)&context->búfer[índice], (PUNTO)entrada, partLen);
MD5Transform (contexto->.state, contexto->búfer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD5Transform (contexto-> estado, & input[i]);
index = 0;
}
else
i = 0;
MD5_memcpy((POINTER)&context->buffer[ index], (POINTER)&input[i],inputLen-i) ;
}
void MD5Final (resumen, contexto)
resumen de caracteres sin firmar[16 ];
MD5_CTX *context;
{
bits de caracteres sin firmar[8 ];
índice int sin signo, padLen; p>
p>
Codificar (bits, contexto->recuento, 8);
índice = (int sin signo)((contexto->recuento[0] >> 3 ) & 0x3f );
padLen = (índice < 56) ?(56 - índice): (120 - índice);
MD5Update (contexto, PADDING, padLen);
MD5Update (contexto, bits, 8);
Codificar (resumen, contexto->.state, 16);
MD5_memset ((POINTER)context, 0, sizeof (* contexto));
}
Transformación estática vacía MD5 (estado UINT4[4], bloque de caracteres sin firmar[64])
{
UINT4 a = estado [0], b = estado[1], c = estado[2], d = estado[3], x[16];
decodificar(x, bloque, 64) ;
FF (a, b, c, d, x[ 0], S11, 0xd76aa478 /* 1 */
FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
FF (c, d, a, b, x[ 2], S13, 0x242070db /* 3 */
FF (b, c, d, a, x[ 3 ], S14, 0xc1bdceee /* 4 */
FF (a, b, c, d, x[ 4 ]); , S11, 0xf57c0faf) ; /* 5 */
FF (d, a, b, c, x[ 5 ], S12, /* 6 */
); FF (c, d, a, b, x
[ 6], S13, 0xa8304613); /* 7 */
FF (b, c, d, a, x[ 7], S14, 0xfd469501 /* 8 */
);FF (a, b, c, d, x[ 8], S11, 0x698098d8 /* 9 */
FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
FF (c, d, a, b, x[ 10], S13, 0xffff5bb1); (b, c, d, a, x[11], S14, 0x895cd7be);/* 12 */
FF (a, b, c, d, x[12], S11, 0x6b901122) ; /* 13 */
FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
FF (c, d) , a, b, x[14], S13, 0xa679438e); /* 15 */
FF (b, c, d, a, x[15], S14, 0x49b40821); */
/* Ronda 2*/
GG (a, b, c, d, x[ 1], S21, 0xf61e2562 /* 17 */ p); >
GG (d, a, b, c, x[ 6], S22, 0xc0404038e S22, 0xc040b340); /* 18 */
GG (c, d, a, b, x) [ 11], S23, 0x265e5a51); /* 19 */
GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa /* 20 */
);GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
GG (d, a, b, c, x[ 10] , S22, 0x2441453); /* 22 */
GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8 /* 24 */
GG (a, b, c, d, x[ 9], S21, 0x21e1cde6 ) ; /* 25 */
GG (d, a, b, c, x[ 14], S22, 0xc33707d6); /* 26 */
GG (c, d) , a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
GG (b, c, d, a, x[ 8], S24, 0x455a14ed); */
GG (a, b, c, d, x[ 13], S21, 0xa9e3e905 /* 29 */
/
GG); (d, a, b, c, x[ 2], S22, 0xfcefa3f8 /* 30 */
GG (c, d, a, b, x[ 7], S23, 0x676f02d9 ) ; /* 31 */
GG (b, c, d, a, x[ 12], S24, 0x8d2a4c8a) /* 3
2 */
/* Ronda 3*/
HH (a, b, c, d, x[ 5], S31, 0xfffa3942 /* 33 */< /); p>
HH (d, a, b, c, x[ 8], S32, 0x8771f681 /* 34 */
HH (c, d, a, b, x[ 11); ], S24, 0x8d2a4c8a); /* 34 */
HG (c, d, a, b, x[ 12], S24, 0x8d2a4c8a) b, x[ 11], S33, 0x6d9d6122); /* 35 */
HH (b, c, d, a, x[ 14], S34, 0xfde5380c /* 36 */
HH (a, b , c, d, x[ 1], S31, 0xa4beea44); /* 37 */
HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /
HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60 /* 39 */
HH (b, c, d, a ,); x[10], S34, 0xbebfbc70); /* 40 */
HH (a, b, c, d, x[13], S31, 0x289b7ec6 /* 41 */ p); >
HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
HH (c, d, a, b, x[ 3 ] , S33, 0xd4ef3085); /* 43 */
HH (b, c, d, a, x[ 6], S34, /* 44 */
); HH (a, b, c, d, x[ 9], S31, 0xd9d4d039 /* 45 */
HH (d, a, b, c, x[ 12], S32, 0xe6db99e5); ); /* 46 */
HH (c, d, a, b, x[ 15], S33, 0x1fa27cf8); /* 47 */
HH (b , c, d, a, x[2], S34, 0xc4ac5665);/* 48 */
/* Ronda 4*/
II (a, b, c , d , x[ 0], S41, 0xf4292244); /* 49 */
II (d, a, b, c, x[ 7], S42, 0x432aff97 /* 50 */ ); p>
II (c, d, a, b, x[ 14], S43, 0xab9423a7 /* 51 */
II (b, c, d, a, x [ 5); ], S44, 0xfc93a039); /* 52 */
II (a, b, c, d, x[ 12], S41, 0x655b59c3 /* 53 */
II (d, a, b, c, x[ 3], S42, 0x8f0ccc92 /* 54 */
II (c, d, a, b, x[ 10], S43, 0xffeff47d); /* 55 */
II (b, c, d, a, x[ 1], S44, 0x85845dd1 /* 56 */
<);p>II (a, b, c, d, x[ 8], S41, 0x6fa87e4f /* 57 */
II (d, a, b, c, x[ 15], S42); , 0xfe2ce6e0); /* 58 */
II (c, d, a, b, x[ 6], S43, 0xa3014314 /* 59 */
II ( b, c, d, a, x[ 13], S44, 0x4e0811a1); /* 60 */
II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
II (d, a, b, c, x[ 11], S42, 0xbd3af235); /* 62 */
II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
II (b, c, d, a, x[ 9], S44, 0xeb86d391); /
estado[0] += a;
estado[1] += b;
estado[2] += c;
estado[3] += d;
MD5_memset ((POINTER)x, 0, tamaño de (x));
}
vacío estático Codificar (salida, entrada, len)
static void Decodificar (salida, entrada, len)
UINT4 *salida;
carácter sin firmar *entrada; p> p>
unsigned int len;
{
unsigned int i, j;
para (i = 0, j = 0; j < len ; i++, j += 4)
salida[i] = ((UINT4)entrada[j])| (((UINT4)entrada[j+1]) < < 8) ( (UINT4 ) entrada[j+2]) << 16)| (((UINT4)entrada[j+3]) << 24);
}
estática void MD5_memcpy (salida, entrada, len)
Salida de PUNTERO;<
Entrada de PUNTERO;
int sin signo len;
{
unsigned int i;
for (i = 0; i < len; i++)
salida[i] = entrada[i];
}
static void MD5_memset (salida, valor, len)
salida de PUNTERO;
valor int;
int sin signo len;
p>
{
unsigned int i;
for (i = 0; i < len; i++)
((char *)salida) [i] = (char)valor;
}
#ifndef MD
#define MD 5
#endif<
p>#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000
static void MDString PROTO_LIST ((char *));
static void MDPrint PROTO_LIST ((unsigned char [16]));
#define MD_CTX MD5_CTX
#define MDInit MD5Init
#define MDUpdate MD5Update
#define MDFinal MD5Final
int main (int argc, char *argv[])
{
int i;
if (argc > 1 )
{ MDString(argv[1]);
return ( 0);
}
}
MDString vacío estático (char *cadena)
{
contexto MD_CTX;
resumen de caracteres sin firmar[16];
sin firmar int len = strlen (cadena);
MDInit (& contexto);
MDUpdate (& contexto, cadena, len
MDFinal); , & contexto);
printf ("MD%d (\"%s\") = ", MD, cadena
MDPrint (resumen
);printf ("\n");
}
MDPrint vacío estático (resumen de caracteres sin firmar[16])
{
unsigned int i;
for (i = 0; i < 16; i++)
printf ("%02x", digest[i]);
}