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年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

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

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

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

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

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

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

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

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

 

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

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

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


知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值