//本代码中所有运算均以4bytes为单位进行计算,数据块用首地址取4byte长表示
void ft( BYTE *B , BYTE *C, BYTE *D, int t )
{
if( 0 <= t <= 19 )
return (B AND C) or ((NOT B) AND D);
if( 20 <= t <= 39 )
return B XOR C XOR D;
if( 40 <= t <= 59 )
return (B AND C) or (B AND D) or (C AND D);
if( 60 <= t <= 79 )
return B XOR C XOR D;
}
void sha1( BYTE *input , int inbytlen , BYTE *output ) //inbylen 位input的byte长度
{
//para
BYTE K[16];
memcpy( K , "\x5A\x82\x79\x99" , 4); //(0 <= t <= 19)
memcpy( &K[4] , "\x6E\xD9\xEB\xA1" ,4) ; //(20 <= t <= 39)
memcpy( &K[8] , "\x8F\x1B\xBC\xDC" , 4); //(40 <= t <= 59)
memcpy( &K[12] , "\xCA\x62\xC1\xD6" , 4); //(60 <= t <= 79).
//para end
BYTE tempA[4] , tempB[4] , tempC[4] , tempD[4], tempE[5] ; //4byte 为一个block,缓冲区1
BYTE temp2[20]; //缓冲区2
BYTE temp3[320]; //80个block ,缓冲区3
BYTE temp4[4]; //1个block,缓冲区4
memcpy( temp2 , "\x67\x45\x23\x01", 4 );
memcpy( &temp2[4] , "\xEF\xCD\xAB\x89" , 4 )
memcpy( &temp2[8] , "\x98\xBA\xDC\xFE" , 4 )
memcpy( &temp2[12] , "\x10\x32\x54\x76" , 4)
memcpy( &temp2[16] , "\xC3\xD2\xE1\xF0" , 4)
for( int i = 0 ; i < inbylen /64 ; i ++ )
{
memcpy( temp3 , input[i*64] , 64 );
for( int j = 16 ; j < 80 ; j++ )
{
memcpy( &temp3[ j * 4 ] , ( temp3[(j-3)*4] XOR temp3[(j-8)* 4 ] XOR temp3[(j-14) * 4] XOR temp3[(j-16) * 4] )<<<1 ); // <<