标准相关信息

  • 编号:NIST FIPS 202
  • 名称:SHA-3标准:基于置换的哈希与可扩展输出函数(SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions)

操作基本设计

操作单元

  • 三维数据向量,5 * 5 * w(w为2的方幂)bit
  • SHA-3中取w = 64,故数据向量总大小为1600bit
  • l = log w / log 2,对于SHA-3,l = 6

标记法

  • x:横向,中心为原点,左至右方向,3 4 0 1 2
  • y:纵向,中心为原点,下至上方向,3 4 0 1 2
  • z:面向,最前端为原点,前至后方向,0 1 2 ... w-1
  • A[x, y, z]:表示在位置(x, y, z)的位
  • S[n]:表示将整个数据向量展开为序列时位置为n的位

命名

  • 零维

    • 位(Bit):具体位置
  • 一维
    • 行(Row):横向序列
    • 列(Column):纵向序列
    • 陆(Lane):面向序列
  • 二维
    • 面(Plane):xz平面
    • 片(Slice):xy平面
    • 表(Sheet):yz平面
  • 三维
    • 态(State):整体数据

存储顺序

  • z -> x -> y,即A[x, y, z] = S[w * (5 * y + x) + z]

序列到态的转换

  • 将位拼合成陆
  • 将陆拼合成面
  • 将面拼合成态

基本算法设计

theta代换

  • 列间的代换操作
  • 对于列中每一位,提取其左列与右前列的总异或值进行异或

rho置换

  • 陆内的置换操作
  • 陆(1, 0)开始操作,并记操作数t = 0
    • 使陆内所有位循环向后移动(t + 1)(t + 2) / 2
    • 陆(x, y)改到陆(y, (2x + 3y) mod 5),并使t = t + 1,重复上述操作直至操作24次为止
  • 笔者注:陆(0, 0)不发生改变

pi置换

  • 陆间的置换操作
  • 陆(x, y)移至陆((x + 3y) mod 5, x)
  • 笔者注:陆(0, 0)不发生改变

chi代换

  • 行内的代换操作
  • 对于行中每一位,取下一位的反与再下一位进行与操作,并与本位进行异或

iota代换

  • 陆(0, 0)的代换操作
  • 额外输入i_r(轮参数,后续会说明该参数的取值)
  • 轮位计算函数rc()
    • 类似线性反馈移位寄存器LFSR
    • 笔者注:应该可预计算
    • 操作步骤:
      • 输入计算轮数t,并取t = t mod 255
      • 寄存器R初值为0b1000_0000,从左至右称为第0位到第7位
      • 每轮循环向右移位,对新的第4,5,6位用新的第0位异或
      • 进行t轮后结束并输出第一位;t = 0时可直接输出1
  • iota代换:
    • 设置序列RCb位长度的0
    • 将所有第2 ^ k - 1位的值设为rc(j + 7 * i_r)
    • 使陆(0, 0)RC异或

轮操作Rnd

  • Rnd(A, i_r) = iota(chi(pi(rho(theta(A)))), i_r)
  • LaTeX\LaTeXLATE​X公式:Rnd(A,ir)=ι(χ(π(ρ(θ(A)))),ir)\text{Rnd}(\mathbf{A}, i_r) = \iota(\chi(\pi(\rho(\theta(\mathbf{A})))), i_r)Rnd(A,ir​)=ι(χ(π(ρ(θ(A)))),ir​)

主块操作Keccak-p

  • 表示方式:Keccak-p[b, n_r](S)
  • 参数说明:
    • Sb位长的输入串
    • n_r:操作轮数
  • 操作步骤:
    • S表示为态A
    • i_r12 + 2 * l - n_r12 + 2 * l - 1,依次执行A = Rnd(A, i_r)
    • 将此时的态A转换回S并输出
  • n_r可以大于12 + 2 * l,此时i_r的初始值为负数

特化主块操作Keccak-f

  • Keccak-f[b] = Keccak-p[b, 12 + 2 * l]
  • SHA-3中实际使用的操作

海绵结构(Sponge Construction)

表示方式

  • sponge[f, pad, r](N, d)

参数说明

  • b位长的串的变换函数f
  • “吸收率”rr < b
  • 特定的填充规则pad
  • 输入填充倍率x与待填充串长度m
    • 输出pad(x, m),使len(pad(x, m)) + m恰好是x的倍数
  • 输入串N
  • 输出长度d

