读了一下SHA-1和MD5的算法

之前总是听说这两个算法,也偶尔用到,但是从来没有想过是怎么去完成的。

对于未知的恐惧,会促使人类不断的学习。然后就出现了庄子的那句名言:知识是无限的,人命是有限的,拿有限的人命去搞无限的知识,真2B啊。即便如此,有些唾手可得的知识还是可以花一些时间去看看的。

当然,首先还是wiki,这里为wiki点个赞,等咱有闲了也去写,等咱有钱了也去捐。

安全散列算法Secure Hash Algorithm) http://zh.wikipedia.org/wiki/SHA1

消息摘要算法第五版(Message-Digest Algorithm 5,缩写为MD5)http://zh.wikipedia.org/wiki/MD5

算法我就不搬运了,反正就那么点儿,而且两个算法还是一样的。重要的是上面两个英文全称,很多正经事情都是名副其实的。

好歹说两句我的理解,不管是MD5还是SHA系列,算法都是一样的,不一样的是其中的一些细节和最后输出的长度。其中hash值的初始化和个数以及key值的初始化,这3个方面的差别,衍生出一系列的不同算法。我们最直观的就是能看到MD5是128bits的,SHA1是160bits的,以及一堆长度自明的算法,SHA224/SHA256/SHA384/SHA512,通常我们看到的字符串的长度就是上面说的bits长度除以4。凭直觉,当然是越长的越安全。对,这里的安全这个概念,其实是说的不容易“碰撞”,也就是不同的内容得到相同的hash值,这种事情是不可避免要发生的,一旦发生就可能会很糟糕。

我用直白的语言描述一下这个算法,以表明我真的看懂了。

输入是一堆数据,数据就是0和1,反正计算机里面的数据都是0和1。

数据有长短,为了处理方便,第一步就是将数据补到512的倍数长度,这补上来的部分,第一位是1,中间是0,后面是64位的表示数据真实长度的数。当然MD5是小端的,SHA系列是大端的,我也不知道为什么,反正算法里面是这样写的。

第二步就是将这512n长度的数据分成n个部分,每个部分512bits。

第三步就是循环处理每个部分,搞n次。在搞之前,会定义一堆的数h,大概可以算作hash种子吧,不过我也没看到人家怎么叫,32位的或者64位的,4个5个或者8个,反正就是看具体那个算法了。

第四步我们看这n次的每一次。将512bits的数据分成32bits*16,然后在将这16个数扩展成64个或者80个,这当然也是看算法,至于怎么扩展,就是隔着取几个,异或搞搞,循环移动搞搞,复杂的再加加减减,反正就是一些基本预算了。

第五步就是循环搞着64或者80个数,根之前定义的hash种子,每个数算出两个数来,再来来回回将hash种子小折腾一番。每搞一次,就算出一堆数,将这对数加到对应的hash种子上。

我们可以看到通过第第四步和第五步的折腾,64n次或者80n次后,最初初始化的hash种子已经面目全非了,算是hash果实了。

第六步,就是将hash果实串起来,收工。比如4个32位hash果实,串起来就得到128位的MD5。

这样我们就可以将任意长度的数据变成固定长度的信息数据,并且实际上还很难反推,从其中大量的逻辑操作就可以看出来。理论上……理论上还是可以计算的吧,就是计算量有点儿大。

时间: 2024-10-26 17:27:04

读了一下SHA-1和MD5的算法的相关文章

[MD5变形算法练习] AutoRun Design Specialty算法分析

[破文标题][MD5变形算法练习] AutoRun Design Specialty算法分析[破文作者]静心学习[作者邮箱][email protected][作者主页]http://www.cnblogs.com/dacainiao/[破解工具]OD, DEDE, IDA[破解平台]xp sp3[软件名称]AutoRun Design Specialty[软件大小]6.98MB[原版下载]http://www.alleysoft.com/autorundesignspecialty/ARDSS

BASE64,MD5,SHA,HMAC加密與解密算法(java)

package com.ice.webos.util.security; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.Key; import java.security.MessageDigest; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.c

MD5值算法原理

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

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

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

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

http://snowolf.iteye.com/blog/379860 加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) H

BASE64与单向加密算法MD5&SHA&MAC

言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码) 复杂的对称加密(DES.PBE).非对称加密算法: DES(Data Encryption S

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码)

Android MD5校验码的生成与算法实现

在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 16 个字节转换成 16 进制表示即可. 下面是一个可生成字符串或文件MD5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值

MD5 与 SHA 在 Delphi 中函数实现,加密密码

MD5 与 SHA 在 Delphi 中函数实现. 为了加密密码,必须使用一种算法,查询资料,比较好的方法是使用:MD5等算法,参考:Delphi XE8 支持MD5 第一种方式是:引用 System.Hash 中的 THashMD5, (或者 THashSHA1,THashSHA2) 参考 官方文档. http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Hash 简单用法:  hashmd5 := THashMD5.Create.G