02_SHA1算法源码分析

news/2025/12/10 13:11:42/文章来源:https://www.cnblogs.com/x0rrrrr/p/19330952

SHA1算法源码分析

一、SHA1明文处理

1. C调用SHA1哈希方法
SHA1Context ctx;
SHA1Context* pCtx = &ctx;
SHA1Reset(pCtx);
SHA1Input(pCtx, (const uint8_t*)"Hello SHA1", strlen("Hello SHA1"));
uint8_t digst[SHA1HashSize];
SHA1Result(pCtx, digst);
for (int i = 0; i < SHA1HashSize; i++)printf("%02x", digst[i]);
2. 明文处理

SHA1的数据填充方式与MD5的一样:

  • 在原始数据后添加一个1比特
  • 在1比特后填充比特0,使其长度接近但不超过448位
  • 最后使用64位二进制数表示原始数据长度,附件在末尾

填充当中与MD5唯一的区别就是:64位数据长度按照大端序存放

二、SHA1主要流程

1. SHA1Context结构体
typedef struct SHA1Context {uint32_t Intermediate_Hash[SHA1HashSize / 4]; 		// 消息摘要uint32_t Length_Low; 								// 消息字节数量:低位uint32_t Length_High; 								// 消息字节数量:高位int_least16_t Message_Block_Index;					// 指向消息块数组的索引(当前Message_Block)填到了第几个字节uint8_t Message_Block[64]; 							// 512位消息缓冲区int Computed; 										// 摘要是否已经计算完成int Corrupted; 										// 消息摘要是否损坏
} SHA1Context;
2. 初始化
int SHA1Reset(SHA1Context *context)//初始化状态
{if (!context) {return shaNull;}context->Length_Low = 0;context->Length_High = 0;context->Message_Block_Index = 0;context->Intermediate_Hash[0] = 0x67452301;// 取得的HASH结果(中间数据)context->Intermediate_Hash[1] = 0xEFCDAB89;context->Intermediate_Hash[2] = 0x98BADCFE;context->Intermediate_Hash[3] = 0x10325476;context->Intermediate_Hash[4] = 0xC3D2E1F0;context->Computed = 0;context->Corrupted = 0;return shaSuccess;
}

对比于MD5SHA1初始化向量用了5个,其那四个与MD5一致。这个也是SHA-1的魔改点。

3. SHA1Input函数
int SHA1Input(SHA1Context *context, const uint8_t *message_array, unsigned length) {if (!length) {return shaSuccess;}if (!context || !message_array) {return shaNull;}if (context->Computed) {context->Corrupted = shaStateError;return shaStateError;}if (context->Corrupted) {return context->Corrupted;}while (length-- && !context->Corrupted) {context->Message_Block[context->Message_Block_Index++] =(*message_array & 0xFF);context->Length_Low += 8;if (context->Length_Low == 0) {context->Length_High++;if (context->Length_High == 0) {/* Message is too long */context->Corrupted = 1;}}if (context->Message_Block_Index == 64) {SHA1ProcessMessageBlock(context);}message_array++;}return shaSuccess;
}

​ 使用SHA1Input函数将待加密的明文传入后,会先将明文按照512bit进行分组,然后512bit中的每字节存入MessageBox_Block当中,如果MessageBox_Block已经填满,则先进行一次SHA1的运算,之后继续遍历。

​ 如果输入的原始数据过长,超过了\(2^{64}-1\)位的话就报错。

4. SHA-1运算函数
void SHA1ProcessMessageBlock(SHA1Context *context) {const uint32_t K[] = { /* Constants defined in SHA-1 */0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};int t; 					/* Loop counter */uint32_t temp; 			/* Temporary word value */uint32_t W[80]; 		/* Word sequence */uint32_t A, B, C, D, E; /* Word buffers */for (t = 0; t < 16; t++) {W[t] = context->Message_Block[t * 4] << 24;W[t] |= context->Message_Block[t * 4 + 1] << 16;W[t] |= context->Message_Block[t * 4 + 2] << 8;W[t] |= 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]);//W[t] = W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16];}A = context->Intermediate_Hash[0];B = context->Intermediate_Hash[1];C = context->Intermediate_Hash[2];D = context->Intermediate_Hash[3];E = context->Intermediate_Hash[4];for (t = 0; t < 20; t++) {temp = SHA1CircularShift(5, A) +((B & C) | ((~B) & D)) + E + W[t] + K[0];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];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];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];E = D;D = C;C = SHA1CircularShift(30, B);B = A;A = temp;}context->Intermediate_Hash[0] += A;context->Intermediate_Hash[1] += B;context->Intermediate_Hash[2] += C;context->Intermediate_Hash[3] += D;context->Intermediate_Hash[4] += E;context->Message_Block_Index = 0;
}

这个跟md5的轮函数就很相似了,只不过md5的直接将每一步用宏写出来,而这里使用的是循环。

