SHA算法
安全Hash函数(SHA)是使用最广泛的Hash函数。由于其他曾被广泛使用的Hash函数都被发现存在安全隐患,从2005年至今,SHA或许是仅存的Hash算法标准。
SHA发展史
SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,由于很快被发现存在安全隐患,1995年发布了SHA-1。
2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。
由于SHA-1已经不太安全,目前SHA-2各版本已成为主流。

SHA-512
步骤1:填充附加位
填充消息使其长度≡896(mod 1024)。填充由一个1 和后续的0组成。
步骤2:附加长度
在填充后的消息后附加128位的块,将其视为无符号整数,它包含前消息的长度。
前两步的结果是产生了一个长度为1024整数倍的消息,以便分组。
步骤3:初始化Hash缓冲区
Hash函数中间结果和最终结果保存在512位的缓冲区,缓冲区由8个64位的寄存器(a、b、c、d、e、f、g、h)表示,并将这些寄存器初始化为下列64位的整数(十六进制)

每个寄存器内容获取的方式是:取前8个素数(2、3、5、7、11、13、17、19)取平方根,取小数部分的前64位。
步骤4:以1024位分组(128个字节)为单位处理消息并输出结果

总结SHA-512的运算如下:
H0 = IV
Hi = Hi-1+F(Hi-1,Mi)
MD = HN
IV是第三步中定义的abcdefgh缓冲区的初始值
Hi是第i个消息分组处理的最后一轮的输出
N为消息(包括填充和长度域)中的分组数
MD表示最后的消息摘要值
F表示轮函数
+为模264位加
轮函数的核心是具有80轮运算的模块,在图11.8中,该模块标记为F。下图是它的逻辑原理。

Kt是轮常数,每一轮的轮常数均不相同,用来使每轮的计算不同。这些常数获得方法如下:对前80个素数开立方根,取小数部分前64位。这些常数提供了64位随机串集合,可以初步消除输入数据中的统计规律。
对分组Mi进行消息扩展生成Wt,每个Wt64位,前16个Wt直接取自当前分组。余下的值按如下方式导出
Wt = δ1512(Wt-2) + Wt-7 + δ0512(Wt-15) + Wt-16
δ1512(x) = ROTR1(x)⊕ROTR8(x)⊕SHR7(x)
δ0512(x) = ROTR19(x)⊕ROTR61(x)⊕SHR6(x)
ROTRn(x)为对64位的变量x循环右移n位
SHRn(x)为对64位变量x向左移n位,右边填充0
+为模264位加

轮函数每一轮操作如下图

从上图可以看出,轮函数有两个特点:
1、轮函数输出的8个字中的6个是通过简单的轮置换实现的。如上图的阴影部分。
2、输出中只有2个字通过替代操作产生。
字e是将输入变量(d,e,f,g,h)以及轮常数Kt和轮消息Wt作为输入的函数。
字a是将除d之外的输入变量以及轮常数Kt和轮消息Wt作为输入的函数。
T1 = h + Ch(e,f,g) + (∑1512e) + Wt + Kt
T2 = (∑0512a) + Maj(a,b,c)
e = d + T1
a = T1 + T2
其中:
t为步骤数,0≤t≤79
Ch(e,f,g) = (e AND f)⊕(NOT e AND g) 条件函数(位运算):如果e,则f,否则g
Maj(a,b,c) = (a AND b)⊕(a AND c)⊕(b AND c) 当且仅当变量的多数(2个或者3个)为真时函数为真
(∑0512a) = ROTR28(a)⊕ROTR34(a)⊕ROTR39(a)
(∑1512e) = ROTR14(e)⊕ROTR18(e)⊕ROTR41(e)
SHA-512算法具有如下特性:Hash码的每一个位都是全部输入位的函数。基本函数F多次复杂重复运算使得结果充分混淆,从而使得随机选择两个消息,甚至于这两个消息有相似的特征,都不太可能产生相同的Hash码。除非SH-512中存在目前未公开的隐藏缺陷,找到两个具有相同摘要的消息的复杂度需要2256次操作,给定摘要寻找消息的复杂度需要2512次操作。
SHA算法的更多相关文章
- SHA算法摘要处理
byte[] input="sha".getBytes();//待做消息摘要算法的原始信息,可以是任意字符串 MessageDigest sha=MessageDigest.get ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- SHA算法(及示例)演变历史
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法.能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的 ...
- SHA算法:签名串SHA算法Java语言参考(SHAHelper.java)
SHAHelper.java package com.util; /** * @author wangxiangyu * @date:2017年10月16日 上午9:00:47 * 类说明:SHA签名 ...
- SHA安全散列算法简析
1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...
- 散列算法-SHA
一种生成信息摘要的算法.主要用于数据一致性和完整性的校验 SHA算法分很多版本,最大的分类是SHA-1和SHA-2.SHA-2包括很多子版本,SHA-224,SHA-256,SHA-384,SHA-5 ...
- 【转】java MessageDigest类的作用 :提供信息摘要 算法( MD5 或 SHA 等)的功能
一.结构和概述: java.lang.Object java.security.MessageDigestSpi java.security.MessageDigest 声明:public abstr ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- 使用BCrypt算法加密存储登录密码用法及好处
//导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...
随机推荐
- 美团java后台实习三面
美团一面(50分钟) 1.spring的理解. 1.项目相关 2.Redis缓存的应用 3.http解析的全过程 4.Java中的锁 5.Hashmap和concurrenthashMap源码 6.死 ...
- Android颜色配置器
一.Android Color设置 1.在xml文件中 想设置颜色直接设置background的属性或者其他的color属性.随便设置一个颜色如#000,再点击左边的颜色方块,弹出颜色选择器选择颜色 ...
- virtualenvwrapper 的安装和使用
virtualenvwrapper是用来管理virtualenv的扩展包,用着很方便. 1. 安装: #安装virtualenv (sudo) pip install virtualenv #安装vi ...
- ABP文档笔记 - 配置、设置、版本、功能、权限
配置 全局仅一个单例,保存一组配置信息,一般直接在模块的预启动事件中赋值or修改.没有Scope划分,无论租户还是房东亦或者用户读取的值都不会有差异.每个模块都可以扩展这个配置. 设置 它没有层级关系 ...
- scratch写的图灵机
大多数人对于scratch不感冒,因为觉得这是孩子玩的.的确,积木的方式不适合专业程序员写代码,然而别小看scratch,怎么说,它也是图灵完备的.而且,过程支持递归,虽然带不了返回值. 虽然计算速度 ...
- MongoDB 查询文档
语法 MongoDB 查询数据的语法格式如下: >db.COLLECTION_NAME.find() find() 方法以非结构化的方式来显示所有文档. 如果你需要以易读的方式来读取数据,可以使 ...
- Docker控制组
控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制. 它提供了很多有用的特性:以及确保各个容器可以公平地分享主机的内存.CPU.磁盘 IO 等资源:当然,更重要的是,控制组确保 ...
- MVC和MTV模式
著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...
- IDEA中Git的使用
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- blog写作心得体会
虽然写blog也挺久了,写出来的东西自己回顾的时候也会怀疑读者是否能看的明白,还是有种流水账的感觉,以后希望多从读者的角度出发.下面记录一些以后写博客的注意点. 具体关于某种技术点的小知识还有碰到的各 ...