Red de conocimientos turísticos - Conocimientos sobre calendario chino - Código fuente del algoritmo de codificación

Código fuente del algoritmo de codificación

¿Necesita código o documentación relacionada?

-

Para codificar:

Dos archivos:

-

1.md5.h:

#Pragma once

typedef unsigned long UINT32

typedef unsigned short uint 16;

/* contexto MD5.

*/

estructura typedef {

estado UINT32 [4]; /* estado (ABCD) */

recuento UINT32 [2]; dígitos, módulo 2^64 (lsb primero)*/

Búfer de caracteres sin firmar [64]; /*Búfer de entrada*/

} MD5 _ CTX;

void MD5 init(MD5 _ CTX *);

void MD5Update (MD5_CTX *, unsigned char *, unsigned int);

void MD5 final(unsigned char[ 16], MD5_CTX *);

-

2.md5.cpp:

#Contiene "md5.h"

#Contiene "memoria. h"

#Definición S11 7

#Definición S12 12

#Definición S13 17

#Definición S14 22

#Definición S21 5

#Definición S22 9

#Definición S23 14

#Definición S24 20

#Definición S31 4

#Definición S32 11

#Definición S33 16

#Definición S34 23

#definir S41 6

#Definición S42 10

#Definición S43 15

#Definición S44 21

Vaciación estática MD5Transform (UINT32 a[4], carácter sin firmar b[64 ]);

Codificación nula estática (unsigned char *, UINT32 *, unsigned int);

Decodificación estática nula (UINT32 *, unsigned char *, unsigned int);

Relleno de caracteres estáticos sin signo [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

};

#Definición F(x, y, z)(( (x) amp; (y)) |((~ x) amp; (z)))

#Definición G(x, y, z) (((x) amp; (z)) |((y) amp; (~ z)))

#Definición H(x, y, z) ((x) ^ (y) ^ (z))

#definir I(x, y, z ) ((y) ^ ((x) | (~z)))

#define ROTATE_LEFT(x, n)(((x) lt; lt( n)) | ((x)> gt(32-(n))))

#Definición FF(a, b, c, d, x, s, ac) { \

(a) = F ( (b), (c), (d)) (x) (uint 32)(AC); \

(a) = ROTATE_LEFT ((a), (s));\

(a) =(b);\

}

#Definición GG(a, b, c, d, x , s, ac) { \

(a) = G ((b), (c), (d)) (x) (uint 32)(AC);

(a) = ROTATE_LEFT ((a), (s) );\

(a) =(b);\

}

#Definición HH(a, b, c, d, x, s, ac) { \

(a) = H ((b), (c), (d)) (x) (uint 32)(AC); ) = ROTATE_LEFT ((a), (s));\

(a) =(b);\

}

#Definición II(a , b, c, d, x, s, ac) { \

(a) = I ((b), (c), (d)) (x) (uint 32)(AC) ;\

(a) = ROTATE_LEFT ((a), (s));\

(a) =(b);\

}

void MD5 init(MD5 _ CTX *contexto)

{

Contexto->;count[0] = contexto->count[1]= 0;

Contexto->;estado[0]= 0x 67452301;

Contexto->;estado[1]= 0x efcdab 89;

Contexto->; estado[2]= 0x 98 cfe incorrecto;

Contexto->; estado[3]= 0x 10325476;

}

actualización nula de MD5(MD5 _ CTX *contexto, entrada de carácter sin signo*, entrada de entero sin signo)

{

unsigned int i, index, partLen

index = (unsigned int )(( contexto- gt; recuento[0] gt; gt3) amp; 0x3F);

if((context- gt; recuento[0] =((uint 32)entrada len ​​lt; lt3) )

lt((uint 32)input len ​​​​lt; lt3))

Contexto->cuenta[1];

Contexto->cuenta[ 1 ] =((uint 32)input len ​​​​gt; gt29);

part len ​​= 64-index;

if(input len ​​​​gt; = partLen) {

memcpy((unsigned char *) & contexto->búfer[índice], (unsigned char *)entrada, partLen);

MD5Transform(context-gt; estado, contexto -gt ;buffer);

for(I = part len;I 63 lt;inputLeni = 64)

MD5Transform(context-gt;state amp input[I]);

Índice = 0;

}

Otro

I = 0;

memcpy((carácter sin firmar* ) amp; contexto->búfer[índice], (carácter sin firmar *) entrada[i],

entrada len-I

}

< p); > anular MD5Final (ninguno

Resumen de caracteres firmados[16], MD5_CTX * contexto)