SHA1和MD5一样,也有分组,只不过MD5的分组是M0~M15总共16个分组,而SHA1则是80个分组,W0~W15使用原始数据进行分组,后面的分组都是经过前面的分组运算之后进行循环左移1位(不进行左移就是SHA0了,有安全性问题)产生的。

​ 通过轮函数的运算之后再和开始的初始化向量相加。

轮函数如下:
img

5. SHA1Result函数
int SHA1Result(SHA1Context *context, uint8_t Message_Digest[SHA1HashSize]) {int i;if (!context || !Message_Digest) {return shaNull;}if (context->Corrupted) {return context->Corrupted;}if (!context->Computed) {SHA1PadMessage(context);for (i = 0; i < 64; ++i) {/* message may be sensitive, clear it out */context->Message_Block[i] = 0;}context->Length_Low = 0; /* and clear length */context->Length_High = 0;context->Computed = 1;}for (i = 0; i < SHA1HashSize; ++i) {Message_Digest[i] = context->Intermediate_Hash[i >> 2]>> 8 * (3 - (i & 0x03));}return shaSuccess;
}

该函数会先判断SHA1是否已经计算完成,如果还未计算完成,则会先进行SHA1PadMessage,填充后计算一轮,然后再将最终的Intermediate_Hash值以大端序的格式存储到MEssage_Digest摘要当中。

SHA1PAdMessage实现如下:

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;context->Message_Block[57] = context->Length_High >> 16;context->Message_Block[58] = context->Length_High >> 8;context->Message_Block[59] = context->Length_High;context->Message_Block[60] = context->Length_Low >> 24;context->Message_Block[61] = context->Length_Low >> 16;context->Message_Block[62] = context->Length_Low >> 8;context->Message_Block[63] = context->Length_Low;SHA1ProcessMessageBlock(context);
}

​ 该函数开始先判断Message_Block当中是否大于55字节,如果大于则后续不够填充数据长度,则先填充0x80和一堆0,先扩充至512位,进行一次运算先。运算完成后会重现填充0,直到填满56位。

​ 如果没有大于55字节,则先填上0x80,然后填充字节0,最后填上数据长度到末尾(这里也是大端序方式填充),最后计算。

可以看到这个SHA1与md5大致的流程还是满相似的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/996532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年评价高的一字铰链/小角度一字铰链厂家最新权威实力榜 - 品牌宣传支持者

2025年评价高的一字铰链/小角度一字铰链厂家权威实力榜行业背景与市场趋势随着全屋定制和高端家居市场的快速发展,五金配件作为家居产品的"关节"部件,其重要性日益凸显。其中,一字铰链和小角度一字铰链因…

2025年评价高的全拉出缓冲托底轨厂家最新推荐排行榜 - 品牌宣传支持者

2025年评价高的全拉出缓冲托底轨厂家推荐排行榜行业背景与市场趋势随着家居五金行业的快速发展,全拉出缓冲托底轨作为现代家居功能五金的重要组成部分,其市场需求持续增长。2025年,随着消费者对家居品质要求的提升和…

机器人触觉传感器技术突破与接口问题解决

本文介绍了一项机器人触觉传感器的关键技术研究。研究人员发现,廉价硅橡胶复合材料制成的“皮肤”表面存在绝缘层,阻碍了传感聚合物与电极间的电接触,导致测量不准。通过跨学科合作,团队提出了一种可靠的接触验证与…

来乐山必吃的十种美食!本地人的强烈推荐,吃的就是老味道 - 资讯焦点

不是为了打卡拥挤的网红景点,而是被本地朋友领着钻进巷弄 —— 这是我三次奔赴乐山的理由。从苏稽古镇的晨雾到张公桥的深夜烟火,本地朋友总说:“真正的乐山味,藏在排队的本地人里,藏在开了几十年的老店里。” 整…

感应薄膜开关面板厂家推荐,触摸屏薄膜开关面板生产厂家全解析 - myqiye

在工业控制、智能设备等领域,感应薄膜开关面板作为人机交互(HMI)的核心组件,直接影响设备的操作体验与可靠性。面对市场上众多感应薄膜开关面板厂家,如何挑选兼具技术实力、品质保障与场景适配能力的合作伙伴?以…

雅思备考规划:一个月冲刺6.5分,科学自学,高效提分 - 资讯焦点

(雅思6.5分难吗?专业计划帮你少走弯路) 一、雅思备考现状:分数需求与备考痛点并存 根据雅思官方2024年发布的《全球雅思考生表现报告》,中国内地考生平均总分为5.8分,其中6.5分及以上分数段考生占比约32%,这一分…

2025年比较好的同步阻尼托底轨厂家最新推荐排行榜 - 行业平台推荐

2025年比较好的同步阻尼托底轨厂家推荐排行榜 行业背景与市场趋势 随着家居五金行业的快速发展,消费者对家具配件的品质要求越来越高。同步阻尼托底轨作为现代家具的核心部件之一,其性能直接影响抽屉的使用寿命和用…

2025年国产服务器生产厂家排名:靠谱的服务器及数据库服务器 - mypinpai

