网安笔记05 SHA

SHA

Hash函数

定义

  1. 任意长度的数据M变换为定长码h
    h = H A S H ( M ) h = H ( M ) h = HASH(M)\quad h = H(M) h=HASH(M)h=H(M)

  2. 实用性: 给定M,计算h时高效的

  3. 安全性:

  • 单向性 给出h,反向计算原文x时不可行的,否则截取H(M||Key),hash逆运算可以得到Key泄漏密钥
  • 抗碰撞性,给定x,找到KaTeX parse error: Undefined control sequence: \noteq at position 2: y\̲n̲o̲t̲e̲q̲ ̲x,使得 H ( y ) = H ( x ) H(y)=H(x) H(y)=H(x)是不可行的。 否则可以冒充
  • 抗强碰撞性 找到任何满足 H ( x ) = H ( y ) H(x)=H(y) H(x)=H(y)的偶对 ( x , y ) (x,y) (x,y)在计算上是不可行的

hash函数一般结构

  1. 将输入分为L-1个大小为b位的分组
  2. 若第L-1个分组不足b位,填充到b位
  3. 附加第L个分组,表示总长度
    输入中包含长度,所以攻击者必须找出具 所以攻击者必须找出具 有相同Hash值且长度相等的两条报文 OR 长度不等,加入报文长度后hash相同的报文)

在这里插入图片描述
b位分组通过L次连接迭代通过压缩函数f,f输出n位

作用

  1. 错误检测
  2. 作为MAC,用于认证
  3. 数字签名
  4. 保密

SHA-1 HASH函数

SHA-0, 1, 2三种
SHA-2包括三个hash函数, SHA-256, SHA-384, SHA-512

SHA-1基础: MD5

SHA-1输入长度,小于 2 6 4 2^64 264位的报文,输出 160 160 160位报文摘要
对输入按 512位分组

在这里插入图片描述

运算算法

  1. 输入填充,让填充后的报文长度满足
    l e n g t h = 448   m o d   512 length = 448 \ mod \ 512 length=448 mod 512
  • 在末尾加一个1和若干个0
  • 本身已满足的话,为了避免二义性,添加512位(填充数介于1-512)
  1. 初始化缓冲区
  • 缓冲区:5个32位寄存器,保存160位的中间 or 最终结果
  • 五个寄存器初始化如下:

A: 67452301

B: EFCDAB89

C: 98BADCFE

D: 10325476

E: C3D2E1F0
(大端模式存储)

  1. 主处理
  • 每次处理512位分组,循环次数 – L
    在这里插入图片描述
  • f压缩函数位核心
    • 四层运算(每层20步迭代)组成, 四层运算结构相同
    • 输入当前要处理的是512位的分组BLK和160位缓冲区ABCDE的内容
    • 每层要对ABCDE内容更新(逻辑函数f是不一样的)
    • 第四层输出第一层输出相加得到最后结果
  1. 输出
  • 所有的L个512位的分组处理完后,第L个分组的输出即是160位的报文摘要
  1. 归纳
    C V 0 = I V CV_0 = IV CV0=IV
    KaTeX parse error: Undefined control sequence: \leL at position 29: …_i\quad 0\le i \̲l̲e̲L̲ ̲- 1
    具体如下

C V i + 1 ( 0 ) = C V i ( 0 ) + A i C V i + 1 ( 1 ) = C V i ( 1 ) + B i C V i + 1 ( 2 ) = C V i ( 2 ) + C i C V i + 1 ( 3 ) = C V i ( 3 ) + D i C V i + 1 ( 4 ) = C V i ( 4 ) + E i CV_{i+1}(0) = CV_i(0)+A_i \\ CV_{i+1}(1) = CV_i(1)+B_i \\ CV_{i+1}(2) = CV_i(2)+C_i \\ CV_{i+1}(3) = CV_i(3)+D_i \\ CV_{i+1}(4) = CV_i(4)+E_i CVi+1(0)=CVi(0)+AiCVi+1(1)=CVi(1)+BiCVi+1(2)=CVi(2)+CiCVi+1(3)=CVi(3)+DiCVi+1(4)=CVi(4)+Ei
上述的+是 mod 2^{32}加法

  1. 压缩函数

在这里插入图片描述

缺点

  • 输出B=输入A
  • 输出D=输入C
  • 输出E=输入D
  • A、C、D没有运算

