SHA-1,MD5算法原理

本文绝大部分内容来自《网络安全基础——应用与标准》第五版——清华大学出版社。其中蓝色部门是自己添加

安全散列函数

单向散列函数或者安全散列函数之所以重要,不仅在于消息认证(消息摘要,数据指纹),还有数字签名(加强版的消息认证)和验证数据的完整性。常见的单向散列函数有MD5和SHA

散列函数的要求

散列函数的目的是文件、消息或者其他数据块产生“指纹”。为满足在消息认证中的应用,散列函数H必须具有下列性质:

(1)H可适用于任意长度的数据块。

(2)H能够生成固定长度的输出。

(2)对于任意给定的x,计算H(x)相对容易,并且可以用软/硬件实现。

(4)对于任意给定的h,找到满足H(x)=h的x在计算上不可行,满足这一特性的散列函数称之为:具备抗原像攻击性。

(5)对于任意给定的数据块x,找到满足H(y)=H(x)的y ≠ x在计算上是不可行;满足这一特性的散列函数称之为:抗弱碰撞性。

(6)找到满足H(x) = H(y)的任意一对(x,y)在计算上是不可行的。满足这一特性的散列函数称之为:抗碰撞性。

前三个性质是使用散列函数进行消息认证的实际可行要求。第四个属性,抗原像攻击,防止攻击者能够回复秘密值。抗弱碰撞性保证了对于给定的消息,不可能找到具有相同散列值的可替换消息。

满足上面前5个性质的散列函数称之为弱散列函数。如果还满足第6个性质则称之为强散列函数。

一般来说:能够认识散列函数的两个特点就OK,1.输出固定长度的 2. 不可逆转!

散列函数的安全性

有两种方法可以攻击安全散列函数:密码分析法和暴力攻击法。散列函数抵抗暴力攻击的强度完全依赖于算法生成的散列码长度。Van Oorschot和Wiener曾经提出,花费1000万美元涉及一个被专门用来搜索MD5算法碰撞的机器,则平均24天内就可以找到一个碰撞。

2004年8月中国密码学家王小云教授等首次公布了提出一种寻找MD5碰撞的新方法。目前利用该方法用普通微机几分钟内即可找到MD5的碰撞。MD5已经呗彻底攻破。

简单散列函数

所有的散列函数都按照下面的基本操作。把输入(消息、文件等)看成n比特块的序列。对输入用迭代方法处理一块,生成n比特的散列函数。

一种最简单散列函数的每一个数据块都按照比特异或。如下所示

Ci = bi1⊕ bi2⊕ … ⊕ bim

其中:

Ci为散列码的第i比特,1<=  i <=n;

m为输入中n比特数据块的数目;

bij为第j块的第i比特;

⊕为异或操作

下图说明了这个操作:

上图只是简单的散列函数。因为没一列都有相同的可能性。所以这个函数的有效性差。

SHA安全散列函数

近些年,应用最广泛的散列函数是SHA。由于其他每一种被广泛应用的散列函数都已经被证实存在这密码分析学中的缺陷,接着到2005年,SHA或许仅存的安全散列算法。SHA由美国国家标准与技术研究院(NIST)开发。

● 1995年公布SHA-1

● 2002年,公布了SHA-2(SHA-256、SHA-384、SHA-512)

● 2008年,增加了SHA-224

更详细的如下图所示:

下面对SHA-512做一下介绍,其他SHA算法与之很相似。该算法以最大长度不超过2128比特作为输入,生成512比特的消息摘要输出。输入以1024比特的数据块进行处理。如图所示:

处理过程:

● 第1步、追加填充比特

填充消息使其长度模1024同余896[长度 896(模1024)]。及时消息已经是期望的长度,也总是要添加填充。填充部分是由单个比特1后接所需个数的比特0构成。

● 第2步、追加长度

将128比特的数据块追加在消息上。该数据被看作是128比特的无符号整数,它含有原始消息的长度。经过前两步,生成了1024倍数的消息。如上图所示,被延展的消息表示为1024比特的数据块M1,M2,M3...Mn。

结合这两点:“同余”比较难以理解,填充比特的逻辑可以这么理解:填充的目的是为了形成1024的倍数,但是,最后一个1024块的最后128比特必须保留(用于记录原始消息的长度),举例:

原始消息895比特,那么需要填充1个比特。这样895+1+128=1024

原始消息896比特,这种情况下,加上128字节正好是1024,但是按照规则,仍是要填充1024个字节。

原始消息897比特,897+128>1024,所以需要填充。填充1023个比特。

● 第3步、初始化散列缓冲区

用512比特的缓冲区保存散列函数中间和最终结果。缓冲区可以是8个64比特的寄存器(a,b,c,d,e,f,g,h),这些寄存器初始化为64比特的整数(十六进制):

a=6a09e667f3bcc908

b=bb67ae8584caa73b

c=3c6ef372fe94f82b

d=a54ff53a5f1d36f1

e=510e527fade682d1

f=9b05688c2b3e6c1f

