SHA 算法的原理及实现

章节目录

  1. 简介
  2. 算法描述
    2.1 数据准备
    2.1.1 <数据填充
    2.1.2 数据分块
    2.1.3 设置初始 Hash 值
    2.2 Hash 计算
    2.2.1 SHA-1
    2.2.2 SHA-256
    2.2.3 SHA-512
  3. 实现

<b>作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!</b>

简介

SHA 算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

本文我们将介绍以下 SHA 算法: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

其中 SHA-224 和 SHA-256 使用相同的算法, 区别在于初始 Hash 值不同, 最终结果只使用算法输出的数据中的前224/256 bit.
SHA-384, SHA-512, SHA-512/224, SHA-512/256 使用相同的算法, 区别在于初始 Hash 值不同, 最终结果只使用算法输出的数据中的前384/512/224/256 bit.
而 SHA-2* 和 SHA-384,SHA-5* 算法也非常类似, 区别在于采用的字(Word) 长度不同, SHA-2*使用 32-bit 的字, 而 其他算法使用 64-bit 的字. 算法的迭代次数也不一样.

算法描述

本文中将介绍的 SHA 算法的计算步骤从大体上可以分为两步: <b>数据准备</b> 和 <b>Hash 计算</b>.

数据准备

在数据准备阶段, 我们也像 MD5 那样, 需要先将数据填充到特定长度,同时将原始数据长度填充进去,然后对数据进行分块, 因为我们的算法是基于块进行的. SHA 家族中的具体算法的实现大体相同, 只是填充长度的bit数,分块大小略有不同而已.

在数据准备阶段我们需要进行三个操作: 数据填充, 数据分块, 设置初始 Hash 值.

数据填充

我们使用 表示数据数据, 它的长度使用 表示.

对于算法 <b>SHA-1</b>, <b>SHA-224</b>, <b>SHA-256</b>, 数据填充方法如下:
先填充 1 bit 的 '1' 到数据末尾, 然后紧接着填充 k 个 '0', 这里 k 需要时最小的非负数且满足 , 也即是说需要将原始数据长度填充到<b>差64位就是512的整数倍</b>.
上述操作结束后, 将 表示为 64 bit 的bit数组填充到上述步骤所得的数据之后, 此时我们得到一个长度为512整数倍的数据.

举个例子:
假设我们的数据数据为"abc", 它的长度为24(bit). 我们通过计算得到 k 应该是 423(448 - 1 - 24). 此时填充之后的数据应该如下:

填充完成之后的长度是512(bit).

对于算法 <b>SHA-384</b>, <b>SHA-512</b>, <b>SHA-512/224</b>, <b>SHA-512/256</b>, 数据填充方法如下:
先填充 1 bit 的 '1' 到数据末尾, 然后紧接着填充 k 个 '0', 这里 k 需要时最小的非负数且满足 , 也即是说需要将原始数据长度填充到<b>差128位就是1024的整数倍</b>.
上述操作结束后, 将 表示为 128 bit 的bit数组填充到上述步骤所得的数据之后, 此时我们得到一个长度为1024整数倍的数据.

以上述的例子为例:
假设我们的数据数据为"abc", 它的长度为24(bit). 我们通过计算得到 k 应该是 871(896 - 1 - 24). 此时填充之后的数据应该如下:

填充完成之后的长度是1024(bit).

数据分块

填充后的数据需要被分块.

对于算法 <b>SHA-1</b>, <b>SHA-224</b>, <b>SHA-256</b>,
我们将数据分为 个 521-bit 的块, 分别表示为

512-bit 的块又可以被划分为 16 个字(32-bit Word), 分别表示为

对于算法 <b>SHA-384</b>, <b>SHA-512</b>, <b>SHA-512/224</b>, <b>SHA-512/256</b>
我们将数据分为 个 1024-bit 的块, 分别表示为

1024-bit 的块又可以被划分为 16 个字(64-bit Word), 分别表示为

设置初始 Hash 值

每个特定的 SHA 算法, 都有相应的初始 Hash 值. 在计算 Hash 之前, 我们需要先将初始值准备好.

为了减少文章篇幅, 这里我们不列出这些初始值和 Hash 计算过程中使用到的常量,后边算法实现中会给出相应数据.

Hash 计算

SHA-1

SHA-1 算法要求输入数据的长度不能大于 , 最小长度为0.

伪代码如下:

=

For i=1 to N:
{
    //1. 计算
=

//2. 初始化工作变量 a, b, c, d, e. 他们用来存储在第 i-1 次迭代式的 Hash 值
    // 他们的初始值就是我们在"设置初始 Hash 值"小节中所说的值.

// 3
    For t=0 to 79:
    {

    }

//4. 计算第 中间 hash 值

}

在经过 N 次迭代之后, 最终结果为 的字节表示依次连接所组成的字节数组.

SHA-256

SHA-256 算法要求输入数据的长度不能大于 , 最小长度为0.

SHA-224 算法的计算过程与 SHA-256 相同, 却别在于使用的初始化 Hash 值不同, 且 SHA-224 算法的最终结果是取 SHA-256 算法结果的前 224 bit.

伪代码如下:






For i=1 to N:
{
    //1. 计算
=

//2. 初始化工作变量 a, b, c, d, e, f, g, h. 他们用来存储在第 i-1 次迭代式的 Hash 值
    // 他们的初始值就是我们在"设置初始 Hash 值"小节中所说的值.

// 3
    For t=0 to 63:
    {

    }

//4. 计算第 中间 hash 值

}

