SHA-1算法详解和C++实现

SHA-1算法详解和C++实现

背景介绍

SHA-1算法也称安全散列算法1,可以将一个最大264−12^{64}-12641的数据生成一个160位的数据摘要。尽管SHA-1算法已经被认为不再安全,但仍有部分应用使用SHA-1算法验证文件。

算法原理

类型定义

在介绍算法原理之前,有必要定义一些数据类型,有助于我们脱离具体编程语言分析这个算法。我这里使用C++的定义方式,不会C++也没有问题,我会解释代码的意义。

typedef __UINT8_TYPE__ BYTE;
typedef __UINT32_TYPE__ WORD;
typedef __UINT64_TYPE__ DWORD;

上面定义了三个数据类型,分别是:

  1. BYTE,字节,由8位二进制数组成,表示范围(0x0 - 0xFF)。
  2. WORD,字,由32位二进制数组成,表示范围(0x0 - 0xFFFFFFFF)。
  3. DWORD,双字,两个字组成,表示范围(0x0 - 0xFFFFFFFFFFFFFFFF)

算法剖析

(以下算法分析均建立在大端存储的基础之上,关于大端存储与小端存储对算法的影响,请见C++实现部分关于大端存储与小端存储的具体实现。)

**输入:**不定长度的字节序列(最大为264−12^{64}-12641位)。

**输出:**160位数据摘要。

输入不必多说,这里说一下输出。SHA-1算法最终产生160位数据摘要,这实际上由5个变量存储,每个变量存储32位信息,也就是说,这160为数据摘要存储在5个WORD中(5×32=1605\times 32=1605×32=160),这五个变量被定义为:A,B,C,D,E。他们都有初始值,分别为:

WORD A = 0x67452301;
WORD B = 0xEFCDAB89;
WORD C = 0x98BADCFE;
WORD D = 0x10325476;
WORD E = 0xC3D2E1F0;

SHA-1算法的过程就是利用输入的字节序列,不断更新这五个变量,最后将这五个变量按字节拼接,就得到160位的数据摘要。具体过程如下:

1. 数据预处理

SHA-1算法的基本运算单位是一个块(block),一个块的大小为512位,即64字节。输入的数据位数按512被不断分块。如果数据不能被512整除,也就是说最后一部分数据不能填满一块怎么办呢?实际上即便最后一部分填满512位,我们依旧要进行更进一步处理,除非最后一部分刚好等于448位,也就是56个字节。因为我们需要最后一块的最后64个字节填入整个数据的位数长度。所以我们输入的数据有以下两种情况:

  1. 数据位数长度对512取余刚好等于448。
  2. 数据位数长度对512取余不等于448。

对情况1:我们只需要在最后64位中填入输入数据的位数长度即可。

对情况2:这里相对情况1更为复杂,需要进行补位

什么是补位呢?我们需要在数据最后补上一个1,然后全部补0直到数据长度对512取余等于448。例如我们数据为:10011010,长度为8位,补位后为:10011010 1000...0,中间空格为了区分补位数据。补位完成后,最后填入的数据长度依旧是8,补位数据不计入数据长度。

2. 生成子组

由于SHA-1算法的基本运算单位是一个块,所以我们只需对上面分完的这么多个块中讨论一个即可。

对于给定的一个块,512位,我们需要再分成16个子组,每个子组32位。也就是一个WORD,记为w0,w1,...,w15w_0, w_1, ..., w_{15}w0,w1,...,w15,我们需要这16个子组,再生成64个子组,记为w16,w17,...,w79w_{16},w_{17},...,w_{79}w16,w17,...,w79。生成算法如下:
wi=wi−3⊕wi−8⊕wi−14⊕wi−16w_{i} = w_{i-3}\oplus w_{i-8}\oplus w_{i-14}\oplus w_{i-16} wi=wi3wi8wi14wi16
其中i∈{16,...,79}i \in \{16, ..., 79\}i{16,...,79}⊕\oplus表示异或,在C++中对应运算符为^

3. 80次核心循环

在循环开始之前,我们需要得到一组A,B,C,D,E五个变量的拷贝,记为a,b,c,d,e。

WORD a = A, b = B, c = C, d = D, e = E;

接下来我们需要执行一个80次的循环,每次循环都利用到a,b,c,d,e,以及一个子组。

第1个20次循环(0 < i < 19):

WORD temp = (b & c) | ((~b) & d) + 0x5A827999;
WORD temp2 = a << 5 | a >> 27;
e = d;
d = c;
c = b << 30 | b >> 2;
b = a;
a = temp + temp2 + e + w[i];

第2个20次循环(20 < i < 39):

WORD temp = (b ^ c ^ d) + 0x6ED9EBA1;
WORD temp2 = a << 5 | a >> 27;
e = d;
d = c;
c = b << 30 | b >> 2;
b = a;
a = temp + temp2 + e + w[i];

第3个20次循环(40 < i < 59):

