当前位置: 代码迷 >> VC >> 自各儿写了一个SHA1算法,但是运算速度太慢了,又找不到优化方向,求大神
  详细解决方案

自各儿写了一个SHA1算法,但是运算速度太慢了,又找不到优化方向,求大神

热度:333   发布时间:2016-05-05 00:01:24.0
自己写了一个SHA1算法,但是运算速度太慢了,又找不到优化方向,求大神
#include "stdafx.h"
#include "windows.h"
#include "string.h"

unsigned int K(int i)
{
if (i >= 0 && i <= 19)
{
        return 0x5A827999;
}
    else if (i >= 20 && i <= 39)
    {
        return 0x6ED9EBA1;
    }
     else if (i >= 40 && i <= 59)
     {
         return 0x8f1bbcdc;
     }
     else if (i >= 60 && i <= 79)
     {
 return 0xCA62C1D6;
 }
     else
     {
 return 0;
 }
}

unsigned int s(unsigned int x, int n)
{
if (n >= 0 && n <= 32)
{
return ((x << n) | (x >> (32 - n)));
}
else
{
return 0;
    }
}

unsigned int f(unsigned int b, unsigned int c, unsigned int d, int i)
{
if (i >= 0 && i <= 19)
{
return ((b & c) | ((~b) & d));
}
else if (i >= 20 && i <= 39)
{
return (b ^ c ^ d);
}
else if (i >= 40 && i <= 59)
{
return ((b & c) | (b & d) | (c & d));
}
else if (i >= 60 && i <= 79)
{
return (b ^ c ^ d);
}
else
{
return 0;
}
}

char sha1(char *message)
{
int i;
    char hex[17]={"0123456789abcdef"};
    unsigned char message_str[64]={""};
for(i=0;i<strlen(message);i++)
{
message_str[i]=*(message+i);
}
message_str[i]=0x80;
for(i+=1;i<56;i++)
{
message_str[i]=0x00;
}
unsigned long long int len = 8 * strlen(message);
for(i;i<64;i++)
{
message_str[i] = (len<<(8 * (7 - i + 56)));
}
unsigned int A;
unsigned int B;
unsigned int C;
unsigned int D;
unsigned int E;
unsigned int W[80];
unsigned int H[5];
unsigned int TEMP;
unsigned int t[4];  //用于合并四个char

H[0] = 0x67452301;
H[1] = 0xEFCDAB89;
H[2] = 0x98BADCFE;
H[3] = 0x10325476;
H[4] = 0xC3D2E1F0;
int k;
for(k=0;k<64;k+=4)
{
t[0]=message_str[k];
t[0]=t[0]<<24;
t[1]=message_str[k+1];
t[1]=t[1]<<16;
t[2]=message_str[k+2];
t[2]=t[2]<<8;
t[3]=message_str[k+3];
W[k/4] = t[0]+t[1]+t[2]+t[3];
}
int j;
for(j=16;j<=79;j++)
{
W[j]=s(W[j-3]^W[j-8]^W[j-14]^W[j-16],1);
}

A = H[0];
B = H[1];
C = H[2];
D = H[3];
E = H[4];

int m;
for(m=0;m<80;m++)
{
TEMP = s(A,5)+f(B,C,D,m)+E+W[m]+K(m);
E = D;
D = C;
C = s(B,30);
B = A;
A = TEMP;
}

H[0] += A;
H[1] += B;
H[2] += C;
H[3] += D;
H[4] += E;

//printf("%x%x%x%x%x \n",H[0],H[1],H[2],H[3],H[3]);

return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
long int i;
SYSTEMTIME sys; 
GetLocalTime( &sys ); 
printf( "%02d:%02d:%02d.%03d \n",sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds); 
for(i=0;i<1000000000;i++)
{
sha1("bob");
}
SYSTEMTIME _sys;
GetLocalTime( &_sys ); 
printf( "%02d:%02d:%02d.%03d \n",_sys.wHour,_sys.wMinute, _sys.wSecond,_sys.wMilliseconds); 
getchar();
return 0;
}


程序没写完,暂时没有考虑字符串大于512位的情况,只是重复运算同一字符串,速度大概是300kb/s,太慢了
------解决思路----------------------
参考下开源的?
https://code.google.com/p/smallsha1/