SHA1算法的C语言实现(支持输入字符串长度超过56)_sha1 c语言(1)

{
    j = 4 \* i;
    w[i] = ((long)input[j]) << 24 | ((long)input[1 + j]) << 16 | ((long)input[2 + j]) << 8 | ((long)input[3 + j]) << 0;
}
for (i = 16; i < 80; i++)
{
    w[i] = w[i - 16] ^ w[i - 14] ^ w[i - 8] ^ w[i - 3];
    temp = w[i] << 1;
    temp1 = w[i] >> 31;
    w[i] = temp | temp1;
}

}
void SHA1_group(unsigned char input[64], unsigned long hash[5]) // 对512位的消息组进行加密
{
unsigned long w[80];
unsigned long A, B, C, D, E, temp, temp1, temp2, temp3, k, f;
int i, flag;

creat\_w(input, w);
A = hash[0];
B = hash[1];
C = hash[2];
D = hash[3];
E = hash[4];
for (i = 0; i < 80; i++)
{
    flag = i / 20;
    switch (flag)
    {
    case 0:
        k = 0x5a827999;
        f = (B & C) | (~B & D);
        break;
    case 1:
        k = 0x6ed9eba1;
        f = B ^ C ^ D;
        break;
    case 2:
        k = 0x8f1bbcdc;
        f = (B & C) | (B & D) | (C & D);
        break;
    case 3:
        k = 0xca62c1d6;
        f = B ^ C ^ D;
        break;
    }
    temp1 = A << 5;
    temp2 = A >> 27;
    temp3 = temp1 | temp2;
    temp = temp3 + f + E + w[i] + k;
    E = D;
    D = C;

    temp1 = B << 30;
    temp2 = B >> 2;
    C = temp1 | temp2;
    B = A;
    A = temp;
}
hash[0] = hash[0] + A; // 将获得的160位变量依旧放在hash数组中,可作为下一组明文的链接变量
hash[1] = hash[1] + B;
hash[2] = hash[2] + C;
hash[3] = hash[3] + D;
hash[4] = hash[4] + E;

}
void SHA1(unsigned char *input, unsigned long hash[5]) // SHA1算法
{
int n = strlen(input); // 字符串长度
int m; // 明文组数 - 1
int i, j; // 循环计数
unsigned char group[64]; // 将原始明文进行分组
unsigned long long temp;

for (i = 0; i < 5; i++) // 获得初始链接变量
{
    hash[i] = H[i];
}

m = n / 64;             // 获得明文组数 - 1;64\*8=512
for (i = 0; i < m; i++) // 处理前m组的明文
{
    for (j = 0; j < 64; j++)
    {
        group[j] = input[i \* 64 + j]; // 将原始明文赋值给group
    }
    SHA1\_group(group, hash); // 对明文进行加密
}

if (n % 64 >= 56) // 原始明文长度对512求余大于448 bit,对原始明文的补位加一组;56\*8=448;
{
    for (j = 0; j < 64; j++) // 将原始明文赋值给group,并补位,第一位补 1 ,其余位补 0
    {
        if (m \* 64 + j < n)
            group[j] = input[m \* 64 + j]; // 将原始明文赋值给group
        else if (m \* 64 + j == n)         // 补位,第一位补 1
            group[j] = 0X80;              // 1000 0000 B
        else
            group[j] = 0; // 其余位补 0
    }
    SHA1\_group(group, hash); // 加密,并且将获得的160位变量依旧放在hash数组中,作为下一组明文的链接变量
    m++;                     // 对原始明文的补位加一组
}

for (j = 0; j < 64; j++) // 处理最后一组明文
{
    if (m \* 64 + j < n)
        group[j] = input[m \* 64 + j]; // 将原始明文赋值给group
    else if (m \* 64 + j == n)         // 补位,第一位补 1
        group[j] = 0X80;
    else if (j < 56) // 其余位补 0
        group[j] = 0;
    else
        break;
}
temp = ~(~temp << 8);// 给 明文的最后64bit 赋值原始明文的长度,单位bit
n = n \* 8;
for (i = 0; i < 8; i++)
{
    j = 8 \* i;
    group[63 - i] = (char)((n & (temp << j)) >> j);
}
SHA1\_group(group, hash); // 加密最后一组明文,获得密文

}

int main()
{
unsigned char input[300]; // 输入的明文
unsigned long hash[5];

printf("input message:\n");
scanf("%s", input); // 不要有空格和中文

SHA1(input, hash); // 加密

printf("\noutput hash value:\n");
printf("%08X%08X%08X%08X%08X", hash[0], hash[1], hash[2], hash[3], hash[4]); // 获得SHA1加密

return 0;

}


SHA1在线加密工具:https://www.iamwawa.cn/jiami.html


参考资料:  
 [1]: https://blog.csdn.net/Y\_peak/article/details/116998207  
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/a4146cbce3b46c572e56aec51638e2f2.png)

![img](https://img-blog.csdnimg.cn/img_convert/22a04e14d06db8f4bb702bd006ab0f12.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/447cb3ba7a400add1387a882cce64aa0.png)

 **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

![img](https://img-blog.csdnimg.cn/img_convert/9b25c17756860cab335feeb41947ed95.png)

![img](https://img-blog.csdnimg.cn/img_convert/220207e7e5731e53f689955239e20c32.png)

 

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**

<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值