C语言实现SH1的算法

typedef struct SHA1Context
{
uint32_t Message_Digest[5];
uint32_t Length_Low;
uint32_t Length_High;
uint8_t Message_Block[64];
int32_t Message_Block_Index;
int32_t Computed;
int32_t Corrupted;
} SHA1Context;

#define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits))))

void SHA1ProcessMessageBlock(SHA1Context *context)
{
const unsigned K[] = {0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 };
int t;
unsigned temp;
unsigned W[80];
unsigned A, B, C, D, E;

for(t = 0; t < 16; t++) 
{  
    W[t] = ((unsigned) context->Message_Block[t * 4]) << 24;  
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16;  
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8;  
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]);  
}  

for(t = 16; t < 80; t++)  
    W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);  

A = context->Message_Digest[0];  
B = context->Message_Digest[1];  
C = context->Message_Digest[2];  
D = context->Message_Digest[3];  
E = context->Message_Digest[4];  

for(t = 0; t < 20; t++) 
{  
    temp =  SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];  
    temp &= 0xFFFFFFFF;  
    E = D;  
    D = C;  
    C = SHA1CircularShift(30,B);  
    B = A;  
    A = temp;  
}  
for(t = 20; t < 40; t++) 
{  
    temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];  
    temp &= 0xFFFFFFFF;  
    E = D;  
    D = C;  
    C = SHA1CircularShift(30,B);  
    B = A;  
    A = temp;  
}  
for(t = 40; t < 60; t++) 
{  
    temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];  
    temp &= 0xFFFFFFFF;  
    E = D;  
    D = C;  
    C = SHA1CircularShift(30,B);  
    B = A;  
    A = temp;  
}  
for(t = 60; t < 80; t++) 
{  
    temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];  
    temp &= 0xFFFFFFFF;  
    E = D;  
    D = C;  
    C = SHA1CircularShift(30,B);  
    B = A;  
    A = temp;  
}  
context->Message_Digest[0] = (context->Message_Digest[0] + A) & 0xFFFFFFFF;  
context->Message_Digest[1] = (context->Message_Digest[1] + B) & 0xFFFFFFFF;  
context->Message_Digest[2] = (context->Message_Digest[2] + C) & 0xFFFFFFFF;  
context->Message_Digest[3] = (context->Message_Digest[3] + D) & 0xFFFFFFFF;  
context->Message_Digest[4] = (context->Message_Digest[4] + E) & 0xFFFFFFFF;  
context->Message_Block_Index = 0;  

}

void SHA1Reset(SHA1Context *context)
{
context->Length_Low = 0;
context->Length_High = 0;
context->Message_Block_Index = 0;

context->Message_Digest[0]      = 0x67452301;  
context->Message_Digest[1]      = 0xEFCDAB89;  
context->Message_Digest[2]      = 0x98BADCFE;  
context->Message_Digest[3]      = 0x10325476;  
context->Message_Digest[4]      = 0xC3D2E1F0;  

context->Computed   = 0;  
context->Corrupted  = 0;  

}

void SHA1PadMessage(SHA1Context *context)
{
if (context->Message_Block_Index > 55)
{
context->Message_Block[context->Message_Block_Index++] = 0x80;
while(context->Message_Block_Index < 64) context->Message_Block[context->Message_Block_Index++] = 0;
SHA1ProcessMessageBlock(context);
while(context->Message_Block_Index < 56) context->Message_Block[context->Message_Block_Index++] = 0;
}
else
{
context->Message_Block[context->Message_Block_Index++] = 0x80;
while(context->Message_Block_Index < 56) context->Message_Block[context->Message_Block_Index++] = 0;
}
context->Message_Block[56] = (context->Length_High >> 24 ) & 0xFF;
context->Message_Block[57] = (context->Length_High >> 16 ) & 0xFF;
context->Message_Block[58] = (context->Length_High >> 8 ) & 0xFF;
context->Message_Block[59] = (context->Length_High) & 0xFF;
context->Message_Block[60] = (context->Length_Low >> 24 ) & 0xFF;
context->Message_Block[61] = (context->Length_Low >> 16 ) & 0xFF;
context->Message_Block[62] = (context->Length_Low >> 8 ) & 0xFF;
context->Message_Block[63] = (context->Length_Low) & 0xFF;

SHA1ProcessMessageBlock(context);  

}

int SHA1Result(SHA1Context *context)
{
if (context->Corrupted)
{
return 0;
}
if (!context->Computed)
{
SHA1PadMessage(context);
context->Computed = 1;
}
return 1;
}

void SHA1Input(SHA1Context *context,const char *message_array,unsigned length){
if (!length)
return;

if (context->Computed || context->Corrupted)
{  
    context->Corrupted = 1;  
    return;  
}  

while(length-- && !context->Corrupted)
{  
    context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF);  

    context->Length_Low += 8;  

    context->Length_Low &= 0xFFFFFFFF;  
    if (context->Length_Low == 0)
    {  
        context->Length_High++;  
        context->Length_High &= 0xFFFFFFFF;  
        if (context->Length_High == 0) context->Corrupted = 1;  
    }  

    if (context->Message_Block_Index == 64)
    {  
        SHA1ProcessMessageBlock(context);  
    }  
    message_array++;  
}  

}

/*
int sha1_hash(const char *source, char *lrvar){// Main
SHA1Context sha;
char buf[128];
SHA1Reset(&sha);
SHA1Input(&sha, source, strlen(source));
if (!SHA1Result(&sha)){
printf(“SHA1 ERROR: Could not compute message digest”);
return -1;
} else {
memset(buf,0,sizeof(buf));
sprintf(buf, “%08X%08X%08X%08X%08X”, sha.Message_Digest[0],sha.Message_Digest[1],
sha.Message_Digest[2],sha.Message_Digest[3],sha.Message_Digest[4]);
//lr_save_string(buf, lrvar);
return strlen(buf);
}
}
*/
char * sha1_hash(const char *source,char * buf){ // Main
SHA1Context sha;
// char buf[128];

SHA1Reset(&sha);  
SHA1Input(&sha, source, strlen(source));  

if (!SHA1Result(&sha))
{  
    printf("SHA1 ERROR: Could not compute message digest");  
    return NULL;  
} 
else 
{  
    //buf = (char *)malloc(128);  
    memset(buf, 0, 128);  
    sprintf(buf, "%08X%08X%08X%08X%08X", sha.Message_Digest[0],sha.Message_Digest[1],  
    sha.Message_Digest[2],sha.Message_Digest[3],sha.Message_Digest[4]);  
    //lr_save_string(buf, lrvar);  

    //return strlen(buf);  
    return buf;  
}  

}

const char GUID3[] = “0123456789”;
uint8 Hmi_Test_shaData6[60];
uint8 Hmi_Test_shaData7[160];

sha1_hash(&GUID3[0],&Hmi_Test_shaData6[0]);
for (i=0;i<strlen(Hmi_Test_shaData6);i++)
{
Hmi_Test_shaData7[i] = tolower(Hmi_Test_shaData6[i]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Dan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值