文档章节

密码学hash函数-SHA256-512

Frank-yang
 Frank-yang
发布于 2017/09/04 11:17
字数 2238
阅读 78
收藏 1
点赞 0
评论 0

Hash函数又称哈希函数、散列函数、杂凑函数。它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。
Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h=H(M)。
在安全应用中使用的Hash函数称为密码学Hash函数。(单向性)、(抗碰撞性)

弱抗碰撞性:给定一个消息M,要找到另一个消息M',使得H(M)=H(M')很难。
强抗碰撞性:要找到两个随机明文M和M',使得H(M)=H(M')很难。

Hash函数特点:
1. 易压缩
2. 易计算
3. 单向性
4. 抗碰撞性
5. 高灵敏性

密码学Hash函数的应用范围

消息认证

消息认证是用来验证消息完整性的一种机制或服务。消息认证确保收到的数据确实和发送时的一样(即没有修改、插入、删除或重放)。
当Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要

数字签名

在进行数字签名过程中使用用户的私钥加密消息的Hash值,其他任何知道该用户公钥的人都能够通过数字签名来验证消息的完整性。

其他应用

单向口令文件。
入侵检测。
病毒检测。
构建随机函数(PRF)或用做伪随机数发生器(PRNG)

安全Hash算法(SHA)

安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

SHA-1

SHA-1产生160位的Hash值。
SHA1始终把消息当成一个位(bit)字符串来处理。

SHA-2

Hash值长度依次为256位、384位和512位,分别称为SHA-256、SHA-384和SHA-512,这些算法统称为SHA-2。
SHA-2同SHA-1类似,都使用同样的迭代结构和同样的模算术运算与二元逻辑操作。

SHA-1 SHA-224 SHA-256 SHA-384 SHA-512
消息摘要长度 160 224 256 384 512
消息长度 < 264 < 264 < 264 < 2128 < 2128
分组长度 512 512 512 1024 1024
字长度 32 32 32 64 64
步骤数 80 64 64 80 80

SHA-256算法

SHA-256算法的输入是最大长度小于264 位的消息,输出是256位的消息摘要,输入消息以512位的分组为单位进行处理。步骤如下
(1)消息填充

添加一个“1”和若干个“0”使其长度模512与448同余(即长度≡448(mod 512)).在消息后附加64位的长度块,其值为填充前消息的长度。从而产生长度为512整数倍的消息分组,填充后消息的长度最多为264位。

(2)初始化链接变量

链接变量的中间结果和最终结果存储于256位的缓冲区中,缓冲区用8个32位的寄存器A、B、C、D、E、F、G和H表示,输出仍放在缓冲区以代替旧的A、B、C、D、E、F、G、H。首先要对链接变量进行初始化,初始链接变量存储于8个寄存器A、B、C、D、E、F、G和H中:
A = 0x6a09e667 E = 0x510e527f
B = 0xbb67ae85 F = 0x9b05688c
C = 0x3c6ef372 G = 0x1f83d9ab
D = 0xa54ff53a H = 0x5be0cd19
初始链接变量是取自前8个素数(2、3、5、7、11、13、17、19)的平方根的小数部分其二级制表示的前32位。

(3)处理主循环模块

SHA256
消息块是以512位分组为单位进行处理的,要进行64步循环操作(如图)。每一轮的输入均为当前处理的消息分组和得到的上一轮输出的256位缓冲区A、B、C、D、E、F、G、H的值。每一步中均采用了不同的消息字和常数。
SHA256a

(4)得出最终的Hash值

所有512位的消息块分组都处理完以后,最后一个分组处理后得到的结果即为最终输出的256位的消息摘要。

