密码学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/

时间: 2024-10-07 07:51:19

密码学hash函数-SHA256-512的相关文章

密码学Hash函数

定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H(x)=H(y),则称为碰撞. 应用: 用于验证数据的完整性,即判断数据是否被篡改过. 密码学Hash函数的定义: 在安全应用中使用的Hash函数. 密码学Hash函数的应用: 1.消息认证 Hash码能够通过如下不同方法用于提供消息认证 a) 使用对称密码E加密消息和Hash码,由于只有A和B共享

密码学---hash函数(SHA-256)的C++实现

1 //SHA-256 2 /*理解算法最重要,最好自己动手实现试试看,可以使用MFC写一个简单的交互界面*/ 3 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 8 using namespace std; 9 10 #define SHA256_ROTL(a,b) (((a>>(32-b))&(0x7fffffff>>(31-b)))|(a<<

密码学之《Hash函数》

延续昨天的肚子疼- -我们来继续看密码学. Hash函数是啥? Hash函数将任意长度的消息压缩为某一固定长度的消息摘要的函数.是多对一的映射. Hash函数有啥用? 1. 最基础的,加密.sha系列,md5等等一大波常用的加密都属于Hash函数. 2. 用于数字签名(关于数字签名,请看:http://www.cnblogs.com/kuoaidebb/p/4183605.html).主要作用有两个:一,提高签名速度.由于Hash函数是消息摘要,在一定程度上缩短需要签名的消息的长度.二,不泄露签

使用Hash函数和MAC产生伪随机数

基于Hash函数的PRNG 流程非常类似于对称密码的CTR工作模式 算法的伪码如下 m = ⌈n/outlen⌉ data = V W = the null String for i = 1 to m wi = H(data) W = W || wi data = (data + 1) mod 2seedlen return leftmost n bits of W 说明: V是种子,seedlen为V的长度,n是需要的输出位数,H是Hash函数 对于诸如SHA-2等强密码学Hash算法,目前还

应用Hash函数

计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单项函数.各种加密函数都可以被认为是单向函数的逼近.Hash函数(或者成为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有另外的含义.实际中的Hash函数是指把一个大范围映射到一个小范围.把大范围

什么是HASH函数(经典例子)

让我们先来了解一些基本知识,作作预热只有这样才能更好的了解hash.Hash, 一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数.HASH主要用于信息安全

Hash函数及其应用

本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人类”的语言描述,单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单向函数.各种加密函数都可以被认为是单向函数的逼近.Hash函数(或者称为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有

Bloom filter的实现以及常用的hash函数

bloom filter利用时间换空间的思想,利用多个哈希函数,将一个元素的存在状态映射到多个bit中,特别是在网络环境中,BF具有广泛的用途,关键问题就是要减少false positive rate(可以设置参数来调节),扩展有 counting BF.这里选用的hash函数是表现较好的 BKDRHash , SDBMHash, DJBHash . Bloom-filter代码: bloom_filter.h #ifndef __BLOOM_FILTER_H__ #define __BLOOM

Hash函数的安全性

我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定的x,要找到一个y满足y<>x,h(x)=h(y),在计算上不可行,称为弱无碰撞. 3.要找到任意一对数,x,y,y<>x,满足h(x)=h(y),在计算上不可行,则称为强无碰撞.(包含弱无碰撞) 假定:一个取整数的随机变量,服从1到n的随机分布,一个含有k个这种变量的集合,至少有一对