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