SHA256算法介绍

摘要:
So,NIST发布了SHA的其他三个变体,256/384/512,这三个函数都将讯息对应到更长的讯息摘要。对于任意长度的消息,SHA256都会产生一个256bit长度的散列值,称为消息摘要,可以用一个长度为64的十六进制字符串表示。

扒一扒密码学的前世今生

二战结束以后,密码学在相当长的一段时间内都像军火一样被各国政府严密看管。美国国家安全局(NSA)雇佣了一大批密码学家在五角大楼内研究最前沿的密码学,严令禁止技术出口及民用。

1972年,IBM研制出了对称密码体制加密算法

1975年美国国家标准局将对称密码体制加密算法颁布为国家标准,称为数据加密标准DES。DES的公布,也促使了大量封禁已久的密码学著作流入民间。

1976年,W.Diffie和M.Hellman发表了《密码学的新方向》一文,文中首次提出了适应网络保密通信需求的公钥密码思想,掀起了公钥密码学的序幕。

次年,美国的Ronald Rivest、Adi Shamir和Len Adleman提出了第一个建立在大数因子分解基础上的公钥密码算法,即著名的RSA算法。

为了寻找破解RSA的方法,1985年,英国牛津大学物理学家David Deutsch提出了量子计算机的初步设想。

同年,美国科学家 Bennet 根据关于量子密码学的协议,在实验室首次实现了量子密码加密信息的通信。尽管通信距离只有30厘米,但已经足以证明量子加密的可用性。

同样是这一年,Victor Miller和Neal Koblitz分别提出了如今家喻户晓的椭圆曲线密码学(ECC)。使用ECC加密的256位密钥所提供的安全性,与使用RSA或DSA加密的3072位密钥相当。这意味着ECC算法所要求的带宽更低、存储空间更小。

步入90年代初,麻省理工学院教授Ronald Rivest提出了MD4信息摘要算法,它是一种用来测试信息完整性的哈希函数。MD4的实现,旋即开启了哈希函数的大门,包括后来Ronald Rivest重新提出的安全性更优的MD5,由NSA和NIST提出的SHA函数家族以及Hans Dobbertin,Antoon Bosselaers 和 Bart Prenee提出的RIPEMD。在这一时期,密码学家来学嘉和JamesMasseey还提出了在软硬件实现上比DES更优的国际数据加密算法,即IDEA

随着计算机能力的不断提高,不少密码体系比如主流的DES正逐步面临淘汰。1998年,电子边境基金会(EFF)利用耗资25万美元打造的专用计算机,仅用56个小时就成功破解了DES密钥。随后在1999年,EFF仅用了22小时15分就完成了破解工作。此后,美国国家安全局宣布弃用DES,转而启用由比利时密码学家Joan Daemen和Vincent Rijmen所提出的Rijndael加密算法,即高级加密标准AES

进入千禧年以后,MD4、MD5、RIPEMD(RIPEMD-160仍然安全)SHA1以及RSA-768的强抗碰撞性相继被攻破RSA-1024业已在2012年前后被停用。随着区块链技术的兴起,ECC俨然成为密码学殿堂最亮眼的新星,但依旧难逃量子计算技术的威胁。

SM2算法全称为SM2椭圆曲线公钥密码算法,是国家密码管理局2010年12月发布的第21号公告中公布的密码行业标准。SM2算法属于非对称密钥算法,使用公钥进行加密,私钥进行解密,已知公钥求私钥在计算上不可行。发送者用接收者的公钥将消息加密成密文,接收者用自已的私钥对收到的密文进行解密还原成原始消息。

SM2算法相比较其他非对称公钥算法如RSA而言使用更短的密钥串就能实现比较牢固的加密强度,同时由于其良好的数学设计结构,加密速度也比RSA算法快。

SM4算法全称为SM4分组密码算法,是国家密码管理局2012年3月发布的第23号公告中公布的密码行业标准。SM4算法是一个分组对称密钥算法,明文、密钥、密文都是16字节,加密和解密密钥相同。加密算法与密钥扩展算法都采用32轮非线性迭代结构。解密过程与加密过程的结构相似,只是轮密钥的使用顺序相反。

SHA256的家族史