WORD temp = (b & c) | (b & d) | (c & d) + 0x8F1BBCDC;
WORD temp2 = a << 5 | a >> 27;
e = d;
d = c;
c = b << 30 | b >> 2;
b = a;
a = temp + temp2 + e + w[i];

第4个20次循环(60 < i < 79):

WORD temp = (b ^ c ^ d) + 0xCA62C1D6;
WORD temp2 = a << 5 | a >> 27;
e = d;
d = c;
c = b << 30 | b >> 2;
b = a;
a = temp + temp2 + e + w[i];

执行完之后,这一块的运算已经完成,只需要更新A,B,C,D,E的值即可。

A += a;
B += b;
C += c;
D += d;
E += e;

之后即可进行下一块运算。

C++实现

大小端问题

值得注意的是,SHA-1算法建立在大端存储的基础上,包括填入数据长度时,最后64个字节也是按照大端存储来分配的。但是如果机器时小端存储,这边就会出问题,问题出现的地方在:循环位移运算、加法运算。所以如果是小端存储的机器,必须保证在实际内存上数据的排列按SHA-1算法要求,那么我们必须在取出数据和存入数据时反转数据。

大文件分批次读取计算的问题

关于大文件无法一次性读入内存时,SHA-1算法支持分批次读入,这是由于SHA-1算法计算基础单位是一个块决定的,所以读入大文件时,需要一个变量记住不断累计的文件长度,并且读入数据满一个块时立即计算并清空块缓冲区,等待下一组数据读入。

具体实现

关于C++的具体实现部分我已经在Github上开源,项目名称为justsha1,欢迎各位点个star。

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

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

相关文章

python的socket模块_python模块:socket模块

1.Socket类型socket(family,type[,protocal]) 使用给定的地址族,套接字类型,协议编号(默认是0)来创建套接字socket类型描述socket.AF_UNIX只能够用于单一的Unix系统进程间通信socket.AF_INET服务器之间网络通信socket.AF_INET6IPv6socket.SOCK_STREAM流式socket , for TCPs…

完整性校验用到常见的算法_校验数据的完整性,校验数据完整性,使用MD5/SHA算法校...

校验数据的完整性&#xff0c;校验数据完整性,使用MD5/SHA算法校使用MD5/SHA算法校验数据的完整性package cn.itcast.gz;import java.io.File;import java.io.FileInputStream;import java.security.DigestInputStream;import java.security.MessageDigest;/** * 主要用于验证数…

python超市买苹果_官网购买的iPhone12pro还没发货?试着用Python快速入手

引言​iPhone12pro有望成为2020年末真香机&#xff0c;动辄3000元的溢价让不少消费者选择了等待官网调货。除了官方与电商线上平台&#xff0c;苹果还采用了线下预约制提货。但每天少的可怜的出货量&#xff0c;和不到一秒钟就抢空的预约名额让“老年人”手速的各位望而却步。传…

server多列转行 sql_sql server 行转列及列转行的使用

在我们使用的数据库表中经常需要用到行列互相转换的情况&#xff0c;使用sql 的关键词 UNPIVOT(列转行)和PIVOT(行转列)可轻松实现行列转换。一、列转行&#xff1a;员工月份排班表存储是采用1号~31号作为列的方式进行存储的现通过 UNPIVOT 将每天的班次用行进行展示&#xff0…

git 拉取远程其他分支代码_git切换远程分支并拉取远程分支代码

Git一般有很多分支&#xff0c;我们clone到本地的时候一般都是master分支&#xff0c;那么如何切换到其他分支呢&#xff1f;主要命令如下&#xff1a;1. 查看远程分支$ git branch -a我在mxnet根目录下运行以上命令&#xff1a;~/mxnet$ git branch -a* master可以看到&#x…

python登录豆瓣_python登录豆瓣,发帖

学习了urllib、urllib2及cookielib常用方法的使用登录豆瓣&#xff0c;由于有验证码&#xff0c;采取的办法是将验证码图片下载到同目录下&#xff0c;查看图片后输入验证码即可登录、发帖帖子内容写死在代码中了[Python]代码# -- coding:gbk --import sys, time, os, reimport…

ios 代码设置控件宽高比_ios-自动布局以保持视图大小比例

我正在努力实现以下目标&#xff1a;我的xib中有2个视图&#xff0c;需要使边缘(两侧和顶部)保持20像素需要调整大小的2个视图的大小不同它们必须相隔20像素它们的宽度需要相对于父视图的宽度保持不变我阅读了有关执行此操作的教程&#xff0c;但是它的工作原理是&#xff0c;它…

echarts 在两点之间画一条线_树的手绘很难画?分步骤教你画,简单易学,收藏起来临摹学习...

前景树——半树、角树画法半树与角树&#xff0c;在建筑手绘中常处于前景位置&#xff0c;其表现需尽量写意&#xff0c;形体概括&#xff0c;对比强烈&#xff0c;进而更好地引导与突出中景。&#xff08;1&#xff09;半树半树&#xff0c;顾名思义只需画出单棵树从树冠中下部…

opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

