sha1散列算法

sha1算法用于获取一段数据的摘要信息

主函数:

bool sha1(const char* srcstr,char* shabuf)
{
	size_t srclen = strlen(srcstr);
	size_t tmplen = srclen;
	char* tmpbuf = new char[tmplen + 65];
	strcpy(tmpbuf,srcstr);
	tmpbuf[tmplen++] = 0x80;
	unsigned int idx = tmplen >> 8;
	unsigned int pos = tmplen & 63;
	idx++;
	if(pos > 56)
	{
		memset(tmpbuf + tmplen,0,56 + 64 - pos);
		tmplen += 56 + 64 - pos;
		idx++;
	}
	else
	{
		memset(tmpbuf + tmplen,0,56- pos);
		tmplen += 56 - pos;
	}
	srclen = srclen * 8;
	srclen = bswap(srclen);
	memcpy(tmpbuf + tmplen,(unsigned char*)(&srclen),8);
	tmplen += 8;

	unsigned int K0 = 0x5A827999;
	unsigned int K1 = 0x6ED9EBA1;
	unsigned int K2 = 0x8F1BBCDC;
	unsigned int K3 = 0xCA62C1D6;

	unsigned int H0 = 0x67452301;
	unsigned int H1 = 0xEFCDAB89;
	unsigned int H2 = 0x98BADCFE;
	unsigned int H3 = 0x10325476;
	unsigned int H4 = 0xC3D2E1F0;
	for(int n = 0;n < idx;n++)
	{
		unsigned int A = H0;
		unsigned int B = H1;
		unsigned int C = H2;
		unsigned int D = H3;
		unsigned int E = H4;
		unsigned int tmp = 0;

		unsigned int arr[80] = {0};
		for(int i = 0;i < 16;i++)
		{
			unsigned int* tmp = (unsigned int*)(tmpbuf +64 * n + 4 * i);
			arr[i] = *tmp;
			arr[i] = bswap(arr[i]);
		}
		for(int i = 16;i < 80;i++)
		{
			arr[i] = arr[i-3] ^ arr[i-8] ^ arr[i-14] ^ arr[i-16];
			arr[i] = rol(arr[i],1);
		}
		for(int i = 0;i < 20;i++)
		{
			tmp = rol(A,5) + E + arr[i] + K0 + ((B & C) | ((~B) & D));
			E = D;
			D = C;
			C = rol(B,30);
			B = A;
			A = tmp;
		}
		for(int i = 20;i < 40;i++)
		{
			tmp = rol(A,5) + E + arr[i] + K1 + (B ^ C ^ D);
			E = D;
			D = C;
			C = rol(B,30);
			B = A;
			A = tmp;
		}
		for(int i = 40;i < 60;i++)
		{
			tmp = rol(A,5) + E + arr[i] + K2 + ((B & C) | (B & D) | (C & D));
			E = D;
			D = C;
			C = rol(B,30);
			B = A;
			A = tmp;
		}
		for(int i = 60;i < 80;i++)
		{
			tmp = rol(A,5) + E + arr[i] + K3 + (B ^ C ^ D);
			E = D;
			D = C;
			C = rol(B,30);
			B = A;
			A = tmp;
		}
		H0 += A;
		H1 += B;
		H2 += C;
		H3 += D;
		H4 += E;
	}
	delete[] tmpbuf;
	sprintf(shabuf,"%08x%08x%08x%08x%08x",H0,H1,H2,H3,H4);
	return true;
}

移位函数:

unsigned int rol(unsigned int num,unsigned char len)
{
	__asm__ __volatile__
			(
				".intel_syntax noprefix\n"
				"mov eax,edi\n"
				"mov ecx,esi\n"
				"rol eax,cl\n"
				);
}
变换字节序函数:

unsigned int bswap(unsigned int num)
{
	__asm__ __volatile__
		(
			".intel_syntax noprefix\n"
			"mov eax,edi\n"
			"bswap eax\n"
		 );
}

unsigned long bswap(unsigned long num)
{
	__asm__ __volatile__
		(
		 ".intel_syntax noprefix\n"
		 "mov rax,rdi\n"
		 "bswap rax\n"
		 );
}
程序使用了intel汇编,编译时需要增加编译参数 -masm=intel


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值