操作步骤

  • P = N ## pad(r, len(N))(此处##表示字符串的连接)
  • n = len(P) / r
  • c = b - r
  • P = P[0] ## P[1] ## ... ## P[n - 1],其中每个P[i]都是r长
  • Sb位长度的0串(记为0 ^ b
  • “吸收(Absorbing)”
    -对从0n - 1i执行如下操作:S = f(S xor (P[i] ## (0 ^ c)))
  • “挤压(Squeezing)”
    • Z为一空串;直到Z的长度len(Z) >= d,执行如下操作:

      • Z = Z ## Trunc(r, S)Trunc(r, S)表示取S的前r位)
      • S = f(S)
  • 输出Trunc(d, Z)

Keccak算法与SHA-3算法构造

Keccak算法

  • 表示方法:Keccak[c] = sponge[Keccak-p[1600, 24], pad10*1, 1600 - c]
  • 参数说明:
    • 填充方法pad10*1:在填充区首尾均填1,中间填0;填充n + 1位而非1

SHA-3哈希算法

  • SHA3-224(M) = Keccak[448](M ## 01, 224)
  • SHA3-256(M) = Keccak[512](M ## 01, 256)
  • SHA3-384(M) = Keccak[768](M ## 01, 384)
  • SHA3-512(M) = Keccak[1024](M ## 01, 512)

SHA-3 XOF(SHA-3可扩展输出算法)

  • SHAKE128(M, d) = Keccak[256](M ## 1111, d)
  • SHAKE256(M, d) = Keccak[512](M ## 1111, d)
  • 另一定义方法:
    • RawSHAKE128(J, d) = Keccak[256](J ## 11, d)
    • RawSHAKE256(J, d) = Keccak[512](J ## 11, d)
    • SHAKE128(M, d) = RawSHAKE128(M ## 11, d)
    • SHAKE256(M, d) = RawSHAKE256(M ## 11, d)

SHA-3系列算法性质

算法 分组大小 (字节) 输出大小 (位) 碰撞难度 (位) 原象攻击难度 (位) 第二原象 攻击难度 (位)
SHA3-224 144 224 112 224 224
SHA3-256 136 256 128 256 256
SHA3-384 104 384 192 384 384
SHA3-512 72 512 256 512 512
SHAKE128 168 d min(d / 2, 128) >= min(d, 128) min(d, 128)
SHAKE256 136 d min(d / 2, 256) >= min(d, 256) min(d, 256)

SHA-3标准(NIST.FIPS.202)阅读笔记相关推荐

  1. Swift标准库源码阅读笔记 - Array和ContiguousArray

    关于 ContiguousArray ,这边有喵神的文章介绍的很详细了,可以先看看这个文章. Array 接着喵神的思路,看一下 Array 以下是从源码中截取的代码片段. public struct ...

  2. SHA-3的获胜者:keccak - 在 3GPP TS 35.231、FIPS 202 和 SP 800-185 中标准化

    https://keccak.team/keccak.html 目录 技术细节 标准实例 Keccak是一种通用的加密函数.最著名的是散列函数,但它也可用于身份验证.(经过身份验证的)加密和伪随机数生 ...

  3. A Survey of Deep Learning-based Object Detection论文翻译 + 阅读笔记

    A Survey of Deep Learning-based Object Detection论文翻译 + 阅读笔记 //2022.1.7 日下午16:00开始阅读 双阶段检测器示意图 单阶段检测器 ...

  4. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  5. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  6. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

  7. 01需求工程-软件建模与分析阅读笔记

    绪论阅读笔记 绪论这一部分讲的很多,把这本书的框架给讲了一个大概,让我对这本书有了一个大致的了解. 软件的发展经历了以"机器"为中心,以"应用"为中心,以&qu ...

  8. T5: Text-to-Text Transfer Transformer 阅读笔记

    作者:徐啸 知乎专栏:自然语言处理学习之旅 https://zhuanlan.zhihu.com/p/89719631 写在前面 谷歌用一篇诚意满满(财大气粗)的基于实验的综述,试图帮助研究者们「拨开 ...

  9. [python Cookbook]阅读笔记

    @toc] 前记:为了补充一下python语法知识,感谢网友的推荐阅读了pythonCookbook,这本书确实不错,以问题为导向,引导解决思路. 这个博文是从阅读笔记typora中直接复制过来的没有 ...

最新文章

  1. Java开发四年的程序员想再学习一门语言,该选着C还是Python呢?
  2. 文件监视器——Filemon
  3. WebBrowser控件打开https站点
  4. shell编程系列26--大型脚本工具开发实战
  5. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略
  6. centos6.4下安装jdk
  7. 如果给你一个亿,你想去干嘛?各专业的科研狗是这样回答的……
  8. Adobe illustrator 图的放置和微调 - 连载 9
  9. 达观杯文本分类——基于N-gram和LogisticRegression
  10. 存储器火热 大陆厂商3倍薪水赴台挖人
  11. 用计算机弹极乐净土谱,极乐净土计算器乐谱
  12. 什么是SRE?一文详解SRE运维体系
  13. linux 网站图片无法加载失败怎么办,网页无法加载图片怎么办?解决网页图片无法显示的方法...
  14. Oracle中rank函数详解
  15. 【最短路】白银莲花池
  16. Microbiome:粪菌移植改善自闭症Fecal microbiota transplant (FMT)
  17. 无线局域网中iPhone无法访问IIS
  18. python ssl module_Python升级后ssl模块不可用问题解决和浅析
  19. python wx窗体界面
  20. 无主之地2 不费子弹手枪

热门文章

  1. 什么是集群?什么又是负载均衡?你未必说的清楚
  2. 【随笔记】Deepin20系统更换fish,替代bash
  3. 实验:高次插值的龙格现象(Runge)实验
  4. 这些MOS管的特点和分类,你未必全都知道
  5. Elasticsearch:运用 Pinned query 来提升特定的结果
  6. 第二章 Silicon labs EFR32 MG21 验证蓝牙的私有Characteristic的读/写
  7. 关于Github项目DCRNN运行问题小结(1)——tables模块包
  8. 【2018年12月05日】滚动市盈率PE最低排名
  9. 微信公众号如何进行账号迁移?
  10. 安泰电子科普:电压源和电流源的区别是什么意思