#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* padding_(char* str, unsigned int* b_len) {
unsigned int len = (*b_len) * 8;//Get the number of bits.
unsigned long long len_b = len;
unsigned int temp = (len) % 512;
unsigned int pad = (512 + 448 - temp) % 512;//
unsigned int t1 = (len + pad) / 8;
char* buffer = (char*)malloc(t1 + 8);
if (buffer == NULL) {
printf("申请内存空间失败\n");
return NULL;
}
else {
memset(buffer, 0, t1 + 8);//内存置0
memcpy(buffer, str, len / 8);//将字符串复制到缓冲区
buffer[len / 8] = 0x80;//置1
*(unsigned long long*)(buffer + t1) = len_b;
*b_len = (t1 + 8) * 8;//返回比特流长度
printf("调用padding,补位后的长度是:%d\n补位后的16进制:", (t1 + 8) * 8);
for (int i = 0; i < t1 + 8; i++) {
printf("%x", (unsigned char)buffer[i]);
}
printf("\n");
return buffer;
}
}
void Rotate_(unsigned int* a) {
//调整大小端序,即交换顺序
unsigned char* cp = (unsigned char*)a;
unsigned char temp;
temp = cp[3];
cp[3] = cp[0];
cp[0] = temp;
temp = cp[2];
cp[2] = cp[1];
cp[1] = temp;
}
unsigned int LoopShift_(unsigned int data, unsigned int num) {
return (data << num) | (data >> (32 - num));
}
unsigned int T(unsigned int i) {
unsigned long long a = 0xffffffffLL + 1;
double c = fabs(sin(i));
return (unsigned int)(a*c);
}
unsigned int F_(unsigned int x, unsigned int y,unsigned int z) {
return (x & y) | (~x & z);
}
unsigned int G_(unsigned int x, unsigned int y, unsigned int z) {
return (x & z) | (y & ~z);
}
unsigned int H_(unsigned int x, unsigned int y, unsigned int z) {
return (x ^ y ^ z);
}
unsigned int I_(unsigned int x, unsigned int y, unsigned int z) {
return y ^ (x | ~z);
}
void R1_(unsigned int* a, unsigned int b, unsigned int c, unsigned int d, unsigned int k, unsigned int s, unsigned int i) {
unsigned int temp = *a;
unsigned int t = T(i);
temp = temp + F_(b, c, d) + k+t;
temp = LoopShift_(temp, s);
*a = temp + b;
}
void R2_(unsigned int* a, unsigned int b, unsigned int c, unsigned int d, unsigned int k, unsigned int s, unsigned int i) {
unsigned int temp = *a;
unsigned int t = T(i);
temp = temp + G_(b, c, d) + k + t;
temp = LoopShift_(temp, s);
*a = temp + b;
}
void R3_(unsigned int* a, unsigned int b, unsigned int c, unsigned int d, unsigned int k, unsigned int s, unsigned int i) {
unsigned int temp = *a;
unsigned int t = T(i);
temp = temp + H_(b, c, d) + k + t;
temp = LoopShift_(temp, s);
*a = temp + b;
}
void R4_(unsigned int* a, unsigned int b, unsigned int c, unsigned int d, unsigned int k, unsigned int s, unsigned int i) {
unsigned int temp = *a;
unsigned int t = T(i);
temp = temp + I_(b, c, d) + k + t;
temp = LoopShift_(temp, s);
*a = temp + b;
}
void MinorCircle_(unsigned int* a, unsigned int* b, unsigned int* c, unsigned int* d, char* X) {
unsigned int k;
k = *(unsigned int*)((X + 0 * 4));
R1_(a, *b, *c, *d, k, 7,1);
k = *(unsigned int*)((X + 1 * 4));
R1_(d, *a, *b, *c, k, 12,2);
k = *(unsigned int*)((X + 2 * 4));
R1_(c, *d, *a, *b, k, 17,3);
k = *(unsigned int*)((X + 3 * 4));
R1_(b, *c, *d, *a, k, 22,4);
k = *(unsigned int*)((X + 4 * 4));
R1_(a, *b, *c, *d, k, 7,5);
k = *(unsigned int*)((X + 5 * 4));
R1_(d, *a, *b, *c, k, 12,6);
k = *(unsigned int*)((X + 6 * 4));
R1_(c, *d, *a, *b, k, 17,7);
k = *(unsigned int*)((X + 7 * 4));
R1_(b, *c, *d, *a, k, 22,8);
k = *(unsigned int*)((X + 8 * 4));
R1_(a, *b, *c, *d, k, 7,9);
k = *(unsigned int*)((X + 9 * 4));
R1_(d, *a, *b, *c, k, 12,10);
k = *(unsigned int*)((X + 10 * 4));
R1_(c, *d, *a, *b, k, 17,11);
k = *(unsigned int*)((X + 11 * 4));
R1_(b, *c, *d, *a, k, 22,12);
k = *(unsigned int*)((X + 12 * 4));
R1_(a, *b, *c, *d, k, 7,13);
k = *(unsigned int*)((X + 13 * 4));
R1_(d, *a, *b, *c, k, 12,14);
k = *(unsigned int*)((X + 14 * 4));
R1_(c, *d, *a, *b, k, 17,15);
k = *(unsigned int*)((X + 15 * 4));
R1_(b, *c, *d, *a, k, 22,16);
k = *(unsigned int*)((X + 1 * 4));
R2_(a, *b, *c, *d, k, 5,17);
k = *(unsigned int*)((X + 6 * 4));
R2_(d, *a, *b, *c, k, 9,18);
k = *(unsigned int*)((X + 11 * 4));
R2_(c, *d, *a, *b, k, 14,19);
k = *(unsigned int*)((X + 0 * 4));
R2_(b, *c, *d, *a, k, 20,20);
k = *(unsigned int*)((X + 5 * 4));
R2_(a, *b, *c, *d, k, 5,21);
k = *(unsigned int*)((X + 10 * 4));
R2_(d, *a, *b, *c, k, 9,22);
k = *(unsigned int*)((X + 15 * 4));
R2_(c, *d, *a, *b, k, 14,23);
k = *(unsigned int*)((X + 4 * 4));
R2_(b, *c, *d, *a, k, 20,24);
k = *(unsigned int*)((X + 9 * 4));
R2_(a, *b, *c, *d, k, 5,25);
k = *(unsigned int*)((X + 14 * 4));
R2_(d, *a, *b, *c, k, 9,26);
k = *(unsigned int*)((X + 3 * 4));
R2_(c, *d, *a, *b, k, 14,27);
k = *(unsigned int*)((X + 8 * 4));
R2_(b, *c, *d, *a, k, 20,28);
k = *(unsigned int*)((X + 13 * 4));
R2_(a, *b, *c, *d, k, 5,29);
k = *(unsigned int*)((X + 2 * 4));
R2_(d, *a, *b, *c, k, 9,30);
k = *(unsigned int*)((X + 7 * 4));
R2_(c, *d, *a, *b, k, 14,31);
k = *(unsigned int*)((X + 12 * 4));
R2_(b, *c, *d, *a, k, 20,32);
k = *(unsigned int*)((X + 5 * 4));
R3_(a, *b, *c, *d, k, 4,33);
k = *(unsigned int*)((X + 8 * 4));
R3_(d, *a, *b, *c, k, 11,34);
k = *(unsigned int*)((X + 11 * 4));
R3_(c, *d, *a, *b, k, 16,35);
k = *(unsigned int*)((X + 14 * 4));
R3_(b, *c, *d, *a, k, 23,36);
k = *(unsigned int*)((X + 1 * 4));
R3_(a, *b, *c, *d, k, 4,37);
k = *(unsigned int*)((X + 4 * 4));
R3_(d, *a, *b, *c, k, 11,38);
k = *(unsigned int*)((X + 7 * 4));
R3_(c, *d, *a, *b, k, 16,39);
k = *(unsigned int*)((X + 10 * 4));
R3_(b, *c, *d, *a, k, 23,40);
k = *(unsigned int*)((X + 13 * 4));
R3_(a, *b, *c, *d, k, 4,41);
k = *(unsigned int*)((X + 0 * 4));
R3_(d, *a, *b, *c, k, 11,42);
k = *(unsigned int*)((X + 3 * 4));
R3_(c, *d, *a, *b, k, 16,43);
k = *(unsigned int*)((X + 6 * 4));
R3_(b, *c, *d, *a, k, 23,44);
k = *(unsigned int*)((X + 9 * 4));
R3_(a, *b, *c, *d, k, 4,45);
k = *(unsigned int*)((X + 12 * 4));
R3_(d, *a, *b, *c, k, 11,46);
k = *(unsigned int*)((X + 15 * 4));
R3_(c, *d, *a, *b, k, 16,47);
k = *(unsigned int*)((X + 2 * 4));
R3_(b, *c, *d, *a, k, 23,48);
k = *(unsigned int*)((X + 0 * 4));
R4_(a, *b, *c, *d, k, 6,49);
k = *(unsigned int*)((X + 7 * 4));
R4_(d, *a, *b, *c, k, 10,50);
k = *(unsigned int*)((X + 14 * 4));
R4_(c, *d, *a, *b, k, 15,51);
k = *(unsigned int*)((X + 5 * 4));
R4_(b, *c, *d, *a, k, 21,52);
k = *(unsigned int*)((X + 12 * 4));
R4_(a, *b, *c, *d, k, 6,53);
k = *(unsigned int*)((X + 3 * 4));
R4_(d, *a, *b, *c, k, 10,54);
k = *(unsigned int*)((X + 10 * 4));
R4_(c, *d, *a, *b, k, 15,55);
k = *(unsigned int*)((X + 1 * 4));
R4_(b, *c, *d, *a, k, 21,56);
k = *(unsigned int*)((X + 8 * 4));
R4_(a, *b, *c, *d, k, 6,57);
k = *(unsigned int*)((X + 15 * 4));
R4_(d, *a, *b, *c, k, 10,58);
k = *(unsigned int*)((X + 6 * 4));
R4_(c, *d, *a, *b, k, 15,59);
k = *(unsigned int*)((X + 13 * 4));
R4_(b, *c, *d, *a, k, 21,60);
k = *(unsigned int*)((X + 4 * 4));
R4_(a, *b, *c, *d, k, 6,61);
k = *(unsigned int*)((X + 11 * 4));
R4_(d, *a, *b, *c, k, 10,62);
k = *(unsigned int*)((X + 2 * 4));
R4_(c, *d, *a, *b, k, 15,63);
k = *(unsigned int*)((X + 9 * 4));
R4_(b, *c, *d, *a, k, 21,64);
}
void MajorCircle_(char* str, unsigned int b_len) {
//str 是已经被填充过的串
unsigned int AA, A = 0x67452301;
unsigned int BB, B = 0xefcdab89;
unsigned int CC, C = 0x98badcfe;
unsigned int DD, D = 0x10325476;
//将str以512为组分开,512bit/8=64Byte
unsigned int num = b_len / 512;//得到组数
unsigned int i = 0;
for (i = 0; i < num; i++) {
//str+i*64 就是对应的分组
AA = A; BB = B; CC = C; DD = D;//对四个寄存器的值进行备份
MinorCircle_(&A, &B, &C, &D, str + i * 64);
A += AA; B += BB; C += CC; D += DD;//得到新的值
}
//此时可以输出ABCD,注意次序即可。
Rotate_(&A); Rotate_(&B); Rotate_(&C); Rotate_(&D);
printf("MD5:%x%x%x%x\n", A, B, C, D);
}
void MD5(char* str) {
unsigned int b_len = strlen(str);//获取字符串长度,此时b_len是输入字符串长度
char* temp = padding_(str,&b_len);//获得填充后的比特流,此时b_len是比特流长度
MajorCircle_(temp, b_len);
free(temp);
}