{

Bits de caracteres sin firmar[8];

Índice int sin signo, padLen

codificación(bits, contexto->recuento, 8);

índice = (int sin signo)((context-gt;recuento[0]gt;gt3) & 0x3f);

padLen =(index lt; 56) ?(56 - índice): (120 - índice);

MD5Update (contexto, PADDING, padLen);

MD5Update(contexto, bits, 8);

codificación(abstracto, contexto->estado, 16

memset((unsigned char *)context, 0, sizeof( * context));

}

MD5Transform vacío estático (estado UINT32 [4], bloque de caracteres sin firmar [64])

{

UINT32 a = estado [0], b = estado[1], c = estado[2], d = estado[3], x[16];

Decodificar(x, bloque, 64);

/* Ronda 1 */

FF (a, b, c, d, x[ 0], S11, 0x d 76 a 478 /* 1 */

<) p>FF (d, a, b, c, x[1], S12, 0x e 8 c 7 b 756); x[2],S13,0x 242070 db);/* 3 */

FF (b,c,d,a,x[3],S14,0xc 1 BDC eee); */

FF (a, b, c, d, x[4], S11, 0 xf 57 c 0 faf /* 5 */

FF (d, a, b, c, x[ 5], S12, 0x 4787 c62a /* 6 */

FF (c, d, a, b, x[ 6 ], S13, 0xa 8304613) ; /* 7 */

FF (b, c, d, a, x[ 7], S14, 0x FD 469501); /* 8 */

FF (a); , b, c, d, x[ 8], S11, 0x 698098 D8 /* 9 */

FF (d, a, b, c, x[ 9], S12, 0x8b 44); f 7 af); /* 10 */

FF (c, d, a, b, x[10], S13, 0x ffff 5b b 1);

FF (b, c, d, a, x[11], S14, 0x 895 CD 7 be /* 12 */

FF (a, b, c, d, x); [12], S11, 0x6b 901122); /* 13 */

FF (d, a, b, c, x[13], S12, 0x FD 987193) /* 14 */<; /p>

FF (c, d, a, b, x[14], S13, 0xa 679438 e /* 15 */

FF (b , c, d, a,); x[15], S14, 0x49b 40821); /* 16 */

/*Segunda ronda*/

GG (a, b, c, d, x[1] , S21, 0xf 61e 2562);/

* 17 */

GG (d, a, b, c, x[6], S22, 0xc 040 b 340); /* 18 */

GG (c, d, a, b, x[11], S23, 0x 265 e5a 51 /* 19 */

GG (b, c, d, a, x[ 0], S24, 0x e); 9 b 6 c 7 aa); /* 20 */

GG (a, b, c, d, x[5], S21, 0x d 62 f 105d); /p>

GG (d, a, b, c, x[10], S22, 0x 2441453 /* 22 */

GG (c, d, a, b, x); [15], S23, 0xd8a 1e 681); /* 23 */

GG (b, c, d, a, x[ 4], S24, 0x e 7 D3 FBC 8); 24 */

GG (a, b, c, d, x[9], S21, 0x 21e 1 CDE 6); /* 25 */

GG (d, a, b, c, x[14], S22, 0xc 33707d 6); /* 26 */

GG (c, d, a, b, x[3], S23, 0x f 4d); 50d 87); /* 27 */

GG (b, c, d, a, x[8], S24, 0x 455 a 14ed); >GG (a, b, c, d, x[13], S21, 0x a 9 e 3 e 905 /* 29 */

GG (d, a, b, c, x); [2], S22, 0x fcefa 3 f 8); /* 30 */

GG (c, d, a, b, x[ 7], S23, 0x 676 f02d 9); 31 */

GG (b, c, d, a, x[12], S24, 0x 8d 2 a4 c 8 a); Tercera ronda */

HH (a, b, c, d, x[5], S31, 0x fffa 3942 /* 33 */

HH (d, a); , b, c, x[8], S32, 0x 8771f 681 /* 34 */

HH (c, d, a, b, x[11], S33, 0x6d 9d 6122 ) ; /* 35 */

HH (b, c, d, a, x[14], S34, 0x FDE 5380 c); /* 36 */

HH ( a, b, c, d, x[ 1], S31, 0x a4 beea 44 /* 37 */

HH (d, a, b, c, x[ 4], S32 , 0x 4 bdecfa 9); /* 38 */

HH (c, d, a, b, x[7], S33, 0 xf 6 bb 4b 60); p>

HH (b, c, d, a, x[10], S34, 0x befbc 70 /* 40 */

HH (a, b, c, d, x); [13], S31, 0x 289 b 7 EC 6); /* 41 */

HH (d, a, b, c, x[ 0], S32, 0x EAA 127 fa/); * 42 */

HH (c, d, a, b, x[3], S33, 0x d4ef 3085); /* 43 */

HH (b, c) ,d,a

, x[ 6], S34, 0x 4881d 05); /* 44 */

HH (a, b, c, d, x[ 9], S31, 0x d 9d 4d 039); * 45 */

HH (d, a, b, c, x[12], S32, 0x e 6 db 99 e 5); (c, d, a, b, x[15], S33, 0x 1fa 27 cf 8 /* 47 */

HH (b, c, d, a, x[ 2], S34, 0x C4 AC 5665); /* 48 */

/*Ronda 4*/

II (a, b, c, d, x[ 0], S41, 0xf 4292244); /* 49 */

II (d, a, b, c, x[7], S42, 0x 432 aff 97); >II (c, d, a, b, x[14], S43, 0x ab 9423 a 7 /* 51 */

II (b, c, d, a, x[ 5); ], S44, 0x fc 93 a 039); /* 52 */

II (a, b, c, d, x[12], S41, 0x 655 b 59 c 3); 53 */

II (d, a, b, c, x[3], S42, 0x 8 f 0 CCC 92); , d, a, b, x[10], S43, 0x ffeff 47d /* 55 */

II (b, c, d, a, x[ 1], S44, 0x 85845); DD 1); /* 56 */

II (a, b, c, d, x[8], S41, 0x 6 fa 87 e4f); p>II (d, a, b, c, x[15], S42, 0 xfe 2 ce 6 e 0 /* 58 */

II (c, d, a, b , x[6], S43, 0xa 3014314); /* 59 */

II (b, c, d, a, x[13], S44, 0x4e 0811a 1);

II (a, b, c, d, x[4], S41, 0xf 7537 e82 /* 61 */

II (d, a, b, c); , x[11], S42, 0x BD 3 af 235); /* 62 */

II (c, d, a, b, x[2], S43, 0x 2 ad 7d 2 bb ); /* 63 */

II (b, c, d, a, x[9], S44, 0 xeb 86d 391); [0] = a;

estado[1] = b;

estado[2] = c;

estado[3] = d;< / p>

memset((unsigned char *)x, 0, sizeof(x));

}

Codificación nula estática (unsigned char * salida, UINT32 *entrada, unsigned int len)

{

Unsigned int i, j

for (i = 0, j = 0; j ltleni, j = 4) {

salida[j] = (carácter sin firmar)(entrada[I] amp; 0x ff);

salida[

j 1] = (carácter sin firmar) ((entrada[I] gt; gt8) amp; 0x ff

salida[j 2] = (carácter sin firmar) ((entrada[I] gt ; gt16); ); 0x ff);

salida[j 3] = (carácter sin firmar) ((entrada[I] gt; gt24) amp; 0x ff); >

}

Decodificación de vacío estático (UINT32 *salida, entrada *unsigned char, unsigned int len)

{

Ninguno Símbolo int i, j ;

for (i = 0, j = 0; j ltleni, j = 4)

salida[I]=((uint 32)entrada[j ])|(( (uint 32)entrada[j 1]) lt; lt8) |

(((uint 32)entrada[j 2]) lt; lt16)|(((uint 32) entrada[j 3] ) lt; lt24);

}

-

Sólo estos dos documentos. Cuando los use, agréguelos al proyecto o archivo MAKE e incluya md5.h al llamar. Para un ejemplo simple, ingrese una cadena y luego calcule su valor md5 de salida. La prueba pasa bajo VC6.0 y GCC4.4:

# include ltstdio.h gt

# include. ltstring.h gt

#Include "md5.h"

int main()

{

char tmp[128];

Resumen de caracteres sin firmar[16];

Contexto MD5_CTX;

scanf("s ", tmp);

MD5 init( amp; contexto);

actualización de MD 5 (amp; contexto, (carácter sin firmar*)tmp, strlen(tmp)); >

printf(" Valor MD 5: ");

for(int I = 0; i lt16; i)

{

printf( "02X ",digest[I]);

}

printf("\n");

Devuelve 0;

p>

}

onocimientos turísticos All Rights Reserved.