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

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。

区块链正在成为新的创新源头,这一年来全球科技发生了什么变化?今天在一群产品经理的朋友圈里提及了NFT以及相关的区块链技术,有一位产品经理喷我道就是一堆新名词,也不知道说了个啥,炒作就是炒作。我说新科技再好,也得炒作才能有资金啊,你说现国内几沉淀时光,跃然纸上墨案inkPadX电子阅读器繁忙的工作之余,一杯清茶,一本好书,开始重新定义生活。大家好,我是小泽,又见面啦。五年前的生日,我送给自己一款Kindle阅读器,正式开启了阅读生活。五年后的今天,再次去看手中这款抢先体验小米电子温湿度计随着智能家居产品越来越丰富,可以进行的联动操作也越来越多,在舒适环境方面,实时监测室内的温度和湿度,联动空调,电暖器,加湿器等设备进行居家环境调节,就变得越来越方便今天,腐竹我就来苹果iOSiPadOS15正式版发布众多新功能纷纷亮相苹果现在推出了iOS15iPadOS15watchOS8和tvOS15,用于iPhoneiPadAppleWatch和AppleTV设备。你可能不会立即看到更新,但当它们可用时,你升级iOS15后,面容ID更安全了watchOS8正式版发布watchOS8tvOS15HomePod15正式版发布!苹果今天发布了iOS15和iPadOS15,新系统改进了面容ID的防欺诈功能,进一步提升了iPhoneX或更新型号,以及i新能源车子在北方真的没有未来?需要应对哪些问题?在新能源飞速发展的今天,很多人对新能源汽车依然是抱有怀疑的态度,特别是在冬天寒冷的北方。那么新能源车子在北方真的没有未来吗?需要应对哪些问题?第一点,纯电汽车每到冬天就会存在着续航刚刚,iOS15。1beta1发布,更新了3个新功能昨天,苹果推送了iOS15正式版,更新内容iOS15正式版终于发布,升级建议来了!。9月22日凌晨1点苹果推送了iOS15。1beta1版本,同时发布了macOSMontereyb盘点那些iPhone老机型不支持iOS15的新功能,大家千万别盲目更新随着iOS15正式版的推送,有很多果粉都已经收到更新提示,但是每次在更新系统之前都会犹豫,到底要不要更新呢?更新之后要是发热怎么办?遇到信号不好怎么办?或者直接卡顿?其实这些都是用cpui3i5i7正常使用,区别大不大?所有没有交代具体用途就来分析使用体验就是耍流氓,无论是奔腾(Pentium),还是Corei3Corei5Corei7,他们之间的规格差异非常大,否则彼此的价格差异也不会有那么大。哈曼卡顿水晶音响899和1499区别在哪里?咱们来对比一下两种价格的哈曼卡顿水晶音响先看一下899元的哈曼卡顿音响规格再看一下1499元的哈曼卡顿音响规格从规格可以看出899元的水晶音响最大功率是40W,1499元的水晶音响英国自断后路,充当美国恶犬拆除华为5G设备,李嘉诚会出手相助吗随着我国的发展,我们国家的很多企业也是逐渐地发展了起来。这些企业依靠自己的努力在科技创新方面有着非常大的成就。而在这些颇有成就的企业当中最为出名的可能就是华为了。华为公司的强大甚至
179元国产内存对比实测!支持国货不丢人,2133频率可C12超越竞品昨天京东特别的光威天策内存179元秒杀,于是搞了5对回来,据说是长鑫颗粒。中国的品牌配上中国的颗粒,就成了完完全全的中国特色内存条。正好粉丝发来刷BIOS的MSIB250MGAMI一加9系列价格公布弹幕和评论都说买买买冲了冲了经过近半月的预热,一加9系列总有故事被影像看见国内发布会于3月24日14点正式召开。刘作虎口中的影像机皇屏幕巅峰如期登场,除了之前高达300万的预约量,很多网友都参与了发布会的直播E3神教500元CPU主板一套,4核心8线程支持NVME固态硬盘DDR3内存既然INTEL的E3V5V6正式版ESQS版本已经完美破解,那么今天开始就分享一些奇葩案例实测吧。这次是一套500多元的E31260LV5正式版GAB150MD3VDDR3主板的组120元2GD5显卡2万多分!显卡荒的时代,1000元电脑双通道16G内存随着INTELE3V5V6处理器的破解以及价格的平民化,魔改君自己总要装一台机器的。无奈E31260LV5正式版这颗处理器它没有核显,于是海鲜市场走起,淘了一块。于是就有了本文的奇100元显卡鲁大师跑分4万LOL平均180帧!人人挖矿的年代优秀选择之前发过一篇GTS4502GDDR5的评测文章,不过主要是因为比较稀有。一个是因为2G的显存容量,另外就是因为DDR5的显存版本。不过那玩意鲁大师跑分也就2万出头,实际体验其实不怎300多元的挖矿硬盘厂商拒绝质保,三星新款980固态1T价格仅790元今天说的是两个事儿第一个,随着奇亚币的崩盘,大量挖矿的大容量固态硬盘流入市场,它到底值不值得买?第二个,随着INTEL在固态硬盘市场的暗淡,全新的三星9801TNVMEM。2固态硬100元技嘉B250主板破解上至强V5处理器!中国制造事件背后的真相关于GA的事儿,魔改君其实不想参合。所以本文只是继续科普,其实之前的文章测试过GAB250MEVO的供电,非常的差劲!但难能可贵的是,主板上竟然做了VRM温度的传感器,AIDA64Linux之find命令find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到Linux之tar命令通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具tar命令可以为linux的文件和目录创建档案。利用tar,可以为某Liunx之chown命令chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID组可以是组名或者组ID文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命Linux之tail命令tail命令从指定点将文件写到标准输出,使用tail命令的f选项可以方便的查看正在改变的日志。tailfnohup。out会把nohup。out最尾部的内容显示在屏幕上,并且不断刷