本榜单基于全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为企业选型提供客观依据,助力精准匹配适配的国产服务器及数据库服务器服务伙伴。 TOP1 推荐:北京乾行捷通科技有限公司 推荐指数:★★★★★ 口碑…

2025年靠谱的逆流闭式冷却塔/注塑机闭式冷却塔最新TOP厂家排名 - 品牌宣传支持者

2025年靠谱的逆流闭式冷却塔/注塑机闭式冷却塔TOP厂家排名 行业背景与市场趋势 随着工业制造向智能化、节能化方向加速转型,闭式冷却塔作为关键温控设备,其市场需求持续增长。尤其在注塑、化工、数据中心等高能耗…

2025年五大靠谱嵌入式硬件生产厂家推荐,高可靠解决方案全解 - 工业推荐榜

在工业自动化、轨道交通、机器人等领域的智能化升级浪潮中,嵌入式硬件是设备稳定运行的核心载体,其可靠性、定制化能力直接决定下游系统的性能表现。面对市场上鱼龙混杂的供应商,如何挑选适配自身场景的嵌入式硬件生…

2025年U型滑板场地建设公司排名:设计厂与施工队合作案例T - 工业品牌热点

在极限运动热潮席卷全球的当下,U型滑板场地作为滑板运动的核心竞技空间,其专业度直接决定了运动体验与赛事品质。从奥运会标准场馆到城市潮流打卡地,优质的U型场地不仅是技术与艺术的结晶,更是极限文化的载体。面对…

2025年知名的圆形别墅电梯厂家最新推荐排行榜 - 行业平台推荐

2025年知名的圆形别墅电梯厂家推荐排行榜 开篇:行业背景与市场趋势 随着高端住宅市场的持续升温,别墅电梯的需求逐年增长,尤其是圆形别墅电梯因其独特的设计美学和空间利用率,成为高端住宅的标配之一。2025年,消…

2025年口碑好的铝木系系统门窗高评价厂家推荐榜 - 行业平台推荐

2025年口碑好的铝木系系统门窗高评价厂家推荐榜行业背景与市场趋势随着人们生活品质的不断提升和建筑节能要求的日益严格,系统门窗行业迎来了快速发展期。铝木系系统门窗凭借其优异的保温隔热性能、美观大方的外观设计…

2025年口碑好的铝木系系统门窗高评价厂家推荐榜 - 行业平台推荐

2025年口碑好的铝木系系统门窗高评价厂家推荐榜行业背景与市场趋势随着人们生活品质的不断提升和建筑节能要求的日益严格,系统门窗行业迎来了快速发展期。铝木系系统门窗凭借其优异的保温隔热性能、美观大方的外观设计…

2025年比较好的家用圆形电梯/全圆形电梯厂家推荐及选购参考榜 - 品牌宣传支持者

2025年比较好的家用圆形电梯/全圆形电梯厂家推荐及选购参考榜 开篇:行业背景与市场趋势 随着城市化进程的加快和人们对居住品质要求的提升,家用电梯市场近年来呈现快速增长态势。其中,圆形电梯(或称全圆形电梯)…

2025年评价高的精密线规数控车床品牌厂家排行榜 - 品牌宣传支持者

2025年评价高的精密线规数控车床品牌厂家排行榜行业背景与市场趋势随着制造业向智能化、精密化方向快速发展,精密线规数控车床作为机械加工领域的关键设备,市场需求持续增长。2025年,全球数控机床市场规模预计将达到…

2025年口碑好的智能卡发卡机/NFC卡发卡机品牌厂家排行榜 - 行业平台推荐

2025年口碑好的智能卡发卡机/NFC卡发卡机品牌厂家排行榜行业背景与市场趋势随着数字化进程的加速和物联网技术的普及,智能卡和NFC技术在各行业的应用日益广泛。从门禁系统、支付终端到身份认证,智能卡已成为现代生活…

2025年五大平面薄膜开关面板生产厂家排行榜,智能家居薄膜开 - myqiye

为帮企业快速锁定适配自身需求的薄膜开关与触摸屏供应商,避免技术选型与品质风险,我们从技术研发实力(如材料创新、工艺精度)、品质管控体系(国际认证覆盖、不良率控制)、场景定制能力(工业/消费电子适配)及全…

2025年评价高的冬令营训练基地/好习惯冬令营优质营地推荐榜 - 品牌宣传支持者

2025年评价高的冬令营训练基地/好习惯冬令营优质营地推荐榜行业背景与市场趋势随着家庭教育观念的转变和素质教育的深入推进,冬令营市场近年来呈现出蓬勃发展的态势。2024年数据显示,我国青少年素质教育市场规模已突…

2025年度矿山用隔爆型移动变电站优质生产商排名,看哪家实力 - 工业推荐榜

为助力矿山、煤炭等领域企业精准锁定合规且高效的矿用设备供应商,避免因选型不当引发安全隐患或生产停滞,我们从防爆资质合规性(含国家防爆合格证、矿用产品安全标志证书覆盖度)、产品性能稳定性(如极端工况下连续…