SHA1算法详解

0x00 前言

SHA1算法也是哈希算法的一种,只要理解了MD5算法,SHA1也很快就能理解。
MD5算法可以参考:MD5算法详解
MD5算法得出的MD5值长度为16个字节(8*16=128位)
SHA1算法得出的SHA1值长度为20个字节(8*20=160位)

0x01 填充信息

和MD5算法类似,对信息的第一步也是填充信息直至满足条件。

填充的过程如下:
1.先判断文件(消息)的大小(长度) mod 512 == 448 mod 512 ,就是大小(长度)对512求余等于448。(这里的512、448是“位”为单位,转成“字节”就是64、56,即mod 64 == 56 mod 64)

2.如果大小(长度)满足 mod 512 == 448 mod 512,就在文件(消息)的末尾处添加64位(8字节)的值,值的内容是原消息的长度(以位为单位)

3.如果大小(长度)不满足要求,就执行以下操作:
(1)填充1个1
(2)填充0,直到满足满足过程的第一步。

注意:这里是以位为单位,假如是以字节为单位,第一个填充的是0x80(1000 0000),然后就填0x0
举例:消息内容为“gnubd”,就能得到以下内容

67 6E 62 75 64 80 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 28 

还需要注意到的是最后原消息的长度是以大端存储的方式存到内存中的,这里与MD5的存储是有区别的。

0x02 数据说明

这里列举出所用到的数据

DWORD sha1::A = 0x67452301;
DWORD sha1::B = 0xEFCDAB89;
DWORD sha1::C = 0x98BADCFE;
DWORD sha1::D = 0x10325476;
DWORD sha1::E = 0xC3D2E1F0;

这里相对MD5算法多了4个字节。(因为SHA1值就是比MD5值多4个字节嘛)

常量:

DWORD sha1::k[4] = {0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6};

MD5就有64个,这个就简单一点,4个

0x03 处理信息

和MD5算法类似,也是需要将消息分组,每64个字节(512位)一组,分成多个组(n个)。
对与每一组MiMi(0 < i <= n)都要做如下处理。
将64个字节分成16组w0w0-w15w15,每组刚好4个字节
然后生成w16w16-w79w79,生成的方法如下:

for(DWORD i = 16;i<80;i++){DWORD temp = w[i-3]^w[i-8]^w[i-14]^w[i-16];w[i] = temp<<1 | temp>>31;}

