范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SHA1算法详解和C实现

  背景介绍
  SHA-1算法也称安全散列算法1,可以将一个最大2^{64}-1的数据生成一个160位的数据摘要。尽管SHA-1算法已经被认为不再安全,但仍有部分应用使用SHA-1算法验证文件。 算法原理类型定义
  在介绍算法原理之前,有必要定义一些数据类型,有助于我们脱离具体编程语言分析这个算法。我这里使用C++的定义方式,不会C++也没有问题,我会解释代码的意义。 typedef __UINT8_TYPE__ BYTE; typedef __UINT32_TYPE__ WORD; typedef __UINT64_TYPE__ DWORD;
  上面定义了三个数据类型,分别是: BYTE  ,字节,由8位二进制数组成,表示范围(0x0 - 0xFF)。 WORD  ,字,由32位二进制数组成,表示范围(0x0 - 0xFFFFFFFF)。 DWORD  ,双字,两个字组成,表示范围(0x0 - 0xFFFFFFFFFFFFFFFF) 算法剖析
  (以下算法分析均建立在大端存储的基础之上,关于大端存储与小端存储对算法的影响,请见C++实现部分关于大端存储与小端存储的具体实现。)
  输入: 不定长度的字节序列(最大为2^{64}-1位)。
  输出: 160位数据摘要。
  输入不必多说,这里说一下输出。SHA-1算法最终产生160位数据摘要,这实际上由5个变量存储,每个变量存储32位信息,也就是说,这160为数据摘要存储在5个 WORD  中(5	imes 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个字节填入整个数据的位数长度。所以我们输入的数据有以下两种情况: 数据位数长度对512取余刚好等于448。 数据位数长度对512取余不等于448。
  对情况1:我们只需要在最后64位中填入输入数据的位数长度即可。
  对情况2:这里相对情况1更为复杂,需要进行 补位 。
  什么是补位呢?我们需要在数据最后补上一个1,然后全部补0直到数据长度对512取余等于448。例如我们数据为: 10011010  ,长度为8位,补位后为: 10011010 1000...0  ,中间空格为了区分补位数据。补位完成后,最后填入的数据长度依旧是8,补位数据不计入数据长度。 2. 生成子组
  由于SHA-1算法的基本运算单位是一个块,所以我们只需对上面分完的这么多个块中讨论一个即可。
  对于给定的一个块,512位,我们需要再分成16个子组,每个子组32位。也就是一个 WORD  ,记为w_0, w_1, ..., w_{15},我们需要这16个子组,再生成64个子组,记为w_{16},w_{17},...,w_{79}。生成算法如下:
  $
  w_{i} = w_{i-3}oplus w_{i-8}oplus w_{i-14}oplus w_{i-16}
  $
  其中i in {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上开源,项目为GitHub - andsssf/justsha1: just implement sha1 algorithm,欢迎各位点个star。

恰到好处GANSSGS87G无线双模机械键盘简评回顾2020年的键圈,双模无疑是最热门的标签之一。随着应用于机械键盘的蓝牙技术和2。4Ghz无线非联网解决方案逐步成熟,越来越多的双模甚至三模键盘陆续面世。无线连接的整体表现趋于稳碧海青天Akko3098DS海洋之心机械键盘简评Akko3098是Akko首次采用98键布局的产品系列,发售于今年双十一期间,首发包含海洋之心红豆抹茶两个配色主题,轴型有Akko定制轴(蓝橙粉)和GateronCAP金黄轴可选。榆林WEYVV6让利促销,最高优惠10。14,欢迎垂询心心念念的WEYVV6,等了这么久终于有优惠了,小编打听到榆林亿荣WEY店即日起到09月16日最高优惠10。14,这么好的机会朋友们是不是也和小编一样迫不及待的想到店去感受一下呢促夜间安全行车八项注意夜间行车由于视线差车速快等原因,很容易引发交通事故,因此驾驶员要结合夜间行车实际,掌握安全行车要点,确保夜间行车安全。归纳起来夜间安全行车主要有以下8项注意。1注意保持车距。夜间行高端电竞鼠标改欧姆龙微动为凯华,是缩水么?在RGB版出来之后,现在ENDGAME的XM1有两个版本,看起来XM1是保持传统电竞风格,简洁实用和专注XM1RGB则是在这个基础上增加了华丽光效,更显张扬和自信,新老玩家能各取所德系电竞老干部什么做工,冰豹KONEPUREOE拆解KONEPURE于冰豹就像蝰蛇于雷蛇,牧马人于达尔优,产品生命期长而且版本众多。除了设计能力,冰豹在对于产品也有自己的独特且细致的理解,比如对滚轮组合键的命名叫TITANEasyS这个概念鼠标终于量产了,WA04耶梦加德说起概念性的产品,常见的是概念车概念手机和概念手表等等,它们都充满了创新设计和前瞻性,但跟几亿年轻玩家息息相关的鼠标,却很少有什么概念产品发布,赛钛客倒下之后,外设行业更没什么人还抱歉无意轻量化,赛睿RIVAL3无线版拆解RIVAL3的市场成功和实测数据都证实了这是一款非常不错的鼠标,顺理成章它的无线版本也备受关注,尤其是近期罗技曝光GPROXSUPERLIGHT超轻量化无线游戏鼠标的同时,让我们对除了轻量化还有更多,达尔优EM910拆解牧马人作为达尔优游戏鼠标的当家花旦,这么多年来更新从未停止,除了常规的更换皮肤,提升性能,面对如今的轻量化趋势居然也推出了轻量化版本,着实让人意外,而且在依旧保持着入门级的售价,强拿来主义多彩M800轻量化无线双模游戏鼠标简评外设发展到今天,总有些特别经典的设计叫人印象深刻,后来者往往也乐于去学习借鉴。这本不是什么丢人的事,优秀的东西,就是值得传承下去。当然借鉴这事,不管怎么说都会带点遮掩和羞涩,而且还仅3XX元,黑爵三模全铝机械键盘套件AC064来袭受客制化潮流的影响,机械键盘新的增长点开始在各个电商平台显现,那就是卖半成品。除了各种个性键帽定制轴之外,在热插拔的推动下,机械套件的热度开始飙升,毕竟玩客制化的门槛更低了。再者,
摸鱼的真正奥秘!教你用正确的姿势摸鱼摸鱼,别名划水,一种神奇的存在,泛指在工作或者学习等所谓的办正事的时候去玩。关于如何摸鱼的探讨可谓从未停止过。时至今日,如何做到最完美的摸鱼,已经成为一种艺术。那么这次,九剑就来教微软,绝了大家好,我是九剑我的电脑,没错,就是电脑桌面那个图标,可以说是我们平常在桌面中打开最多的文件之一。无论你有多少快捷方式,或者其他骚操作,总是会用得到它。然而纵然微软这么多年来一直在真正的文学巨著!金瓶梅大家好,我是九剑。最近看了很多欧美动作大片,然而大多数只是图特效一乐。乐完之后实在索然无味,所以扒一扒我们的传统文化。三言二拍,神鬼志怪,侠义公案。华夏文明可谓源远流长,即便发展至一秒钟!找出你手机上所有小电影大家好,我是九剑。检索软件对于日常使用来说可谓及其重要,毕竟关键时刻找不到用不了的情况还是非常让人恼火的。说到检索,大名鼎鼎的Everything大家应该都用过,基本零延迟秒搜电脑双11性价比最高的55英寸智能电视HDR10认证4K屏人性化系统技术与价格是相互促进的,技术的成熟不仅可以提升产品品质,还能拉低产品价格,而价格的下探也会引发需求的增加,从而再激励技术发展。渐渐地,人们就可以花更少的钱享受更高品质的生活,比如智回忆杀!超级玛丽帝国战机三国战记全新体验大家好,我是九剑。目前手游占据游戏市场大半平台,玩的人是越来越多。手游品质也是越来越高,动不动就几个G,画面也确实牛逼。然而阿水觉得,相对于手机来说,以前那种带手柄的掌机才是永远的全球Q3手机出货量出炉,三星强势登顶,新品S21FE信息曝光最近市场调研机构IDC发布了今年第三季度全球手机出货量的数据统计,其中全球总出货量达到了3。312亿部,同比下滑高达6。7。该机构表示,全球供应链产能不足的影响是第三季度手机出货量价格小幅下调,新款荣威RX5ePLUS上市近日,我们从上汽荣威官网获悉,该品牌旗下插电混动车型新款荣威RX5ePLUS正式上市。新车共推出2款配置车型,售价区间为15。2816。28万元,相比老款车型,新车在售价方面有小幅标致508L2022款如何?年轻出行必备单品年轻人对于一台车的定义,无非运动和靓丽,同时还要品质感,有面子。所以,如今拥有运动格调的B级车,成为了越来越多年轻有为的消费人群首选。在B级车市场就有这样一台宝藏车,他就是标致502021高端冰箱攻略卡萨帝日立东芝西门子等品牌冰箱选购推荐朋友们好,本篇文章的主题是高端冰箱的推荐,既然是高端冰箱,那价格自然不必多说,分析的重点主要在于冰箱的功能和结构预算不足或者是租房使用的朋友可以看我的这篇文章冰箱选购知识2021性天衣无缝的焊接东风标致全新4008良心用料造就安全好车拆焊点检查是东风标致每个月都会有的一项工作。拆焊点比拆钢板难度要大,往往是钢板被撕破而焊点还是牢牢地连接在一起。而如此大费周章的进行检验,就是为了检测车辆的安全性,焊接的越牢固,汽