SHA0函数是由NIST设计并于1993年发表,发布之后很快被破解(天灰灰累不累),1995年发表了SHA1,but,SHA-1和SHA-0的算法只在压缩函数的讯息转换部分差了一个位元的循环位移,他们可将一个最大2的64次方位元的讯息,转换成一串160位元的讯息摘要;其设计原理相似于MIT教授Ronald L. Rivest所设计的密码学杂凑算法MD4和MD5,然鹅相继被攻破。

So,NIST发布了SHA的其他三个变体,256/384/512,这三个函数都将讯息对应到更长的讯息摘要。2004年2月,发布了一次FIPS PUB 180-2的变更通知,加入了一个额外的变种SHA-224",这是为了符合双金钥3DES所需的金钥长度而定义。这些算法标准的区别除了生成摘要的长度,循环运行次数等有一些微小的差异之外,基本结构大致相同。

散列函数是把消息压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫散列值的指纹。

散列值通常用一个短的随机字母和数字组成的字符串代表。

对于任意长度的消息,SHA256都会产生一个256bit长度的散列值,称为消息摘要,可以用一个长度为64的十六进制字符串表示。

Download file – your conversion was successful (online-convert.com)在线测试区

SHA256算法流程

信息预处理

1、填充比特

在报文末尾进行填充,使报文长度= 448 (mod 512),规则为先补第一个比特为1,然后都补0

若长度刚好为448也必须填充,此时需要增加512位,即填充的位数[1,512]

2、附加长度值

附加长度值就是将原始数据的长度信息(无符号整数64bit)附加到已经填充消息的后面。

前两个附加长度就构成了一个长度为512整数倍的消息结构。

3、初始化数据

SHA256中用到了8个散列初始值

h0 := 0x6a09e667 h1 := 0xbb67ae85

h2 := 0x3c6ef372 h3 := 0xa54ff53a

h4 := 0x510e527f h5 := 0x9b05688c

h6 := 0x1f83d9ab h7 := 0x5be0cd19

这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来

根号2 = 0.414213562373095048 = 6*16-1+a*16-2+0*16-3+……

于是,质数2的平方根的小数部分取前32bit就对应出了0x6a09e667

64个常量如下:

428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2

这些常量是对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来。

SHA256算法流程步骤呐

将消息M分解成n个512-bit大小的块

一个256-bit的摘要的初始值H0,经过第一个数据块进行运算,得到H1,即完成了第一次迭代H1经过第二个数据块得到H2,……,依次处理,最后得到Hn。Hi是第i个消息分组处理的最后一轮的输出。

H0[8]=[h0,h1,h2,h3,h4,h5,h6,h7]。Hi被描述8个小块,这是因为SHA256算法中的最小运算单元称为“字”(Word),一个字是32位。

1)构造64个字,对于每一个512bit的块,将其分解为16个32bit的(big-endian)字,记为w[0],w[1],……,w[15]

其余的字由如下迭代公式得到:Wt = σ1( W t − 2 ) + W t − 7 + σ 0 ( W t − 15 ) + W t − 16

2)进行64次加密循环,Hi按照一定规则不断更新

SHA256算法介绍第1张

SHA256算法介绍第2张

参考:大话密码学史:过去、现在和未来 - 知乎 (zhihu.com)

密码发展史之近现代密码_国家密码管理局门户 (sca.gov.cn)

(17条消息) SHA256算法原理详解_随煜而安的专栏-CSDN博客_sha256

SHA算法 - block2016 - 博客园 (cnblogs.com)

补充SHA512的算法介绍,因和SHA256很相似,所以简单改改256的。

信息预处理

1、填充比特

在报文末尾进行填充,使报文长度= 896 (mod 1024),规则为先补第一个比特为1,然后都补0

若长度刚好为896也必须填充,此时需要增加1024位,即填充的位数[1,1024]

2、附加长度值

附加长度值就是将原始数据的长度信息(无符号整数128bit)附加到已经填充消息的后面。

前两个附加长度就构成了一个长度为1024整数倍的消息结构。

3、初始化数据

SHA256中用到了8个散列初始值

h0 := 0x6a09e667f3bcc908 h1 := 0xbb67ae8584caa73b

h2 := 0x3c6ef372fe94f82b h3 := 0xa54ff53a5f1d36f1

h4 := 0x510e527fade682d1 h5 := 0x9b05688c2b3e6c1f

h6 := 0x1f83d9abfb41bd6b h7 := 0x5be0cd19137e2179

这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前64bit而来