接下来就是做核心运算了。
将a、b、c、d、e分别赋值为上面的A、B、C、D、E,作为MiMi的初始值
然后循环80次,从0-79:

        for(DWORD j = 0;j<80;j++){DWORD temp;DWORD temp2 = a<<5|a>>27; //循环左移5位,等下需要用到switch(j/20){   case 0:   //0-19步执行这里temp = (b&c)|((~(b))&d);temp += sha1::k[0];  //这个是常数break;case 1:  //20-39步执行这里temp = (b^c^d);temp += sha1::k[1];break;case 2: //40-59步执行这里temp = (b&c)|(b&d)|(c&d);temp += sha1::k[2];break;case 3: //60-79步执行这里temp = (b^c^d);temp += sha1::k[3];break;}temp += temp2 + e + w[j]; //这里就是上面生成的80个分组了e = d;d = c;c = b<<30 | b>>2; //循环左移30位b = a;a = temp;}A+=a;B+=b;C+=c;D+=d;E+=e;

注意最后这里和MD5类似,也是再将abcde分别加上初始值ABCDE,作为下一个消息分组Mi+1Mi+1的初始值,直到最后一个分组MnMn计算完后,得出的结果就是SHA1值。
即:
MnAMnBMnCMnDMnEMnAMnBMnCMnDMnE
这里只需按直接输出就好了,不必像md5那样调整字节位置后再输出,

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

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

相关文章

HTML5 地理位置定位(HTML5 Geolocation)

地理位置&#xff08;Geolocation&#xff09;是 HTML5 的重要特性之一&#xff0c;提供了确定用户位置的功能&#xff0c;借助这个特性能够开发基于位置信息的应用。今天这篇文章向大家介绍一下HTML5 地理位置定位的基本原理及各个浏览器的数据精度情况。 在访问位置信息前&a…

2016腾讯安全挑战赛第一轮-PC游戏方向

0x00 查壳 无壳的VC程序 0x01 测试 没有消息弹窗&#xff0c;尝试对函数下断点。 OD载入后&#xff0c;CtrlN查找函数&#xff0c;找到GetDlgItem 程序运行起来&#xff0c;等输入完后点击确定后程序断下。一路F8就来到这里 00401EED . E8 6A5B0000 call Tenc…

49-今日交易总结.(2015.1.13)

49-今日交易总结今天交易情况不好&#xff0c;主要犯了亏损时还连续加仓的错误。作为一个交易者&#xff0c;亏损时&#xff0c;继续加仓&#xff0c;认为市场会向交易的方向变化&#xff0c;一次性把亏损的全部捞回来&#xff0c;还能赚一笔。这是一种赌徒心理。永远不要再亏损…

电商导购过冬:蘑菇街酝酿出售 美丽说转型时尚

一度红火的第三方导购网站正因为阿里巴巴过山车式的态度而呈现出急剧下滑的轨迹。 2011年&#xff0c;以美丽说、蘑菇街为代表的导购网站蜂拥而起。彼时&#xff0c;两者还能频繁出现在阿里巴巴的官方活动中。然而&#xff0c;2012年5月&#xff0c;阿里巴巴集团董事局主席马云…

JavascriptDOM(三)

简介 今天学习第二天的知识,js和BOM对象,再接再厉,fighting~学习原则 脚踏实地的走好每一步,要想学好高级部分,基础知识必须扎实呀 掌握基本语法,完成小案例,写博客作总结,基本就是这个节奏,下面我们一起快速入门吧JavaScript快速入门 1. js简介 1.js基于对象和事件驱动的脚本语…

看雪 2016CrackMe 攻防大赛 - 1-Crack_Me-凉飕飕

环境&#xff1a; Windows xp 工具&#xff1a; IDA EXEINFOPE OD 0x00 查壳 EXEINFOPE查壳&#xff0c; 无壳 0x01 分析 if ( (unsigned __int16)wParam 0x40B ) // 成功{*(_OWORD *)v22 xmmword_41DB98;v25 0;v23 xmmword_41DBA8;v24 xmmword_41DBB8;memset_4039D0…

JS 或css教程 识别 IE版本的几种方法

今天收藏了这几种关于识别ie版本的几种代码&#xff0c;有需要的朋友参考一下&#xff1a;var isIE!!window.ActiveXObject;var isIE6isIE&&!window.XMLHttpRequest;var isIE8isIE&&!!document.documentMode;var isIE7isIE&&!isIE6&&!isIE8;if…

使用CSDN-markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ vector类详解

转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器&#xff0c;它是一种顺序容器&#xff0c;支持随机访问。vector是一块连续分配的内存&#xff0c;从数据安排的角度来讲&#xff0c;和数组极其相似&#xff0c;不同的地方就是…

ViewPager的使用方法和实现过程

看图先&#xff1a; 页面中填充内容是随机关键词飞入和飞出动画效果&#xff0c;随后会更新&#xff0c;现在请先无视吧 首先是 导入jar包 下载地址&#xff1a; android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopyprint?<android.support.v4.vi…

如何通过浏览器在所有响应内容中查找文本

使用浏览器的开发者工具查找响应文件的内容 ** Chrome ** 版本&#xff1a; 快捷键&#xff1a;CtrlShiftF 可以看到已经查找出来了 ** firefox ** 版本

【Leetcode】【Easy】Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 解题&#xff1a; 本题为典型的KMP算法考察题&#xff0c;KMP算法描述为&#xff1a; 设主串S&#xff0c;匹配串P&#xff0c;i为S的索引下…

Android Animations动画使用详解

一、动画类型 Android的animation由四种类型组成&#xff1a;alpha、scale、translate、rotate XML配置文件中 alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果Java Code代码中 AlphaAnimation渐变透明度动画效…

Jenkins入门指南

新手学习使用Jenkins 安装好Jenkins后如何运行脚本 1.新建item 2.输入任务名称&#xff0c;选择项目类型&#xff0c;点击确定 3.填个描述就好了&#xff0c;新手学jenkins&#xff0c;其他都不看&#xff0c;跑起来再说 4.点这个高级&#xff0c;选择你要运行的脚本所在…

Sublime Text 3 史上最性感的编辑器

↑ ↑ ↑ ↑ ↑ 请看文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 安装 windows / MAC OS 官网下载&#xff0c;双击安装&#xff0c;这个都会吧&#xff5e; linux linux下安装&#xff0c;一种办法是从官网下载 tar.bz &#xff0c;手动安装。 这里介绍用 apt-get 自己主动安装方法&#xf…

[转]怎么查看和修改 MySQL 的最大连接数?

使用 MySQL 数据库的站点&#xff0c;当访问连接数过多时&#xff0c;就会出现 "Too many connections" 的错误。出现这种错误有两种情况&#xff0c;一种是网站访问量实在太大&#xff0c;服务器已经负担不起&#xff0c;此时就应该考虑负载均衡或者其它减少服务器压…

对qps、tps、pv、uv的理解

QPS &#xff08;Queries Per Second&#xff09;&#xff1a;每秒查询数&#xff08;个别地方叫每秒查询率&#xff1f;每秒查询率是个奇怪的东西&#xff0c;每小时时速&#xff1f;&#xff09;&#xff0c;表示系统在一秒内处理的查询次数。 TPS&#xff08;Transactions …

swift入门之TableView

IOS8更新了&#xff0c;oc还将继续但新增了swift语言&#xff0c;能够代替oc编写ios应用&#xff0c;本文将使用swift作为编写语言&#xff0c;为大家提供step by step的教程。 工具 ios每次更新都须要更新xcode&#xff0c;这次也不例外&#xff0c;但使用xcode6&#xff0c;须…

Training-ActionBar

阅读&#xff1a;http://developer.android.com/training/basics/actionbar/index.html 对于API11以下的兼容&#xff1a; Update your activity so that it extends ActionBarActivity. For example: public class Main Activit yextends ActionBarActivity{...} In your mani…

Jmeter BeanShell学习(一) - BeanShell取样器(一)

通过利用BeanShell取样器设置请求发送的参数。 第一步&#xff1a;添加BeanShell取样器 第二步&#xff1a;在BeanShell中输入执行的代码 log.info("脚本开始执行"); //意思是将字符串输出到日志消息中 vars.put("username","123163.com");//…