步函数是SHA-256中最为重要的函数,也是SHA-256中最关键的部件。其运算过程如下图:
SHA256b
每一步都会生成两个临时变量,即T1、T2:
\[T_1=\Sigma_1(E)+Ch(E,F,G)+H+W_t+K_t\]
\[T_2=\Sigma_0(A)+Maj(A,B,C) mod 2^{32}\]
根据T1、T2的值,对寄存器A、E进行更新。A、B、C、D、E、F、G的输入值则一次赋值给B、C、D、F、G、H。
\(A=(T_1+T_2) mod 2^{32}\) \(E=(D+T_2) mod 2^{32}\)
其中\(Ch(E,F,G) = (E\wedge F)⊕(\overline{E}\wedge G)\)
\(Maj(A,B,C) = (A\wedge B)\bigoplus (A\wedge C)\bigoplus (B\wedge C)\)
\(\Sigma_0(A) = ROTR^{2}(A)\bigoplus ROTR^{13}(A)\bigoplus ROTR^{22}(A)\)
\(\Sigma_1(E) = ROTR^{6}(E)\bigoplus ROTR^{11}(E)\bigoplus ROTR^{25}(E)\)
且ROTRn (E)表示对32位的变量x循环右移n位。
Kt的获取方法是取前64个素数(2,3,5,7……)立方根的小数部分,将其转换为二进制,然后取这64个数的前64位作为Kt。其作用是提供了64位随机串集合以消除输入数据里的任何规则性。
对于每个输入分组导出的消息分组Wt,前16个消息字Wt(0<=t<=15)直接按照消息输入分组对应的16个32位字,其他的则按照如下公式来计算得出:
\[W_{t} = W_{t-16} + \sigma _0(W_{t-15}) + W_{t-7} + \sigma _1(W_{t-2}) , 16\leqslant t\leqslant 63\]
其中:\(\sigma _0(x) = ROTR^{7}(x) \bigoplus ROTR^{18}(x) \bigoplus SHR^3(x)\)
\(\sigma _1(x) = ROTR^{17}(x) \bigoplus ROTR^{19}(x) \bigoplus SHR^{10}(x)\)
式中,\(SHR^{10}(x)\)表示32位的变量x右移n位,其导出方法如图:
SHA256a

SHA-512逻辑

算法的输入时最大长度小于2128 位的消息,输出是512位的消息摘要,输入消息1024位的分组为单位进行处理。步骤1:附加填充位

填充消息使其长度模1024与896同余(即长度≡896(mod 1024)),即使消息已经满足上述长度要求,仍然需要进行填充,因此填充位数在1~1024之间,填充由一个1和后续的0组成。

步骤2:附加长度

在消息后附加一个128位的块,将其视为128位的无符号整数(最高有效字节在前),它包含填充前消息的长度。

SHA512
前两步的结果产生了一个长度为1024整数倍的消息。

步骤3:初始化Hash缓冲区

Hash函数的中间结果和最终结果保存于512位的缓冲区中,缓冲区用8个64位的寄存器(a,b,c,d,e,f,g,h)表示,并将这些寄存器初始化为下列64位的整数(十六进制值):
a = 6A09E667F3BCC908 e = 510E527FADE682D1
b = BB67AE8584CAA73B f = 9B05688C2B3E6C1F
c = 3C6EF372FE94F82B g = 1F83D9ABFB41Bd6B
d = A54FF53A5F1D36F1 h = 5BE0CD19137E2179
这些值以高位在前格式存储,也就是说,字的最高有效字节存于低地址字节位置(最左面)。这些字的获取方式如下:前8个素数取平方根,取小数部分的前64位。

步骤4:以1024位的分组(128个字节)为单位处理消息

算法的核心是具有80轮运算的模块。每一轮都把512位缓存区的值abcdefgh作为输入,并更新缓冲区的值。第一轮时,缓冲区里的值是中间值Hi-1。每一轮,如第t轮,使用一个64位的值Wt,该值由当前被处理的1024位消息分组Mi导出,导出算法是下面将要讨论的消息扩展算法(如下图)。每一轮还将使用附加的常数Kt,其中0<=t<=79,用来使每轮的运算不同。这些常数提供了64位随机串集合,可以初步消除输入数据里的统计规律。
第80轮的输出和第一轮的输入Hi-1相加产生Hi。缓冲区的8个字和Hi-1中对应的字分别进行模264的加法运算。
W

步骤5:输出

所有的N个1024位分组都处理完以后,从第N阶段输出的是512位的消息摘要。

