密码学hash函数-SHA256-512
[latexpage]
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)处理主循环模块
消息块是以512位分组为单位进行处理的,要进行64步循环操作(如图)。每一轮的输入均为当前处理的消息分组和得到的上一轮输出的256位缓冲区A、B、C、D、E、F、G、H的值。每一步中均采用了不同的消息字和常数。
(4)得出最终的Hash值
所有512位的消息块分组都处理完以后,最后一个分组处理后得到的结果即为最终输出的256位的消息摘要。
步函数是SHA-256中最为重要的函数,也是SHA-256中最关键的部件。其运算过程如下图:
每一步都会生成两个临时变量,即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位,其导出方法如图:
SHA-512逻辑
算法的输入时最大长度小于2128 位的消息,输出是512位的消息摘要,输入消息1024位的分组为单位进行处理。步骤1:附加填充位
填充消息使其长度模1024与896同余(即长度≡896(mod 1024)),即使消息已经满足上述长度要求,仍然需要进行填充,因此填充位数在1~1024之间,填充由一个1和后续的0组成。
步骤2:附加长度
在消息后附加一个128位的块,将其视为128位的无符号整数(最高有效字节在前),它包含填充前消息的长度。
前两步的结果产生了一个长度为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的加法运算。
步骤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/
密码学hash函数-SHA256-512的更多相关文章
- 密码学Hash函数
定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...
- 28.密码学知识-hash函数-5——2019年12月19日
5. 单向散列函数 "单向散列函数 --- 获取消息的指纹" 在刑事侦查中,侦查员会用到指纹.通过将某个特定人物的指纹与犯罪现场遗留的指纹进行对比,就能够知道该人物与案件是否存在关 ...
- Hash 函数及其重要性
不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...
- Hash函数及其应用
本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...
- 理解php Hash函数,增强密码安全
1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...
- 使用Hash函数和MAC产生伪随机数
基于Hash函数的PRNG 流程非常类似于对称密码的CTR工作模式 算法的伪码如下 m = ⌈n/outlen⌉ data = V W = the null String for i = 1 to m ...
- Hash函数
简介 哈稀函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度可以得到一个公认的结论:哈希函数之间性能的比较可以通过比较其在伪随机生成方面的比较来衡量. 一些常用的分析技术,例如泊松分布可用 ...
- HashMap中的hash函数
在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...
- hashCode及HashMap中的hash()函数
一.hashcode是什么 要理解hashcode首先要理解hash表这个概念 1. 哈希表 hash表也称散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构 ...
随机推荐
- webstorm 2016
2017.2.27更新 选择“license server” 输入:http://idea.imsxm.com/ 2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择“lice ...
- 【转载】linux2.6内核initrd机制解析
题记 很久之前就分析过这部分内容,但是那个时候不够深入,姑且知道这么个东西存在,到底怎么用,来龙去脉咋回事就不知道了.前段时间工作上遇到了一个initrd的问题,没办法只能再去研究研究,还好,有点眉目 ...
- Java读取文本文件
try { // 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw StringBuilder stringBuilder = new StringBuilder(); // 读入 ...
- 《你不知道的 CSS》之等比例缩放的盒子
你肯定已经知道,对于一个 img 元素而言,你可以单独地修改它的 width 或者 height 属性来设置它的大小,同时图片的比例还能够保持不变. 如下图所示,最上面是原始大小的图片,下面两张则分别 ...
- 百度display name为中文导致奔溃,productName和budlename区分出来
把"xxx-info.plist"中的"Bundle display name"的值改成了英文,或者把它的值修改成系统默认的"${PRODUCT_NA ...
- Kubernetes dashboard集成heapster
图形化展示度量指标的实现需要集成k8s的另外一个Addons组件: Heapster . Heapster原生支持K8s(v1.0.6及以后版本)和 CoreOS ,并且支持多种存储后端,比如: In ...
- Kubernetes用户指南(四)--应用检查和调试
一.调试 当你的应用开始运行,那么DEBUG是不可避免的问题. 早些时候,我们在描述的是如何通过kubectl get pods来获得Pod的简单状态信息. 但是现在,这里有更多的方式来获得关于你的应 ...
- 从C转到JAVA学习路之基本知识对比(转)
转自:http://blog.csdn.net/andywxf01/article/details/53502615 我一直在用C开发,想转到Java时最容易想到的事就是把C里写的代码和功能用JAVA ...
- Docker与PAAS
Docker与PAAS 学习了:https://blog.csdn.net/raindaywhu/article/details/52057103 Docker基于内存的:
- css - font-size
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...