网安笔记05 SHA

SHA

Hash函数

定义

  1. 任意长度的数据M变换为定长码h
    h=HASH(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输入长度,小于2642^64264位的报文,输出160160160位报文摘要
对输入按 512位分组

在这里插入图片描述

运算算法

  1. 输入填充,让填充后的报文长度满足
    length=448 mod 512length = 448 \ mod \ 512length=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. 归纳
    CV0=IVCV_0 = IVCV0=IV
    KaTeX parse error: Undefined control sequence: \leL at position 29: …_i\quad 0\le i \̲l̲e̲L̲ ̲- 1
    具体如下

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 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+ft(B,C,D)+(A<<5)+Wt+Kt)B←AC←B<<30D←CE←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\leftarrowA(E+ft(B,C,D)+(A<<5)+Wt+Kt)BACB<<30DCE

  • 单轮对A,B,C,D,E进行20次迭代, 四轮共80次迭代 0≤t≤790\le t \le 790t79
  • <<s<<s<<s表示32位变量左移s位
  • +++为 mod 32的加法
  • 逻辑函数ftf_tft四个轮次略有区别
    • f1=ft(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)
    • f2=ft(B,C,D)=B⊕C⊕Df_2 = f_t(B,C,D) = B\oplus C\oplus Df2=ft(B,C,D)=BCD
    • f3=ft(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)
    • f4=ft(B,C,D)=B⊕C⊕Df_4 = f_t(B,C,D) = B\oplus C\oplus Df4=ft(B,C,D)=BCD
      • 缺点: f2 f4f_2\ f_4f2 f4均为线性函数
  • KtK_tKt 加法常量,共有四个不同加法产量
    • 第一层 5A827999
    • 第二层 6ED9EBA1
    • 第三次 8F1BBCDC
    • 第四层 CA62C1D6
      • 缺点: 压缩字K作用范围太小,只影响A不影响B\C\D\E
  • WtW_tWt:当前分组BLK导出的32位字
    • 每步使用从512位的报文分组BLK导出的一个32位的字WtW_tWt
    • 把BLK划分为16个32位的字(M0,M15M_0, M_{15}M0,M15),扩展到80个32位字(M0,M79M_0, M_{79}M0,M79)
    • 0≤t≤15Wt=Mt0\le t\le 15\quad W_t = M_t0t15Wt=Mt
    • 16≤t≤79Wt=(Wt−16⊕Wt−13⊕Wt−8⊕Wt−3)<<116\le t \le 79\quad W_t = (W_{t-16}\oplus W_{t-13}\oplus W_{t-8}\oplus W_{t-3})<<116t79Wt=(Wt16Wt13Wt8Wt3)<<1
      • 缺点: 压缩函数是线性函数; 压缩字WtW_tWt的作用范围太小(和K一样)

补充

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

SHA-2 HASH函数

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

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

SHA-512

  1. 输入长度 <2128<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=6A09E667F3BCC908E=510E527FADE682D1B=BB67AE8584CAA73BF=9B05688C2B3E6C1FC=3C6EF372FE94F82BG=1F83D9ABFB41BD6BD=A54FF53A5F1D36F1H=5BE0CD19137E2179 A=6A09E667F3BCC908 \quad E=510E527FADE682D1 \\ B=BB67AE8584CAA73B \quad F=9B05688C2B3E6C1F \\ C=3C6EF372FE94F82B \quad G=1F83D9ABFB41BD6B\\ D=A54FF53A5F1D36F1 \quad H=5BE0CD19137E2179A6A09E667F3BCC908E=510E527FADE682D1BBB67AE8584CAA73BF=9B05688C2B3E6C1FC3C6EF372FE94F82BG=1F83D9ABFB41BD6BDA54FF53A5F1D36F1H=5BE0CD19137E2179

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

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

  1. 块处理

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

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

在这里插入图片描述

  1. 轮函数

前两个同SHA-1,后两函数不同
CH(E,F,G)=(E∧F)⊕(¬E∧G)Maj(A,B,C)=(A∧B)⊕(A∧C)⊕(B∧C)∑0512=ROTR28(A)⊕ROTR34(A)⊕ROTR39(A)∑1512=ROTR14(E)⊕ROTR18(E)⊕ROTR41(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)

  • ROTRi(X)ROTR^i(X)ROTRi(X)表示X循环右移i位
  • 附加常数KtK_tKt
    • 最小的80个素数开立方,取根的小数部分前64bit
    • 小数部分随机,消除数据中的规律性
  • 压缩字WtW_tWt
    • 1024bit的块中取出,分为16个64位的MtM_tMt
    • Wt=Mt0≤t≤15W_t = M_t\quad 0\le t\le 15Wt=Mt0t15
    • Wt=σ1512(Wt−2)+Wt−7+σ0512(Wt−15)+Wt−16W_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
    • σ0512(x)=ROTR1(x)⊕RTOR8(x)⊕SHR7(x)\sigma_0^{512}(x) = ROTR^1(x) \oplus RTOR^8(x) \oplus SHR^7(x)σ0512(x)=ROTR1(x)RTOR8(x)SHR7(x)
    • σ1512(x)=ROTR19(x)⊕RTOR61(x)⊕SHR6\sigma_1^{512}(x) = ROTR^{19}(x) \oplus RTOR^{61}(x) \oplus SHR^6σ1512(x)=ROTR19(x)RTOR61(x)SHR6
    • SHRi(x)表示x左移i位右边填0SHR^i(x)表示x左移i位右边填0SHRi(x)表示x左移i位右边填0

函数变化
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 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. 应用未开始、安全性暂时未检验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值