#include <stdio.h>
//main function
#define leftrotate(x,n) (((x) << (n)) | ((x) >> (32 - (n))))
#define F(A,B,C,D,F,TEMP,W,I,G) (F) = (D) ^ ((B) & ((C) ^ (D))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);
#define G(A,B,C,D,F,TEMP,W,I,G) (F) = (C) ^ ((D) & ((B) ^ (C))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);
#define H(A,B,C,D,F,TEMP,W,I,G) (F) = (B) ^ (C) ^ (D); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);
#define I(A,B,C,D,F,TEMP,W,I,G) (F) = (C) ^ ((B) | ~(D)); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I + (W)[(G)] , R##I); (A) = (TEMP);
#define FF(A,B,C,D,F,TEMP,W,I) (F) = (D) ^ ((B) & ((C) ^ (D))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);
#define GG(A,B,C,D,F,TEMP,W,I) (F) = (C) ^ ((D) & ((B) ^ (C))); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);
#define HH(A,B,C,D,F,TEMP,W,I) (F) = (B) ^ (C) ^ (D); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);
#define II(A,B,C,D,F,TEMP,W,I) (F) = (C) ^ ((B) | ~(D)); (TEMP) = (D); (D) = (C); (C) = (B); (B) = (B) + leftrotate((A) + (F) + K##I, R##I); (A) = (TEMP);
//Initialize variables:
#define H0 0x67452301
#define H1 0xEFCDAB89
#define H2 0x98BADCFE
#define H3 0x10325476
//k[i] := floor(abs(sin(i + 1)) × (2 pow 32))
#define K0 0xd76aa478
#define K1 0xe8c7b756
#define K2 0x242070db
#define K3 0xc1bdceee
#define K4 0xf57c0faf
#define K5 0x4787c62a
#define K6 0xa8304613
#define K7 0xfd469501
#define K8 0x698098d8
#define K9 0x8b44f7af
#define K10 0xffff5bb1
#define K11 0x895cd7be
#define K12 0x6b901122
#define K13 0xfd987193
#define K14 0xa679438e
#define K15 0x49b40821
#define K16 0xf61e2562
#define K17 0xc040b340
#define K18 0x265e5a51
#define K19 0xe9b6c7aa
#define K20 0xd62f105d
#define K21 0x02441453
#define K22 0xd8a1e681
#define K23 0xe7d3fbc8
#define K24 0x21e1cde6
#define K25 0xc33707d6
#define K26 0xf4d50d87
#define K27 0x455a14ed
#define K28 0xa9e3e905
#define K29 0xfcefa3f8
#define K30 0x676f02d9
#define K31 0x8d2a4c8a
#define K32 0xfffa3942
#define K33 0x8771f681
#define K34 0x6d9d6122
#define K35 0xfde5380c
#define K36 0xa4beea44
#define K37 0x4bdecfa9
#define K38 0xf6bb4b60
#define K39 0xbebfbc70
#define K40 0x289b7ec6
#define K41 0xeaa127fa
#define K42 0xd4ef3085
#define K43 0x04881d05
#define K44 0xd9d4d039
#define K45 0xe6db99e5
#define K46 0x1fa27cf8
#define K47 0xc4ac5665
#define K48 0xf4292244
#define K49 0x432aff97
#define K50 0xab9423a7
#define K51 0xfc93a039
#define K52 0x655b59c3
#define K53 0x8f0ccc92
#define K54 0xffeff47d
#define K55 0x85845dd1
#define K56 0x6fa87e4f
#define K57 0xfe2ce6e0
#define K58 0xa3014314
#define K59 0x4e0811a1
#define K60 0xf7537e82
#define K61 0xbd3af235
#define K62 0x2ad7d2bb
#define K63 0xeb86d391
//R specifies the per-round shift amounts
#define R0 7
#define R1 12
#define R2 17
#define R3 22
#define R4 7
#define R5 12
#define R6 17
#define R7 22
#define R8 7
#define R9 12
#define R10 17
#define R11 22
#define R12 7
#define R13 12
#define R14 17
#define R15 22
#define R16 5
#define R17 9
#define R18 14
#define R19 20
#define R20 5
#define R21 9
#define R22 14
#define R23 20
#define R24 5
#define R25 9
#define R26 14
#define R27 20
#define R28 5
#define R29 9
#define R30 14
#define R31 20
#define R32 4
#define R33 11
#define R34 16
#define R35 23
#define R36 4
#define R37 11
#define R38 16
#define R39 23
#define R40 4
#define R41 11
#define R42 16
#define R43 23
#define R44 4
#define R45 11
#define R46 16
#define R47 23
#define R48 6
#define R49 10
#define R50 15
#define R51 21
#define R52 6
#define R53 10
#define R54 15
#define R55 21
#define R56 6
#define R57 10
#define R58 15
#define R59 21
#define R60 6
#define R61 10
#define R62 15
#define R63 21
//main modular integer
#define G0 0
#define G1 1
#define G2 2
#define G3 3
#define G4 4
#define G5 5
#define G6 6
#define G7 7
#define G8 8
#define G9 9
#define G10 10
#define G11 11
#define G12 12
#define G13 13
#define G14 14
#define G15 15
#define G16 1
#define G17 6
#define G18 11
#define G19 0
#define G20 5
#define G21 10
#define G22 15
#define G23 4
#define G24 9
#define G25 14
#define G26 3
#define G27 8
#define G28 13
#define G29 2
#define G30 7
#define G31 12
#define G32 5
#define G33 8
#define G34 11
#define G35 14
#define G36 1
#define G37 4
#define G38 7
#define G39 10
#define G40 13
#define G41 0
#define G42 3
#define G43 6
#define G44 9
#define G45 12
#define G46 15
#define G47 2
#define G48 0
#define G49 7
#define G50 14
#define G51 5
#define G52 12
#define G53 3
#define G54 10
#define G55 1
#define G56 8
#define G57 15
#define G58 6
#define G59 13
#define G60 4
#define G61 11
#define G62 2
#define G63 9
int main() {
unsigned int i, f, temp, msglen, w[5] = {0};
char *msg = (char*)w;
unsigned int h[4], a[4];
msg[0] = 'a';
msglen = 1;
msg[msglen] = 0x80;
msg[16] = msglen * 8;
a[0]= h[0] =H0;
a[1]= h[1] =H1;
a[2]= h[2] =H2;
a[3]= h[3] =H3;
//round1 0 ~ 15
F(a[0],a[1],a[2],a[3],f,temp,w,0,G0);
F(a[0],a[1],a[2],a[3],f,temp,w,1,G1);
F(a[0],a[1],a[2],a[3],f,temp,w,2,G2);
F(a[0],a[1],a[2],a[3],f,temp,w,3,G3);
FF(a[0],a[1],a[2],a[3],f,temp,w,4);
FF(a[0],a[1],a[2],a[3],f,temp,w,5);
FF(a[0],a[1],a[2],a[3],f,temp,w,6);
FF(a[0],a[1],a[2],a[3],f,temp,w,7);
FF(a[0],a[1],a[2],a[3],f,temp,w,8);
FF(a[0],a[1],a[2],a[3],f,temp,w,9);
FF(a[0],a[1],a[2],a[3],f,temp,w,10);
FF(a[0],a[1],a[2],a[3],f,temp,w,11);
FF(a[0],a[1],a[2],a[3],f,temp,w,12);
FF(a[0],a[1],a[2],a[3],f,temp,w,13);
F(a[0],a[1],a[2],a[3],f,temp,w,14,4);// **
FF(a[0],a[1],a[2],a[3],f,temp,w,15);
//round2 16 ~ 31
G(a[0],a[1],a[2],a[3],f,temp,w,16,G1); // 1
GG(a[0],a[1],a[2],a[3],f,temp,w,17);
GG(a[0],a[1],a[2],a[3],f,temp,w,18);
G(a[0],a[1],a[2],a[3],f,temp,w,19,G0); // 0
GG(a[0],a[1],a[2],a[3],f,temp,w,20);
GG(a[0],a[1],a[2],a[3],f,temp,w,21);
GG(a[0],a[1],a[2],a[3],f,temp,w,22);
GG(a[0],a[1],a[2],a[3],f,temp,w,23);
GG(a[0],a[1],a[2],a[3],f,temp,w,24);
G(a[0],a[1],a[2],a[3],f,temp,w,25,4); // **
G(a[0],a[1],a[2],a[3],f,temp,w,26,G3); // 3
GG(a[0],a[1],a[2],a[3],f,temp,w,27);
GG(a[0],a[1],a[2],a[3],f,temp,w,28);
G(a[0],a[1],a[2],a[3],f,temp,w,29,G2); //2
GG(a[0],a[1],a[2],a[3],f,temp,w,30);
GG(a[0],a[1],a[2],a[3],f,temp,w,31);
//round3 32 ~ 47
HH(a[0],a[1],a[2],a[3],f,temp,w,32);
HH(a[0],a[1],a[2],a[3],f,temp,w,33);
HH(a[0],a[1],a[2],a[3],f,temp,w,34);
H(a[0],a[1],a[2],a[3],f,temp,w,35,4);
H(a[0],a[1],a[2],a[3],f,temp,w,36,G1); // 1
HH(a[0],a[1],a[2],a[3],f,temp,w,37);
HH(a[0],a[1],a[2],a[3],f,temp,w,38);
HH(a[0],a[1],a[2],a[3],f,temp,w,39);
HH(a[0],a[1],a[2],a[3],f,temp,w,40);
H(a[0],a[1],a[2],a[3],f,temp,w,41,G0); // 0
H(a[0],a[1],a[2],a[3],f,temp,w,42,G3); // 3
HH(a[0],a[1],a[2],a[3],f,temp,w,43);
HH(a[0],a[1],a[2],a[3],f,temp,w,44);
HH(a[0],a[1],a[2],a[3],f,temp,w,45);
HH(a[0],a[1],a[2],a[3],f,temp,w,46);
H(a[0],a[1],a[2],a[3],f,temp,w,47,G2); // 2
//round4 48 ~ 63
I(a[0],a[1],a[2],a[3],f,temp,w,48,G0); // 0
II(a[0],a[1],a[2],a[3],f,temp,w,49);
I(a[0],a[1],a[2],a[3],f,temp,w,50,4); // **
II(a[0],a[1],a[2],a[3],f,temp,w,51);
II(a[0],a[1],a[2],a[3],f,temp,w,52);
I(a[0],a[1],a[2],a[3],f,temp,w,53,G3); // 3
II(a[0],a[1],a[2],a[3],f,temp,w,54);
I(a[0],a[1],a[2],a[3],f,temp,w,55,G1); //1
II(a[0],a[1],a[2],a[3],f,temp,w,56);
II(a[0],a[1],a[2],a[3],f,temp,w,57);
II(a[0],a[1],a[2],a[3],f,temp,w,58);
II(a[0],a[1],a[2],a[3],f,temp,w,59);
II(a[0],a[1],a[2],a[3],f,temp,w,60);
II(a[0],a[1],a[2],a[3],f,temp,w,61);
I(a[0],a[1],a[2],a[3],f,temp,w,62,G2); // 2
II(a[0],a[1],a[2],a[3],f,temp,w,63);
h[0] += a[0];
h[1] += a[1];
h[2] += a[2];
h[3] += a[3];
printf("%s\n", msg);
printf("%x " ,h[0]);
printf("%x " ,h[1]);
printf("%x " ,h[2]);
printf("%x " ,h[3]);
}
평가점..