g=1f83d9abfb41bd6b

h=5be0cd19137e2179

这些值以逆序的形式存储,即字的最高字节存在最低地址(最左边)字节位置。这些字的获取方式如下:前8个素数取平方跟,取小数部分前64位。

● 第4步、处理1024比特的数据块消息

算法的核心是80轮迭代构成的模块。该模块在上图中标记为F,下图是其逻辑关系。每一轮都以512比特的缓冲区值abcdefgh作为输入,并且更新缓冲区内容。在第一轮时,缓冲区的值是中间值Hi-1.在任意t轮,使用从当前正在处理的1024比特的数据块(Mi)导出64位比特值Wt。每一轮还使用附加常数Kt,其中0<=t<=79表示80轮中的某一轮。这些常数的获取方式如下:前8个素数的立方根,取小数部分的前64位。这些常数提供了64位随机串集合,可以初步消除输入数据中的任何规则性。第80轮输出加到第1轮输入(Hi-1)生成Hi。缓冲区里的8个字与Hi-1中相应的字进行模264加法运算。

● 第5步、输出

当所有N个1024比特的数据块都处理完毕后,从第N阶段输出的便是512比特的消息摘要。

SHA-512算法使得散列码的任意比特都是输入端每1比特的函数。基本函数F的复杂迭代产生很好的混淆效果;即随机取两组相似的消息也不可能生成相同的散列码。除非SHA-512隐含一些直到现在都还没有公布的弱点。

SHA-1,MD5算法原理,布布扣,bubuko.com

时间: 2024-12-26 08:04:22

SHA-1,MD5算法原理的相关文章

MD5算法原理

//消息摘要:将任意长度的字符数组处理成定长的字符数组,用于确保原字符串不被修改, //也可以用做密码确认,如果密码一致,则MD5产生后的值必然一致,否则不相同 public class DataUtil { public static void main(String[] args) throws Exception { char[] ch={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',}; String sr

Atitit.md5 实现原理

1. 算法流程图2 2. MD5算法过程:2 2.1. 3. 处理分组数据3 3. MD5加密字符串实例5 4. Md5的历史7 4.1.1. MD27 4.1.2. MD47 4.1.3. MD57 5.  处理P:8 6. 参考8 1. 算法流程图 2. MD5算法过程: 对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值. 第一步.

MD5(单向散列算法)原理分析

注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆): MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有

MD5值算法原理

MD5原理说明 一.MD5算法介绍. MD5,即“Message-Digest Algorithm 5(信息-摘要算法)”,从名字来看就知道它是从MD3.MD4发展而来的一种加密算法,其主要通过采集文件的信息摘要,以此进行计算并加密.通过MD5算法进行加密,文件就可以获得一个唯一的MD5值,这个值是独一无二的,就像我们的指纹一样,因此我们就可以通过文件的MD5值来确定文件是否正确,密码进行加密后也会生成MD5值,论坛就是通过MD5值来验证用户的密码是否正确的. 二.MD5算法实现. MD5是输入

atitit.md5算法的原理&#160;与&#160;总结

atitit.md5算法的原理 与 总结 1. MD5的位数 128位1 2. 字节数组转换为32位字符串 base161 2.1. 十六进制字符用4个二进制位来表示1 2.2. byte[]和十六进制字符串相互转换2 3. md5的base64表示法3 4. 参考3 1. MD5的位数 128位 生成一个128为的字节数组.. 2. 字节数组转换为32位字符串 base16 每4位可以1111 正好0--f 可以完整的标识4位比特.. 2.1. 十六进制字符用4个二进制位来表示 十六进制的每个

分布式memcached学习(四)&mdash;&mdash; 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

[转载]MD5加密算法原理

本文转载自: http://blog.csdn.net/forgotaboutgirl/article/details/7258109 需要视频版的可以看一下泰克老林讲的MD5原理 下载地址: 网速太卡,周末上传后补上.... MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能: 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹): 不同的输入得到

分布式缓存技术memcached学习系列(四)—— 一致性hash算法原理

文章主目录 分布式一致性hash算法简介 分布式一致性hash算法使用背景 环形hash空间 映射key到环形hash空间 映射server节点到hash空间 映射key到server节点 添加server节点 删除server节点 虚拟节点的引入 节点变化数据分流的问题 一致性hash算法与取模算法的比较 参考文档 回到顶部 分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法

shiro自定义realm支持MD5算法(六)

1.1     散列算法 通常需要对密码 进行散列,常用的有md5.sha, 对md5密码,如果知道散列后的值可以通过穷举算法,得到md5密码对应的明文. 建议对md5进行散列时加salt(盐),进行加密相当 于对原始密码+盐进行散列.(盐就相当于加入一个随机数) 正常使用时散列方法: 在程序中对原始密码+盐进行散列,将散列值存储到数据库中,并且还要将盐也要存储在数据库中. 如果进行密码对比时,使用相同 方法,将原始密码+盐进行散列,进行比对. 1.2 MD5测试 package cn.qlq.