安全体系(三)——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)=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

时间: 2024-10-16 23:54:04

安全体系(三)——SHA1算法详解的相关文章

枚举所有子集的三种算法详解-《算法入门经典》

方法一:增量构造法 理解递归必须得理解函数到底是做什么的. #include<cstdio> void print_subset(int n,int *a,int cur) //print_subset的功能是打印集合{0,1,...,n-1}的cur个元素的子集,并且目前a数组中已经存储了要打印的集合 { printf("{ "); for (int i=0;i<cur;i++) printf("%d ",a[i]); printf("

安全体系(一)—— DES算法详解

本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 安全体系(零)-- 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(二)--RSA算法详解 安全体系(三)--SHA1算法详解 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法. 密钥长64位,密钥事实上是56位参与DES运算(第8.16.24.32.40

安全体系(二)——RSA算法详解

本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们三人都在麻省理工学院工作.RSA算法以他们三人姓氏开头字母命名. RSA是目前最有影响力的公钥加密

Dijkstra算法(三)之 Java详解

前面分别通过C和C++实现了迪杰斯特拉算法,本文介绍迪杰斯特拉算法的Java实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想

Kruskal算法(三)之 Java详解

前面分别通过C和C++实现了克鲁斯卡尔,本文介绍克鲁斯卡尔的Java实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的

[转] KMP算法详解

转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串).比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串.

【转】AC算法详解

原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和Margaret J.Corasick于1974年提出(与KMP算法同年)的一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,...pm},在O(n)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关.正如KMP算法在单模式匹配方面的突出贡献一样,AC算法对于

Manacher算法详解

[转] Manacher算法详解 转载自: http://blog.csdn.net/dyx404514/article/details/42061017 Manacher算法 算法总结第三弹 manacher算法,前面讲了两个字符串相算法——kmp和拓展kmp,这次来还是来总结一个字符串算法,manacher算法,我习惯叫他 “马拉车”算法. 相对于前面介绍的两个算法,Manacher算法的应用范围要狭窄得多,但是它的思想和拓展kmp算法有很多共通支出,所以在这里介绍一下.Manacher算法

Tarjan算法详解

Tarjan算法详解 [概念] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components). 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达.{5},{6}也分别是两个强连通分量. [功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连