形式
A ← ( E + f t ( B , C , D ) + ( A < < 5 ) + W t + K t ) B ← A C ← B < < 30 D ← C E ← A \leftarrow (E + f_t(B,C,D) + (A<<5) + W_t + K_t) \\ B\leftarrow A\\ C\leftarrow B<<30\\ D\leftarrow C\\E\leftarrow A(E+ft(B,C,D)+(A<<5)+Wt+Kt)BACB<<30DCE

  • 单轮对A,B,C,D,E进行20次迭代, 四轮共80次迭代 0 ≤ t ≤ 79 0\le t \le 79 0t79
  • < < s <<s <<s表示32位变量左移s位
  • + + +为 mod 32的加法
  • 逻辑函数 f t f_t ft四个轮次略有区别
    • f 1 = f t ( B , C , D ) = ( B ∧ C ) ∨ ( ¬ B ∧ D ) f_1=f_t(B,C,D) = (B\land C)\lor(\lnot B\land D) f1=ft(B,C,D)=(BC)(¬BD)
    • f 2 = f t ( B , C , D ) = B ⊕ C ⊕ D f_2 = f_t(B,C,D) = B\oplus C\oplus D f2=ft(B,C,D)=BCD
    • f 3 = f t ( B , C , D ) = ( B ∧ C ) ∨ ( B ∧ D ) ∨ ( C ∧ D ) f_3=f_t(B,C,D) = (B\land C)\lor(B\land D) \lor(C\land D) f3=ft(B,C,D)=(BC)(BD)(CD)
    • f 4 = f t ( B , C , D ) = B ⊕ C ⊕ D f_4 = f_t(B,C,D) = B\oplus C\oplus D f4=ft(B,C,D)=BCD
      • 缺点: f 2   f 4 f_2\ f_4 f2 f4均为线性函数
  • K t K_t Kt 加法常量,共有四个不同加法产量
    • 第一层 5A827999
    • 第二层 6ED9EBA1
    • 第三次 8F1BBCDC
    • 第四层 CA62C1D6
      • 缺点: 压缩字K作用范围太小,只影响A不影响B\C\D\E
  • W t W_t Wt:当前分组BLK导出的32位字
    • 每步使用从512位的报文分组BLK导出的一个32位的字 W t W_t Wt
    • 把BLK划分为16个32位的字( M 0 , M 15 M_0, M_{15} M0,M15),扩展到80个32位字( M 0 , M 79 M_0, M_{79} M0,M79)
    • 0 ≤ t ≤ 15 W t = M t 0\le t\le 15\quad W_t = M_t 0t15Wt=Mt
    • 16 ≤ t ≤ 79 W t = ( W t − 16 ⊕ W t − 13 ⊕ W t − 8 ⊕ W t − 3 ) < < 1 16\le t \le 79\quad W_t = (W_{t-16}\oplus W_{t-13}\oplus W_{t-8}\oplus W_{t-3})<<1 16t79Wt=(Wt16Wt13Wt8Wt3)<<1
      • 缺点: 压缩函数是线性函数; 压缩字 W t W_t Wt的作用范围太小(和K一样)

补充

  • SHA-1可用
  • MD-5不安全

SHA-2 HASH函数

  • 三个Hash函数 SHA-256/384/512
  • AES配套
  • 安全性能更强
  • 与SHA-1比较:结构相同、逻辑函数相同、mod运算相同
(单位:bit) SHA-1 SHA-256 SHA-384 SHA-512
消息摘要长度 160 256 384 512
消息长度 <2^64 <2^64 <2^128 <2^128
分组长度 512 512 1024 1024
字长度 32 32 64 64
步骤数 80 64 80 80
安全性 80 128 192 25

安全性:对输出长度为n比特的hash函数的攻击产生碰撞的工具约为 2 n / 2 2^{n/2} 2n/2

SHA-512

  1. 输入长度 < 2 128 <2^{128} <2128
  2. 数据分组长度 1024
  3. 输出长度 512

运算算法

  1. 填充
  • 使填充后的长度=896 mod 1024
  • 已满足也需要填充(1个1 若干个0)
  1. 附加长度
  • 填充后附加128位的块,表示原消息长度

完成1、2步后,数据长度为1024的整数倍, 数据 / 1024为块数N,对其迭代处理

在这里插入图片描述

  1. 初始化缓冲区
  • 中间结果、最终结果存于512比特的缓冲区中,缓冲区使用8个64比特的寄存器(A,B,C,D,E,F,G,H)
    A = 6 A 09 E 667 F 3 B C C 908 E = 510 E 527 F A D E 682 D 1 B = B B 67 A E 8584 C A A 73 B F = 9 B 05688 C 2 B 3 E 6 C 1 F C = 3 C 6 E F 372 F E 94 F 82 B G = 1 F 83 D 9 A B F B 41 B D 6 B D = A 54 F F 53 A 5 F 1 D 36 F 1 H = 5 B E 0 C D 19137 E 2179 A=6A09E667F3BCC908 \quad E=510E527FADE682D1 \\ B=BB67AE8584CAA73B \quad F=9B05688C2B3E6C1F \\ C=3C6EF372FE94F82B \quad G=1F83D9ABFB41BD6B\\ D=A54FF53A5F1D36F1 \quad H=5BE0CD19137E2179 A6A09E667F3BCC908E=510E527FADE682D1BBB67AE8584CAA73BF=9B05688C2B3E6C1FC3C6EF372FE94F82BG=1F83D9ABFB41BD6BDA54FF53A5F1D36F1H=5BE0CD19137E2179

