SHA256 的C语言实现

前几天总结了SHA256的算法原理一文

SHA2系列的原理并不复杂,但是需要注意细节还是挺多的。不少中文博客贴出的代码都有错,这两天也踩了几个坑。

代码在这里!!!SHA256的C Code

代码实现主要依照的这个git仓库crypto-algorithms,向大家推荐,里面实现了各种加密算法。

代码正确性的测试

如何测试加密算法是否正确,上一文也提到过

我使用的是一个在线SHA256加密验证工具

测试了三种不同类型的数据的Hash结果
- 纯英文
- 中英文夹杂
- 长消息

逻辑运算

SHA256中使用的所有逻辑运算,使用宏定义的方式实现如下:

#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))

算法回顾

这里对SHA256原理进行简单回顾,方便大家对照源代码

首先需要将原始消息拆解成512-bit大小的块
这里写图片描述
最后单独甩出的不完整的块需要被补全,对应代码中的sha256_final函数

整体的操作是依次对块进行Hash映射,第i块映射的结果是第i+1块的输入。这个过程在函数sha256_update中完成

第一个块的输入是预设好的hash初值,初始化过程对应代码中的sha256_init函数

最后一个块的输出便是最终的数字摘要
这里写图片描述

而其中最关键的操作是这个映射函数Map

其内部也相当于是一个循环加密的过错,不断将原始信息进行打乱:

这里写图片描述
代码中函数sha256_transform实现了该过程

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

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

相关文章

信息摘要算法之一:MD5算法分析及实现

MD5即Message-DigestAlgorithm 5&#xff08;信息-摘要算法5&#xff09;&#xff0c;用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一&#xff08;又译摘要算法、哈希算法&#xff09;&#xff0c;主流编程语言普遍已有MD5实现。 1、MD5算法简介 MD5在90年代初由…

非对称加密概述

非对称加密概述 前言 在阅读《精通比特币》的过程中&#xff0c;我发现比特币系统中有两个重要的概念需要利用非对称加密技术&#xff1a; 比特币地址的生成 交易合法性的验证 因此&#xff0c;我用了几天时间学习了密码学基础知识&#xff0c;尤其是非对称加密技术的原理…

信息摘要算法之二:SHA1算法分析及实现

SHA算法&#xff0c;即安全散列算法&#xff08;Secure Hash Algorithm&#xff09;是一种与MD5同源的数据加密算法&#xff0c;该算法经过加密专家多年来的发展和改进已日益完善&#xff0c;现在已成为公认的最安全的散列算法之一&#xff0c;并被广泛使用。 1、概述 SHA算法…

2018数学建模A题的简单指导

之前写过一篇博客&#xff0c;介绍如何使用差分格式求解热传导方程 今天打开博客&#xff0c;突然发现评论区被这篇文章霸屏了 询问实验室的小伙伴才知&#xff0c;原来是被可爱的建模学子们攻占了 经过简单的了解&#xff0c;发现今年建模的A题的核心就是求解一个热传导方程…

PID控制器开发笔记之五:变积分PID控制器的实现

在普通的PID控制算法中&#xff0c;由于积分系数Ki是常数&#xff0c;所以在整个控制过程中&#xff0c;积分增量是不变的。然而&#xff0c;系统对于积分项的要求是&#xff0c;系统偏差大时&#xff0c;积分作用应该减弱甚至是全无&#xff0c;而在偏差小时&#xff0c;则应该…

使用SIFT匹配金馆长表情包

python使用opencv计算SIFT特征点的示例前言潜在的问题记录demo1&#xff1a;计算并绘制特征点demo2&#xff1a;使用SIFT匹配两幅图像参考文章地址前言 SIFT&#xff08;Scale-invariant feature transform&#xff09;是2004年提出的&#xff0c;至今已经经受住各种考验&…

PID控制器开发笔记之六:不完全微分PID控制器的实现

从PID控制的基本原理我们知道&#xff0c;微分信号的引入可改善系统的动态特性&#xff0c;但也存在一个问题&#xff0c;那就是容易引进高频干扰&#xff0c;在偏差扰动突变时尤其显出微分项的不足。为了解决这个问题人们引入低通滤波方式来解决这一问题。 1、不完全微分的基…

使用Python实现简易的数据标注工具

