目录

简介

SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种。这三种算法都是由美国NIST制定的。

NIST的全称是美国国家标准与技术研究所,主要来制定各种标准。

本文将会讲解下NIST和SHA各种算法的关系。

SHA1

在密码学中,SHA-1(Secure Hash Algorithm 1)是一种加密哈希函数,它接受一个输入,并产生一个160位(20字节)的哈希值,称为信息摘要。

我们先看下SHA1的加密流程图:

上面的A,B,C,D,E都是32bits的state。

F是一个非线性函数。

<<< 表示额是左移操作,红色的加号表示的是加法然后对232取模。

SHA1算法很简单,在2005年之后,SHA1被认为是不安全的,截至2010年,许多组织都建议更换SHA-1。

NIST在2011年正式废止了SHA-1的使用,并在2013年不允许将其用于数字签名。

所有主要的网络浏览器厂商在2017年都停止接受SHA-1 SSL证书。

SHA2

SHA-2(Secure Hash Algorithm 2)也是由美国国家安全局(NSA)设计的一组加密哈希函数,于2001年首次公布,它们采用Merkle-Damgård结构。

SHA-2和SHA-1相比,包括了重大的变化。SHA-2系列包含六个哈希函数,分别是SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。

我们看下SHA2的算法流程:

我们看下这几个函数表示什么意思:

SHA3

2006年,NIST组织了NIST哈希函数竞赛,以创建一个新的哈希标准SHA-3。SHA-3并不是要取代SHA-2,因为目前还没有证明对SHA-2的重大攻击。但是由于MD5、SHA-0和SHA-1的成功攻击,NIST认为需要一种可替代的、不同的加密哈希,这就是SHA-3。

在这个比赛中,最终Keccak算法胜出,被选为SHA3的标准。

SHA3算法是基于海绵结构的,我们看下海绵结构的工作原理:

这个函数被分成了两部分,左边部分叫做吸收部分,右边部分叫做输出部分,一吸一出,像是海绵一样,所以叫做海绵函数。

P表示的是输入的字符串,Z表示的时候输出字符串。

一个海绵函数由三部分组成,分别是state, 函数f和填充函数pad。

state就是上图的r+c部分,r被称为Bitrate, c被称为Capacity

P被分成n份,每一份都会跟Bitrate进行异或操作,如果P的长度不是Bitrate的整数倍,那么需要使用Pad函数进行填充。

每一轮,Bitrate跟P进行异或操作的结果作为最新的Bitrate, 然后生成新的state,然后这个state又被f(state)来替换。

其中函数 f 是 从n个{0,1} 到n个{0,1}的映射。

就这样一轮一轮进行下去,直到所有的P都参与了运算。

输出部分是将最终生成的state进行f运算,每次运算都取Bitrate部分作为输出,从而得到最终的输出。

本文已收录于http://www.flydean.com/sha1-2-3/

> 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

> 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

密码学系列之:NIST和SHA算法的更多相关文章

  1. 密码学系列之:memory-hard函数

    密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...

  2. 密码学系列之:碰撞抵御和碰撞攻击collision attack

    密码学系列之:碰撞抵御和碰撞攻击collision attack 简介 hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击. 今天和大 ...

  3. 密码学系列之:feistel cipher

    密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...

  4. 密码学系列之:memory-bound函数

    密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...

  5. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  6. 密码学系列之:Argon2加密算法详解

    目录 简介 密钥推导函数key derivation function Password Hashing Competition Argon2算法 Argon2的输入参数 处理流程 简介 Argon2 ...

  7. 分布式理论系列(二)一致性算法:2PC 到 3PC 到 Paxos 到 Raft 到 Zab

    分布式理论系列(二)一致性算法:2PC 到 3PC 到 Paxos 到 Raft 到 Zab 本文介绍一致性算法: 2PC 到 3PC 到 Paxos 到 Raft 到 Zab 两类一致性算法(操作原 ...

  8. SHA算法摘要处理

    byte[] input="sha".getBytes();//待做消息摘要算法的原始信息,可以是任意字符串 MessageDigest sha=MessageDigest.get ...

  9. 密码学系列之:blowfish对称密钥分组算法

    目录 简介 blowfish详解 密钥数组和S-box 密钥数组 S-box 生成最终的K数组 blowfish blowfish的应用 blowfish的缺点 简介 Blowfish是由Bruce ...

随机推荐

  1. This is my first blog----文件操作基本流程

    一,文件操作基本流程. 计算机系统分为: 计算机硬件, 操作系统, 应用程序三部分 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件 ...

  2. Java内存区域略解

    概览 分述 程序计数器 用于记录该线程的执行位置,便于跳转或者线程中断后的恢复 方法区 Java虚拟机规范中把 原本用于存储常量,静态变量和类的元信息,但java1.7将字符串常量移到了堆中,java ...

  3. python列表,元组,字典,集合的比较总结

    这四个都是python中的序列,用于存放数据,他们区别总结如下:   列表list 元组tuple 字典dictionary 集合set 是否可变 可变 不可变 可变 可变 是否有序 有序 有序 无序 ...

  4. python之Click的简单应用

    一.介绍 Click是一个Python包,用于以可组合的方式创建漂亮的命令行界面,只需要很少的代码.这是"命令行界面创建工具包".它具有高度可配置性,但具有开箱即用的合理默认值. ...

  5. 用程序员的思维了解Filecoin

    程序员接触一个新技术惯用步骤: 先搜索引擎搜索一波,找个最简单的解释.如果有了个大概的概念,就前往2.否则循环1->1->1...直到有个大概的概念为止. 上官网跑一遍. 各种论坛社区溜达 ...

  6. 巧用 SVG 滤镜还能制作表情包?

    本文将介绍一些使用 SVG feTurbulence 滤镜实现的一些有趣.大胆的的动效. 系列另外两篇: 有意思!强大的 SVG 滤镜 有意思!不规则边框的生成方案 背景 今天在群里面聊天,看到有人发 ...

  7. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  8. 「HTML+CSS」--自定义加载动画【005】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  9. 扩展中国剩余定理(EXCRT)学习笔记

    扩展中国剩余定理(EXCRT)学习笔记 用途 求解同余方程组 \(\begin{cases}x\equiv c_{1}\left( mod\ m_{1}\right) \\ x\equiv c_{2} ...

  10. [BFS]A. 【例题1】走迷宫

    A . [ 例 题 1 ] 走 迷 宫 解析 简单的BFS模板题 Code #include <bits/stdc++.h> #define N 1005 using namespace ...