来源:前八个素数平方根,取小数部分前64个比特

存储方式:高有效字节存低字节位置(大端

  1. 块处理

1024比特快的处理 + 80轮迭代运算

  • 512bits缓冲区的ABCDEFGH为输入,更新缓冲区的值。第一轮时,缓冲区里的值是中间 缓冲区里的值是中间的Hash值 H i − 1 H_{i-1} Hi1
  • 每轮t使用64bit的 W t W_t Wt与常数 K t K_t Kt
  • 迭代后输出 H i H_i Hi
  • 存储方式:高有效字节存于低地址字节位置

在这里插入图片描述

  1. 轮函数

前两个同SHA-1,后两函数不同
C H ( E , F , G ) = ( E ∧ F ) ⊕ ( ¬ E ∧ G ) M a j ( A , B , C ) = ( A ∧ B ) ⊕ ( A ∧ C ) ⊕ ( B ∧ C ) ∑ 0 512 = R O T R 28 ( A ) ⊕ R O T R 34 ( A ) ⊕ R O T R 39 ( A ) ∑ 1 512 = R O T R 14 ( E ) ⊕ R O T R 18 ( E ) ⊕ R O T R 41 ( E ) CH(E,F,G)=(E \land F)⊕(\lnot E \land G)\\ Maj(A,B,C)=(A \land B)⊕(A \land C)⊕(B \land C)\\ ∑_0^{512}=ROTR^{28}(A)⊕ ROTR^{34}(A)⊕ ROTR^{39}(A)\\ ∑_1^{512}=ROTR^{14}(E)⊕ ROTR^{18}(E)⊕ ROTR^{41}(E) CH(E,F,G)=(EF)(¬EG)Maj(A,B,C)=(AB)(AC)(BC)0512=ROTR28(A)ROTR34(A)ROTR39(A)1512=ROTR14(E)ROTR18(E)ROTR41(E)

  • R O T R i ( X ) ROTR^i(X) ROTRi(X)表示X循环右移i位
  • 附加常数 K t K_t Kt
    • 最小的80个素数开立方,取根的小数部分前64bit
    • 小数部分随机,消除数据中的规律性
  • 压缩字 W t W_t Wt
    • 1024bit的块中取出,分为16个64位的 M t M_t Mt
    • W t = M t 0 ≤ t ≤ 15 W_t = M_t\quad 0\le t\le 15 Wt=Mt0t15
    • W t = σ 1 512 ( W t − 2 ) + W t − 7 + σ 0 512 ( W t − 15 ) + W t − 16 W_t = \sigma_1^{512}(W_{t-2})+W_{t-7} + \sigma_0^{512}(W_{t-15}) + W_{t-16} Wt=σ1512(Wt2)+Wt7+σ0512(Wt15)+Wt16
    • σ 0 512 ( x ) = R O T R 1 ( x ) ⊕ R T O R 8 ( x ) ⊕ S H R 7 ( x ) \sigma_0^{512}(x) = ROTR^1(x) \oplus RTOR^8(x) \oplus SHR^7(x) σ0512(x)=ROTR1(x)RTOR8(x)SHR7(x)
    • σ 1 512 ( x ) = R O T R 19 ( x ) ⊕ R T O R 61 ( x ) ⊕ S H R 6 \sigma_1^{512}(x) = ROTR^{19}(x) \oplus RTOR^{61}(x) \oplus SHR^6 σ1512(x)=ROTR19(x)RTOR61(x)SHR6
    • S H R i ( x ) 表示 x 左移 i 位右边填 0 SHR^i(x)表示x左移i位右边填0 SHRi(x)表示x左移i位右边填0

函数变化
T 1 = H + C h ( E , F , G ) + ( Σ 1 5 12 E ) + W t + K t T 2 = ( Σ 0 512 A ) + M a j ( A , B , C ) A = T 1 + T 2 B = A C = B D = C E = D + T 1 F = E G = F H = G T_1 = H + Ch(E,F,G) + (\Sigma_1^512 E) + W_t + K_t\\ T_2 = (\Sigma ^{512}_0 A) + Maj(A,B,C)\\ A = T_1 + T_2\\ B = A\\ C = B\\ D = C\\ E = D+T_1\\ F = E\\ G = F\\ H = G T1=H+Ch(E,F,G)+(Σ1512E)+Wt+KtT2=(Σ0512A)+Maj(A,B,C)A=T1+T2B=AC=BD=CE=D+T1F=EG=FH=G
缺点:直接相等的太多
在这里插入图片描述

总结

  1. SHA-512结构等同SHA-1
  2. 前者输出长度更长,抗穷举攻击能力更强
  3. 逻辑函数与后者差别不大 (SHA-1 20轮使用一个逻辑函数、 SHA-2 每轮4个逻辑函数)
  4. 应用未开始、安全性暂时未检验

猜你喜欢

转载自blog.csdn.net/JamSlade/article/details/130601317
今日推荐