总结SHA-512的运算如下:
H0 = IV
Hi = SUM64(Hi-1, abcdefghi)
MD = HN
其中,IV为第三步里中定义的abcdefgh缓冲区的初始值;abcdefghi为第i个消息分组处理的最后一轮的输出;N为消息(包括填充和长度域)中的分组数;SUM64为对输入对中的每个字进行独立的模264加;MD为最后的消息摘要值。

http://www.frankyang.cn/2017/09/02/mi-ma-xuehash-han-shusha256512/

© 著作权归作者所有

共有 人打赏支持
Frank-yang
粉丝 0
博文 29
码字总数 55893
作品 0
广州
关于加密的一些笔记

生成一个随机数,我们称之为salt, 然后在数据库中记录salt和h=hash(pwd + salt), 查询的时候,得到用户的口令p, 后从数据库中查出salt,计算hash(p+salt),看是不是等于h, 等于就是对的,...

6pker ⋅ 2015/02/05 ⋅ 0

Message Authentication Code_消息认证码算法

Message Authentication Code_消息认证码算法 内容来源于网络 部分内容摘自博客:http://blog.csdn.net/zzminer/article/details/8574287 MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持...

秋风醉了 ⋅ 2014/07/14 ⋅ 1

关于2018年比特币价格的分析

关于2018年比特币价格的分析 (本文讲述了关于比特币未来的趋势,以及从技术层面上对比特币算法的实现进行了剖析) Different people have different views!!! 关于2比特币的前景,大致有...

杰思 ⋅ 03/20 ⋅ 0

python import hashlib出现问题

import hashlib时出现如下问题: >>> import hashlib ERROR:root:code for hash md5 was not found. Traceback (most recent call last): File "/usr/local/python3.2/lib/python3.2/hashlib......

大黄 ⋅ 2012/08/05 ⋅ 10

python之hashlib模块

hashlib模块 hashlib模块提供了很多加密的算法,该模块实现了许多不同的安全散列和消息摘要算法的通用接口。包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义...

东丶 ⋅ 2017/08/26 ⋅ 0

什么是hash函数

哈希函数(Hash Function),也称为散列函数,给定一个输入,它会算出相应的输出。哈希函数的主要特征是: 输入x可以是任意长度的字符串 输出结果即H(x)的长度是固定的 计算 H(x) 的过程是高...

人口贩卖专家 ⋅ 03/06 ⋅ 0

字符串以及文件的hashlib的md5和sha1等的运用

hashlib的md5和sha1等的运用 import hashlib print(hashlib.algorithmsavailable) print(hashlib.algorithmsguaranteed) #MD5 import hashlib hashobject = hashlib.md5(b'Hello World') pri......

独钓渔 ⋅ 2014/11/25 ⋅ 0

GodSharp/GodSharp.Encryption

GodSharp.Encryption Common encryption method for .NET. Hash Algorithm MD5 SHA SHA1 SHA256 SHA384 SHA512 HMAC HMACMD5 HMACRIPEMD160 HMACSHA1 HMACSHA256 HMACSHA384 HMACSHA512 Meth......

GodSharp ⋅ 2017/04/12 ⋅ 0

dd_rescue 1.44 发布,磁盘数据恢复工具

dd_rescue 1.44 发布,此版本的 MD5 插件重命名为 hash,反射其他的密码散列,比如:支持sha1,sha256,sha224,sha512,sha384 。 (命令行语法保持向后兼容)。 GNU ddrescue (dd rescue, ddres...

oschina ⋅ 2014/05/24 ⋅ 0

Ruby 2.3.0-preview1 发布,新增 LiteralPragma

Ruby 2.3.0-preview1 发布,此版本是 Ruby 2.3.0 的第一个预览版本,包括新特性和改进: 新增 Frozen String LiteralPragma 新增 Safe navigation operator,同时添加了 Array#dig 和 Hash#d...

oschina ⋅ 2015/11/13 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 23分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 32分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 34分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 35分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 41分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 42分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 46分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 52分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 55分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部