在经过 N 次迭代之后, 最终结果为 的字节表示依次连接所组成的字节数组.

SHA-512

SHA-512 算法要求输入数据的长度不能大于 , 最小长度为0.

SHA-384 算法的计算过程与 SHA-512 相同, 却别在于使用的初始化 Hash 值不同, 且 SHA-384 算法的最终结果是取 SHA-512 算法结果的前 384 bit.

SHA-512/224 算法的计算过程与 SHA-512 相同, 却别在于使用的初始化 Hash 值不同, 且 SHA-512/224 算法的最终结果是取 SHA-512 算法结果的前 224 bit.

SHA-512/256 算法的计算过程与 SHA-512 相同, 却别在于使用的初始化 Hash 值不同, 且 SHA-512/256 算法的最终结果是取 SHA-512 算法结果的前 256 bit.

伪代码如下:




For i=1 to N:
{
    //1. 计算
=

//2. 初始化工作变量 a, b, c, d, e, f, g, h. 他们用来存储在第 i-1 次迭代式的 Hash 值
    // 他们的初始值就是我们在"设置初始 Hash 值"小节中所说的值.

// 3
    For t=0 to 79:
    {

    }

//4. 计算第 中间 hash 值

}

在经过 N 次迭代之后, 最终结果为 的字节表示依次连接所组成的字节数组.

算法实现

本人使用 go 语言实现了该算法. github:https://github.com/UselezzProgrammer/mycrypto

END!

SHA算法描述及实现相关推荐

  1. otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用

    from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...

  2. 7.使用php描述冒泡排序,PHP 数据结构 算法描述 冒泡排序 bubble sort

    PHP 数据结构 算法描述 冒泡排序 bubble sort 复制代码 代码如下: /** * 冒泡排序 bubble sort * * 原理:多次循环进行比较,每次比较时将最大数移动到最上面.每次循 ...

  3. 深度学习总结:GAN,原理,算法描述,pytoch实现

    文章目录 GAN的原理图: GAN的原版算法描述: pytorch实现 构建generator和discriminator: 生成fake data: 生成real data: 定义训练D的loss, ...

  4. 机器学习:SVM训练,SMO算法描述,启发式选择样本或变量

    文章目录 优化目标: 优化步骤: 对偶问题本质: 选择第一个样本点标准: 选择第一个样本点标准为:最不满足KKT条件的样本 如何判断样本点是否满足KKT条件? 满足和不满足KKT的情况: 量化不满足K ...

  5. 机器学习:决策树及ID3,C4.5,CART算法描述

    文章目录 概念理解 熵: 条件熵: 信息增益,互信息: 信息增益比 基尼指数 ID3算法描述 C4.5算法描述 CART (Classification and Regression Tree)算法描 ...

  6. 十大经典排序算法python_十大经典排序算法的算法描述和代码实现

    这里详细讲解了十大经典算法的分类,例如交换排序.插入排序.选择排序等比较类排序,以及计数排序.桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现.对冒泡排序 ...

  7. Java加密与解密的艺术~SHA算法实现

    MesssageDigest类也支持SHA算法,主要包含SHA-1.SHA-256.SHA-384和SHA-512四种算法.通过第三方加密组件包Bouncy Castle,可支持SHA-224算法. ...

  8. MD5 算法描述及实现

    MD5 算法的原理及实现 章节目录 简介 算法描述 实现 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 简介## Wiki对其 ...

  9. MD5算法之C#程序 MD5算法描述

    MD5算法之C#程序 MD5算法描述 MD5算法描述 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节 讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试 ...

最新文章

  1. codeforces A. Jeff and Digits 解题报告
  2. SpringBoot操作使用Spring-Data-Jpa
  3. 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
  4. url-pattern / /*匹配
  5. Spring Boot入门——全局异常处理
  6. 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
  7. 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法
  8. 地磅称重软件源码_电脑设备器件+塔吊主吊臂+撇渣管、丝杆+地磅称重传感器+极柱触头盒弯板+批式循环谷物干燥机+升降机标准节...
  9. Kudu报错:你的主机中的软件终止了一个已建立的链接
  10. Linux突然无法使用,是内存不足的问题
  11. U盘安装EXSi6.7出错menu.c32文件
  12. 诺基亚N1 WIFI感叹号消除
  13. 圆弧周长公式_弧长计算公式
  14. 计算机Word2010在线做题,Word2010试题练习题库(答案).doc
  15. 红色警戒2地图编辑器研究
  16. 3D相机技术 | 立体视觉传感器+TOF相机
  17. 《Linux命令行与shell脚本编程大全》 第二十五章 学习笔记
  18. eco淘客机器人-ECO云返利系统淘客
  19. ValueError: Expected parameter scale of distribution Normal to satisfy the constraint GreaterThan
  20. 《指数基金投资指南》读书笔记---指数基金入门知识

热门文章

  1. 西瓜书_1、符号学习、迁移学习、连接主义、假设空间、版本空间
  2. java.io.IOException: setDataSource failed.: status=0x80000000问题的解决
  3. 【Android】Phoenix OS(凤凰系统)启用root权限
  4. 分治法--最大连续序列和
  5. 《游戏设计艺术(第2版)》——学习笔记(4)第4章 体验从游戏中诞生
  6. 济南轻工业计算机排名,山东四大垃圾学院排行榜:山东轻工上榜,第三以航海技术为主...
  7. 数字字符串转化为数字
  8. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
  9. 电商网站搭建——服务器部署之部署Tomcat
  10. Android IOS WebRTC 音视频开发