MD5代码

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值