Cómo cifrar cadenas con MD5, implementado en lenguaje C, proporcionando el código fuente y la función de cifrado
#include
#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 S31 4
#definir S32 11
#definir S33 16
#definir S34 23
#definir S41 6
#definir S42 10
#definir S43 15
#definir S44 21
#definir R_memset (x, y, z) memset(x, y, z)
#define R_memcpy(x, y, z) memcpy(x, y, z)
#define R_memcmp (x, y, z) memcmp(x, y, z)
typedef unsigned long UINT4;
typedef unsigned char *POINTER;
typedef struct {
/*Se utilizan cuatro números de 32 bits para almacenar el resumen del mensaje calculado final. Cuando la longitud del mensaje es >512 bits, también se utilizan para almacenar los resultados intermedios de cada 512 bits*/
/*La longitud del número de bits para almacenar la información original, excluyendo los bits de relleno, el máximo es 2^64 bits*/
UINT4 count[2] ;
/*Buffer para almacenar información de entrada, 512 bits*/
buffer de caracteres sin firmar[64];
} MD5_CTX;
static void MD5Transform(UINT4[4], unsigned char[64]);
static void Encode(unsigned char *, UINT4 *, unsigned int);
static void Decode (UINT4 *, unsigned char *, unsigned int);
/*
Buffer utilizado para el llenado de bits cuando el número de bits de la información a cifrar se divide por. 512, el resto es 448, el valor máximo de bits que deben completarse es 512=64*8*/
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
}; p>
/* Las siguientes definiciones de macros están estipuladas por el algoritmo md5, que son las operaciones requeridas para el cifrado de información md5*/
#define F(x, y, z) (( (incógnita)
& (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))))
#define FF(a, b, c, d, x, s, ac) {\
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac);\
(a) = ROTATE_LEFT ((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);\
}
#define HH( a, b, c, d, x, s, ac) {\
(a) += H ((b), (c), (d)) + (x) + (UINT4) (ac);\
(a) = ROTATE_LEFT ((a), (s));\
(a) += (b);\
}
#define II(a, b, c, d, x, s, ac) {\
(a) += I ((b), (c ), (d)) + (x) + (UINT4)(ac);\
(a) = ROTATE_LEFT ((a), (s));\
( a) += (b);\
}