本文介绍了python OpenCV学习笔记直方图反向投影的实现&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;它用于图像分割或寻找图像中感兴趣的对象。简单地说&#xff0c;它创建一个与我们的输入图像相同大小(但单通道)的图像&#xff0c;其中每个像素对应于属于我们对象…

上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod

文/Kong 题图 / CaesarZX白夜谈是编辑的自留地&#xff0c;聊一些比较个人的内容。但是对于我来说&#xff0c;这个栏目总是一个特别的苦差。因为我实在没有太多表达观点的欲望&#xff0c;所以我和负责白夜谈的跳跳老师商量&#xff0c;可不可以尝试搞个系列节目。比如&#x…

中音萨克斯指法表图_初学萨克斯一定要了解这6点基础知识

萨克斯管是一种色彩性很强的乐器&#xff0c;它的声音独特&#xff0c;带有神秘的色彩&#xff0c;音色十分迷人&#xff0c;是一种比较接近人声特点的乐器&#xff0c;因此吸引到越来越多的人喜欢上萨克斯。那么新手在初学阶段关于萨克斯一定要了解这6点基础知识。一、萨克斯管…

在哪里可以找水系图_虹吸雨水排水系统对比传统重力排水,好在哪里?

建筑物的排水系统是必不可少的&#xff0c;雨水的排水又是其重中之重的排水系统。雨水排水系统的选择我们需要考虑哪些因素呢&#xff1f;下面就介绍一下虹吸雨水排水系统相较于传统重力排水的优势到底在哪里&#xff1f;一、虹吸雨水排水系统原理形成原理&#xff1a;利用屋面…

ug编程内公差和外公差是什么_工厂老师傅自学数控编程多年心得,希望你们少走弯路...

需要UG资料可以关注私信 “UG"或者 ”UG教程 “领取。很多人都认为自学有恒心有耐心有定力就可以了&#xff0c;有这些意志还没有达到自学的水准&#xff0c;因为有很多东西你都不知道是有这回事的&#xff0c;或许你知道有这回事你根本解决不了&#xff0c;自学的满足条件…

加油站都需要什么手续_农村买房过户都需要什么手续?

一、农村房屋过户怎么办理&#xff1f; 根据我国法律的规定&#xff0c;办理农村房屋过户需要去乡或镇的国土所。农村房屋过户需要去乡镇国土所提出申请&#xff0c;提交相关材料后&#xff0c;当地国土所根据申请人提供的权属资料进行审查&#xff0c;实地进行勘丈、调查、公…

zplane函数怎么用m文件调用_matlab中一个m文件怎么调用另一个m文件的函数

展开全部1、首先要在笔记62616964757a686964616fe59b9ee7ad9431333431353265本电脑上安装好指定版本的matlab软件并双击打开。2、然后双击matlab图标打开其主页面&#xff0c;可以看到这个软件的按钮都是全英文单词的。3、那么创建m文件的方法就是鼠标移动到New按钮上单击一下&…

axi时序图_深入 AXI4总线(E3)实战:制作一个 AXI 接口 IP

本系列我想深入探寻 AXI4 总线。不过事情总是这样&#xff0c;不能我说想深入就深入。当前我对 AXI总线的理解尚谈不上深入。但我希望通过一系列文章&#xff0c;让读者能和我一起深入探寻 AXI4。在本系列先前的文章中&#xff0c;我们首先通过协议 specification 了解协议的接…

动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...

下面介绍下求线段和最小值常见题型1&#xff0c;通过点关于直线对称点得到两定点之间直线段长度最短。以下题为例&#xff0c;已知矩形ABCD&#xff0c;AB8&#xff0c; AD6.E&#xff0c;F分别为AB&#xff0c;AD的中点。G&#xff0c;H分别为BC&#xff0c;AB上动点。求四边形…

番茄钟怎么调_学习神器-番茄钟

番茄钟番茄工作法是简单易行的时间管理方法。使用番茄工作法&#xff0c;选择一个待完成的任务&#xff0c;将番茄时间设为25分钟&#xff0c;专注工作&#xff0c;中途不允许做任何与该任务无关的事。直到番茄时钟响起&#xff0c;然后进行短暂休息一下&#xff08;5分钟就行&…

获取某一条_想获取流量?这几种工具是必须要有的,能帮你获客快人一步!

2020年&#xff0c;最难的莫过于实体店了&#xff0c;而没有受到影响的&#xff0c;也就是那些互联网企业&#xff0c;一切企业甚至业绩比以前还好&#xff0c;不得不承认&#xff0c;互联网确实有它的独特之处。也因此&#xff0c;很多实体商家也在慢慢向互联网转变。为什么要…

python 修改word中的表格_python批量处理word中的表格

def word_table_formater():from win32com import clientword client.Dispatch(Word.Application)doc word.Documents.Open(C:\\Users\\Administrator\\Desktop\\test.docx)i 1for table in doc.Tables:print(i, len(doc.Tables))# 设置列宽table.Columns(1).Width 85table…