根号2 = 0.414213562373095048 = 6*16-1+a*16-2+0*16-3+……

于是,质数2的平方根的小数部分取前32bit就对应出了0x6a09e667f3bcc908

64个常量是对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前64bit而来。

SHA512算法流程步骤呐

将消息M分解成n个1024-bit大小的块

一个512-bit的摘要的初始值H0,经过第一个数据块进行运算,得到H1,即完成了第一次迭代H1经过第二个数据块得到H2,……,依次处理,最后得到Hn。Hi是第i个消息分组处理的最后一轮的输出。

H0[8]=[h0,h1,h2,h3,h4,h5,h6,h7]。Hi被描述8个小块,这是因为SHA512算法中的最小运算单元称为“字”(Word),一个字是64位。

1)构造64个字,对于每一个1024bit的块,将其分解为16个64bit的(big-endian)字,记为w[0],w[1],……,w[15]

其余的字由如下迭代公式得到:Wt= σ1( Wt − 2) + Wt− 7+ σ0( Wt − 15) + Wt − 16

σ1(x)=R1(x)⊕R8(x)⊕S7(x)

σ0(x)=R19(x)⊕R61(x)⊕S6(x)

Rn(x)对变量x循环右移nbit

Sn(x)对变量x左移nbit,右边填充0

SHA256算法介绍第3张

2)进行80次轮函数循环,Hi按照一定规则不断更新

Hi=Hi-1+F(Hi-1,Mi)

其中F为轮函数,轮函数要进行80轮运算

SHA256算法介绍第4张

SHA256算法介绍第5张

SHA256算法介绍第6张

免责声明:文章转载自《SHA256算法介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java转python代码[笔记]--Ubuntu安装Oracle Instant Client下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

干货|自适应大邻域搜索(ALNS)算法求解带时间窗的车辆路径规划问题(附java代码)

转眼距离开学又过去一个多月了,不知道大家在家里学习的怎么样?这段时间小编在家里也没闲着,时隔多日,再次为大家带来干货内容。 邻域搜索类启发式算法有很多种,比如禁忌搜索啦,模拟退火啦,变邻域搜索啦等等。这次带来的自适应大邻域搜索代码,相对上述几种会更复杂,编写相对全面。 小编在编写代码时,主要采用git-hub上一位作者de.markusziller的代码,...

Java技术栈

内容: 1、Java基础(JavaSE) 2、数据结构与算法与设计模式 3、计算机理论知识 4、数据库 5、Java web(JavaEE) 6、消息队列 7、Linux及服务器相关 8、分布式相关 9、拓展技能 参考:https://blog.csdn.net/ferrari_cal/article/details/79093826 以下整理结合个人实际...

凸包算法

包含点s集合中所有点的最小凸多边形的名字叫凸包 Graham扫描算法: 1.从y轴最低点作为起始点p0 2.从p0开始极坐标扫描,依次遍历图中所有的点,按极坐标角度大小,逆时针方向遍历 3.如果新遍历的点能产生一个左旋转,则将该点添加到凸包中,否则舍去 实现流程 1.彩色图像转灰度图像 2.灰度图像转二值图像 3.通过发现轮廓得到候选点 4.计算凸包 5...

FLOYD 求最小环

首先 先介绍一下 FLOYD算法的基本思想   设d[i,j,k]是在只允许经过结点1…k的情况下i到j的最短路长度则它有两种情况(想一想,为什么):最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1]最短路不经过点k,d[i,j,k]=d[i,j,k-1]综合起来: d[i,j,k]=min{d[i,k,k-1]+d[k,j,k-...

常见的聚类算法

常见的聚类算法 1. K-Means(K均值)聚类 算法步骤: (1) 首先我们选择一些类/组,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知类的数量(即中心点的数量)。 (2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。 (3) 计算每一类中中心点作为新的中心点。 (4) 重复以上步...

操作系统概念学习笔记三 cpu调度算法

一 基本概念 1 队列中的记录通常是进程的进程控制块。 2 CPU调度决策可在如下四种环境下发生 a 当一个进程从运行状态切换到等待状态 例如,I/O请求或调用wait以等待一个子进程的终止 b 党一个进程从运行状态切换到就需状态 例如,当出现中断 c 当一个进程从等待状态切换到就需状态 例如,I/O完成 d 当一个进程终止 当调度只能发生在第一和第...