安全体系(三)——SHA1算法详解
转载地址:http://www.cnblogs.com/songwenlong/p/6528025.html
目录
- 1.Hash函数和消息完整性
- 2.SHA1算法简介
- 3.术语和概念
- 4.SHA1算法
正文
本文主要讲述使用SHA1算法计算信息摘要的过程。
安全体系(零)—— 加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
安全体系(一)—— DES算法详解
安全体系(二)——RSA算法详解
为保证传输信息的安全,除了对信息加密外,还需要对信息进行认证。认证的目的有两:一是验证信息的发送者是合法的,二是验证信息的完整性。Hash函数就是进行信息认证的一种有效手段。
1.Hash函数和消息完整性
Hash函数也称为杂凑函数或散列函数,函数输入为一可变长度x,输出为一固定长度串,该串被称为输入x的Hash值或数字指纹。
因为Hash函数是多对一函数,不同的输入对应着相同的输出,求其逆是比较难,通过给定的输入计算Hash值必须是很容易,但从Hash值逆推输入则很难,因此也称Hash函数为单向Hash函数。
Hash函数一般满足以下几个基本需求:
1).输入x可以任意长度
2).输出数据长度固定
3).容易计算,给定任何x,容易计算出x的Hash值
4).单向函数,即给出一个Hash值,很难反向计算出原始输入的x
5).唯一性,即难以找出两个不同的输入会得到相同的Hash输出值
Hash值得长度由算法的类型决定,与输入的消息大小无关,一般为128bit或者160bit,即使两个消息的差别很小,如仅差别一两位,其Hash函数的运算结果也会截然不同,用同一个算法对某一消息进行Hash运算只能获得唯一确定的Hash值。
一个安全的单向迭代函数是构造安全消息Hash值得核心和基础,有了好的单向迭代函数,就可以用合适的迭代方法来构造迭代Hash函数,Hash函数的安全设计的理论主要有以下两点:一是函数的单向性,二是函数影射的随机性。常见的Hash算法有MD-5、SHA等。
2.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)=11100000001 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算法详解相关推荐
- SHA-1算法详解和C++实现
SHA-1算法详解和C++实现 背景介绍 SHA-1算法也称安全散列算法1,可以将一个最大264−12^{64}-1264−1的数据生成一个160位的数据摘要.尽管SHA-1算法已经被认为不再安全,但 ...
- 人脸识别系列三 | MTCNN算法详解上篇
前言 我们前面分享了PCA,Fisher Face,LBPH三种传统的人脸识别算法,Dlib人脸检测算法.今天我们开始分享一下MTCNN算法,这个算法可以将人脸检测和特征点检测结合起来,并且MTCNN ...
- UWB的三种算法详解
超宽带UWB定位的三种常用定位算法,包括TDOA定位算法.TOF定位算法.TOA定位算法. (一)TOF定位算法 基于TOF的定位方法与基于TOA的定位方法在本质上是相同的,而TOF测距不依赖基站与标 ...
- 特征提取(三)SURF算法详解
转自:https://www.cnblogs.com/jinjidexuetu/p/90ace4e8de574e3d5f4e6ac16a0dc157.html 另外加了些自己的理解 一.原理: Sif ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
- Unicode双向算法详解(bidi算法)(三)
Unicode双向算法详解(bidi算法)(三) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C++语法详解>一书相关章节的增补,以增强读者对 ...
- 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序
养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...
- 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用
9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...
- 目标检测 RCNN算法详解
原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...
- Twitter-Snowflake,64位自增ID算法详解
Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...
最新文章
- 九、springboot整合rabbitMQ
- 从u盘设备启动arc-livecd
- 当 Kubernetes 遇到机密计算,阿里巴巴如何保护容器内数据的安全?
- mysql查询锁表语句和kill对应的线程
- 服务器上如何安装两个php网站,服务器安装两个php版本吗
- 基本数据类型与字符串的转换
- mysql去重取最大值,逻辑类似oracle的over(partition by)函数
- 数据 3 分钟 | 《数据安全法》即将施行;ACM SIGMOD在西安举办;艾瑞咨询发布数据库行业报告...
- opencv 梯度幅值_20、 OpenCV导数和梯度
- DICM和BMP图像的显示及转换
- mysql 定时备份脚本
- limesurvey php5.2,WinXP下安装LimeSurvey(php环境搭建及网站程序安装)
- 外企面试官最爱提的十个问题
- word批量打印工具,c#写的
- 做一个完整网站的流程(独立完成个人网站)
- ECS架构 Entitas-CSharp学习之路(一)
- python发微信给手机充值话费_微信充话费如何自定义金额?最低1元起充的技巧...
- Android的SharedPreferences和SQLite
- aop:aspectj-autoproxy的作用
- 《智能路由器开发指南》核心笔记(全)——转载的