使用Python实现简易的数据标注工具 以增加工作效率为目的&#xff0c;最近一直在着手构建一个AI ToolBox 这两天&#xff0c;我为其中的预处理工具目录添加了数据标注模块&#xff0c;本文所介绍内容的代码见这里 该数据标注模块包含以下几个demo gui_tkinter_exercise.py …

PID控制器开发笔记之七:微分先行PID控制器的实现

前面已经实现了各种的PID算法&#xff0c;然而在某些给定值频繁且大幅变化的场合&#xff0c;微分项常常会引起系统的振荡。为了适应这种给定值频繁变化的场合&#xff0c;人们设计了微分先行算法。 1、微分先行算法的思想 微分先行PID控制是只对输出量进行微分&#xff0c;而…

python实现视频关键帧提取(基于帧间差分)

python实现视频关键帧提取&#xff08;基于帧间差分&#xff09; 在很多场景下&#xff0c;我们不想或者不能处理视频的每一帧图片&#xff0c;这时我们希望能够从视频中提取出一些重要的帧进行处理&#xff0c;这个过程我们称为视频关键帧提取。 关键帧提取算法多种多样&…

PID控制器开发笔记之八:带死区的PID控制器的实现

在计算机控制系统中&#xff0c;由于系统特性和计算精度等问题&#xff0c;致使系统偏差总是存在&#xff0c;系统总是频繁动作不能稳定。为了解决这种情况&#xff0c;我们可以引入带死区的PID算法。 1、带死区PID的基本思想 带死区的PID控制算法就是检测偏差值&#xff0c;…

在多任务(RTOS)环境中使用看门狗

最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章。从一个失败的太空项目出发&#xff0c;分析了看门狗的作用及使用&#xff0c;自我感觉很有启发&#xff0c;特此翻译此文并推荐给各位同仁。为了阅读方便&#xff0c;有些航天领域名词本人添加了注释&#xf…

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享 一、前言 竞赛页面 团队名BugFlow&#xff0c;最终排名35/2157 虽然成绩一般&#xff0c;但是作为一支目标检测领域的新手队伍&#xff0c;仅仅有一块1070显卡&#xff0c;从零开始拿到这个排名&#xff0c;也算有一…

信息摘要算法之三:SHA256算法分析与实现

前面一篇中我们分析了SHA的原理&#xff0c;并且以SHA1为例实现了相关的算法&#xff0c;在这一片中我们将进一步分析SHA2并实现之。 1、SHA简述 前面的篇章中我们已经说明过&#xff0c;SHA实际包括有一系列算法&#xff0c;分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-…

focal loss的几种实现版本(Keras/Tensorflow)

起源于在工作中使用focal loss遇到的一个bug&#xff0c;我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试&#xff0c;我发现了这样一个奇怪的现象&#xff0c;几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的。 通过仔细的比对和思考&#xff0c…

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章&#xff0c;文章结构明晰&#xff0c;讲解透彻&#xff0c;本人深受启发&#xff0c;特意将其翻译过来供各位同仁参考。当然限于个人水平&#xff0c;有不当之处…

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说&#xff0c;设定值的变动会产生较大的滞后才能反映在被控变量上&#xff0c;从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统&#xff0c;其特点是当扰动产生后&#xff0c;被控变量还未变化以前&#xff0c;根…

借助百度识图爬取数据集

背景 一个能够实际应用的深度学习模型&#xff0c;背后的数据集往往都花费了大量的人力财力&#xff0c;通过聘用标注团队对真实场景数据进行标注生产出来&#xff0c;大多数情况不太可能使用网络来源的图片。但在项目初期的demo阶段&#xff0c;或者某些特定的场合下&#xf…

通过printf从目标板到调试器的输出

最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章&#xff0c;自我感觉很有启发&#xff0c;特此翻译此文并推荐给各位同仁。当然限于个人水平&#xff0c;有不当之处恳请指正。原文网址&#xff1a;https://blog.seg…

小心使用tf.image.resize_images,填坑经验分享给你

上上周&#xff0c;我在一个项目上线前对模型进行测试时出现了问题&#xff0c;这个问题困扰了我近两周&#xff0c;终于找到了问题根源&#xff0c;做个简短总结分享给你&#xff0c;希望对大家有帮助。 问题描述&#xff1a; 线上线下测试结果不一致&#xff0c;且差异很大…