Red de conocimiento informático - Material del sitio web - Cómo cifrar cadenas con MD5, implementado en lenguaje C, proporcionando el código fuente y la función de cifrado

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*/

UINT4 state[4];

/*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

};

/* 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);\

}