sha1散列算法详解示例
//python3
res = '123456'print(hashlib.sha1(res.encode('utf-8')).hexdigest())
//输出: 7c4a8d09ca3762af61e59520943dc26494f8941b
SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
对于任意长度的明文,SHA1首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。对于每个明文分组的摘要生成过程如下:
1、将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。
2、申请5个32位的链接变量,记为A、B、C、D、E。
3、16份子明文分组扩展为80份。
4、80份子明文分组进行4轮运算。
5、链接变量与初始链接变量进行求和运算。
6、链接变量作为下一个明文分组的输入重复进行以上操作。
7、 最后,5个链接变量里面的数据就是SHA1摘要。
SHA(Security Hash Algorithm)是美国的NIST和NSA设计的一种标准的Hash算法,最初的版本于93年发表,称为SHA-0,因为很快就被发现存在安全隐患,于是在95年就发布第二个版本SHA-1。02年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。08年又新增了SHA-224。目前SHA-2各版本已成为主流。
这里以SHA1为例来进行SHA算法的讲解,其他系列原理类似。SHA1的特性有:
1).不能使用消息摘要复原信息;
2).不同的消息产生不同的消息摘要。
3.术语和概念
3.1位(Bit),字节(Byte)和字(Word)
SHA1把消息当做位(bit)字符串进行处理。最小单位称为位,8位组成一个字节,两个字节组成一个字。
例如,字符串“abc”转换成位字符串是01100001 01100010 01100011,转换成16进制字符串是 0x616263。
3.2 运算符和符号
下面的逻辑运算符作用于“字”
X^Y = X, Y逻辑与
X \/ Y = X, Y逻辑或
X XOR Y= X, Y逻辑异或
~X = X逻辑取反
X+Y的定义:字 X 和 Y 代表两个整数 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整数z = (x + y) mod 2^32. 这时候 0 <= z < 2^32. 将z转换成字Z, 那么就是 Z = X + Y.
循环左移位操作符Sn(X):X是一个字,n是一个整数,0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)。这个很容易理解了,比如X=11111111 00000001 00000001 00000000,n=5,则Sn(X)=111 00000001 00000001 00000000 11111。
X<<n定义:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。
X>>n定义:抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。
4.SHA1算法
4.1.把消息转换为位字符串
因为SHA1算法只接受位作为输入,所以进行计算前必须把原始消息(比如字符串、文件等)转换成位字符串。
比如,对字符串“abc”产生消息摘要,‘a’=97 ‘b’=98 ‘c’=99,先转换成24位的字符串:01100001 01100010 01100011
4.2.对转换得到的位字符串进行补位操作
消息必须进行补位,使其长度在对512取模以后的余数是448,即(补位后的消息长度)%512 = 448。
对消息进行补位时,先在后面补一个1,如果不满足要求,再补0直到满足对512取模余数为448。这就意味着,补位至少补一位(原消息位数为512n+447),最多补512位(原消息位数为512n+448)。
还是以前面的“abc”为例显示补位的过程:
原始信息: 01100001 01100010 01100011
补位第一步,首先补一个1:01100001 01100010 01100011 1
可以确定的是,如果用一个字节来表示一个字符,补1之后肯定不满足条件,仍需继续补位。
补位第二步,后面补0直到总长度对512取模余数为448,这里补423个0,使总长度达到为448:
01100001 01100010 01100011 1000…..00
补位完成后的数据转换为16进制:
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
从16进制数据里可以看到,我们也可以直接采用16进制的方式进行补位,我们先补80,看是否满足长度对64取余的结果为56,不满足则继续补0。
大家可以自己考虑一下为什么可以补80。
4.3 附加长度信息
这一步中,要将原始消息(没有进行补位操作之前)的长度(二进制位数)附加到已经补位的消息之后。
通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。
补长度的操作以后,整个消息(16进制)如下:
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
然后,将整个消息拆分为一个一个的512位的数据块M1,M2,…,Mn,然后分别对每一个数据块Mi (1≤i≤n)做处理,得到消息摘要。
注意,这里是64位,上一步补位后的长度是512k+448,k≥0,这样,512k+448+64=512(k+1),恰好可以被512整除。
在我们举得例子里,一共只有512位,因此做为一个数据块进行处理。
4.4 使用的常量和函数
一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出,它们如下:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79)
在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义
ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79)
4.5计算消息摘要
使用进行了补位和补长度后的消息来计算消息摘要。
计算需要的缓冲区:
1).两个都由5个32位的字组成缓冲区BUF1和BUF2, BUF1的5个32位缓冲区被标识为A,B,C,D,E,BUF2的5个32位缓冲区被标识为H0,H1,H2,H3,H4。
2).一个80个32位字的缓冲区BUF3,按照32位划分,依次被标识为W0, W1,..., W79。
3).一个1个字的TEMP缓冲区。
计算消息摘要:
在3.2中,我们把补位之后的数据附加了长度信息,然后划分为一个一个的512位(16个字)的数据块M1,M2,…,Mn,这里会依次对每个数据块Mi (1≤i≤n)做处理。
在处理每个数据块Mi (1≤i≤n)之前,先将缓冲区H0,H1,H2,H3,H4 初始化为下面的值(16进制):
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
接下来处理 Mi(1≤i≤n),步骤如下:
1). 将每个Mi 分成 16 个字(每个字32位) W0, W1, ... , W15, W0 是最左边的字;
n个Mi就划分之后,就变成W0,W1,…,W15,W16,…,W31,W32,…W79;
2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16);
3). 令 A = H0, B = H1, C = H2, D = H3, E = H4;
4) 对于 t = 0 到 79,执行下面的循环
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D;
D = C;
C = S30(B);
B = A;
A = TEMP;
5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在处理完所有的 Mi(1≤i≤n) 后,会得到一个160位(5个32位字)的字符串消息摘要H0 H1 H2 H3 H4。
sha1散列算法详解示例相关推荐
- MD5单向散列算法详解
历史: MD5 叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被 ...
- C# SHA1散列算法
C# SHA1散列算法 /// <summary>/// C# SHA1散列算法/// </summary>/// <param name="str" ...
- 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现
0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1) 在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...
- java怎么sha散列算法_Java sha1散列算法的原理解析
Java sha1散列算法的原理解析 发布时间:2020-10-31 00:01:59 来源:亿速云 阅读:101 作者:Leah 今天就跟大家聊聊有关Java sha1散列算法的原理解析,可能很多人 ...
- C#:实现SHA1散列算法(附完整源码)
C#:实现SHA1散列算法 /// <summary>/// C# SHA1散列算法/// </summary>/// <param name="str&quo ...
- java散列算法_Java sha1散列算法原理及代码实例
直接调用HashKit.sha1(String str)方法就可以了,,返回的是16进制的字符串长度是40, 也就是用md.digest()方法解析出来的字节数是160字节长度. 而MD5散列算法生成 ...
- Java实现密码学工具,集成了对称加密算法DES,AES,IDEA,公开加密算法RSA,ECC,散列算法MD5,SHA1,CRC32,以及RSA,DSA,ECDSA数字签名验证示例。
密码学综合工具 前言 git网址 项目结构 项目预览 String与byte[]互转 通过`String`类转换 通过`Base64`互转[jdk-8] 前言 我们网络信息安全的实验...要我们找各种 ...
- 散列算法 SHA-1,SHA-2和SHA-256之间的区别
随着SSL证书的普及,以"SHA"开头的算法的知名度也越多越高,但并不是很多人能够完全能分清"SHA"所有的算法,本文将会围绕"SHA"展开 ...
- 散列算法比较:MD5、SHA1、SHA256有哪些区别
在信息安全领域,经常会用到MD5.SHA1.SHA256算法.这三种算法都属于散列算法,或者叫作哈希算法.它们具有输入任意长度,输出长度固定,以及单向性(无法根据散列值还原出消息)的特点.那么,MD5 ...
最新文章
- python控制手机发短信_python-在python3中使用容联云通讯发送短信验证码
- JavaWeb学习总结第六篇--认识Session机制
- [BZOJ]1503: [NOI2004]郁闷的出纳员
- ImageView的scaleType理解
- 浅析 Linux 初始化系统(系统服务管理和控制程序/init system) -- UpStart
- python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...
- edge浏览器下载位置设置在哪里设置
- Opencv3与Opencv2的区别,及opencv2项目移植到opencv3注意事项
- 【Unity3D插件】DoTween插件(三)
- ppt加载html5,当PPT遇见H5,这才是真爱!
- Pixelmator Pro for Mac(图像编辑软件)
- 幸运大转盘(每天一个python小项目)
- 法语初级学习笔记-04-单词
- MySQL----数据库概述
- STM32最新是10个案例及操作
- 邻居好说话——冒泡排序
- HTML+CSS网页设计期末课程大作——绿色精美全民健身网站(10页) dreamweaver作业静态HTML网页设计模板
- Kali安装w3af详细教程
- mac 终端命令行自动补全并且忽略大小写
- 【推荐】javaweb JAVA JSP在线拍卖系统(竞拍系统)jsp网上拍卖系统源码