密码学(哈希函数)

4.1 Hash函数与数据完整性

数据完整性
检测传输消息(加密或未加密)的修改。

密码学Hash函数
构建某些数据的简短“指纹”;如果数据被篡改,则该指纹(以高概率)不再有效。Hash函数的一个特别重要的应用是数字签名方案的上下文中。

消息摘要
h ( x ) h(x) h(x)是一个Hash函数, x x x是某些数据。对应的指纹定义为 y = h ( x ) y=h(x) y=h(x)。这个指纹通常被称为消息摘要。
消息摘要是一个相对较短的二进制字符串,例如160位或256位。

Hash函数族
带密钥的Hash函数族。对于每个可能的密钥,都有一个不同的Hash函数。
在不安全的信道中,Alice向Bob发送一对 ( x , y ) (x,y) (x,y),其中 y = h K ( x ) y=h_K(x) y=hK(x)
有效的配对 ( x , y ) (x,y) (x,y)满足 h ( x ) = y h(x)=y h(x)=y

定义 5.1: 一个Hash函数族是一个四元组 ( X , Y , K , H ) (\mathcal{X}, \mathcal{Y}, \mathcal{K}, \mathcal{H}) (X,Y,K,H),满足以下条件:

  1. X \mathcal{X} X 是可能的消息集合
  2. Y \mathcal{Y} Y 是可能的消息摘要或认证标签(或简称标签)的有限集合
  3. K \mathcal{K} K,即密钥空间,是可能的密钥的有限集合
  4. 对于每个 K ∈ K K \in \mathcal{K} KK,存在一个Hash函数 h K ∈ H h_K \in \mathcal{H} hKH。每个 h K : X → Y h_K : \mathcal{X} \rightarrow \mathcal{Y} hK:XY

在上述定义中, X \mathcal{X} X 可以是一个有限集或无限集; Y \mathcal{Y} Y 总是一个有限集。如果 X \mathcal{X} X 是一个有限集且 X > Y \mathcal{X} > \mathcal{Y} X>Y,该函数有时被称为压缩函数。在这种情况下,我们通常会假设一个更强的条件,即 ∣ X ∣ ≥ 2 ∣ Y ∣ |\mathcal{X}| \geq 2|\mathcal{Y}| X2∣Y

4.2 哈希函数的安全性

如果一个哈希函数被认为是安全的,那么以下三个问题应该难以解决:

  1. 原像问题(Preimage)
  2. 第二原像问题(Second Preimage)
  3. 碰撞问题(Collision)

问题 5.1:原像问题

实例: 给定一个哈希函数 h : X → Y h: \mathcal{X} \rightarrow \mathcal{Y} h:XY 和一个元素 y ∈ Y y \in \mathcal{Y} yY

求解: 找到一个 x ∈ X x \in \mathcal{X} xX 使得 h ( x ) = y h(x) = y h(x)=y

问题 5.2:第二原像问题

实例: 给定一个哈希函数 h : X → Y h: \mathcal{X} \rightarrow \mathcal{Y} h:XY 和一个元素 x ∈ X x \in \mathcal{X} xX

求解: 找到一个 x ′ ∈ X x' \in \mathcal{X} xX,使得 x ′ ≠ x x' \neq x x=x h ( x ′ ) = h ( x ) h(x') = h(x) h(x)=h(x)

问题 5.3:碰撞问题

实例: 给定一个哈希函数 h : X → Y h: \mathcal{X} \rightarrow \mathcal{Y} h:XY

求解: 寻找 x , x ′ ∈ X x, x' \in \mathcal{X} x,xX,使得 x ′ ≠ x x' \neq x x=x h ( x ′ ) = h ( x ) h(x') = h(x) h(x)=h(x)
在这里插入图片描述

如果一个哈希函数的原像问题无法高效解决,通常称其为单向的原像抗性的。
如果一个哈希函数的第二原像问题无法高效解决,通常称其为第二原像抗性的。
如果一个哈希函数的碰撞问题无法高效解决,通常称其为抗碰撞的。
抗碰撞性    ⟹    原像抗性 ∧ 第二原像抗性 \text{抗碰撞性} \implies \text{原像抗性} \land \text{第二原像抗性} 抗碰撞性原像抗性第二原像抗性

随机预言模型(Random Oracle Model)——一种理想化的模型

如果一个哈希函数设计良好,那么唯一高效确定给定输入 x x x的哈希值 h ( x ) h(x) h(x)的方法是实际计算函数 h h h x x x处的值。

随机预言模型示例(该性质不成立):

随机预言模型(由 Bellare 和 Rogaway 提出)

  • 一个哈希函数 h : X → Y h: X \rightarrow Y h:XY是随机选择的,我们只能通过预言机访问该函数 h h h
  • 我们没有公式或算法来计算函数 h h h的值。
  • 计算值 h ( x ) h(x) h(x)的唯一方法是查询预言机。
  • 在现实生活中,真正的随机预言机是不存在的。

随机预言模型中的算法

  • 我们展示和分析的算法是随机算法;它们在执行过程中可以做出随机选择。
  • 拉斯维加斯算法(Las Vegas algorithm)是一种随机算法,它可能会失败(即,它可能会以“失败”消息终止),但如果算法返回答案,则答案必须是正确的。

定理 5.1 假设 h ∈ F X , Y h \in \mathcal{F}^{\mathcal{X},\mathcal{Y}} hFX,Y 是随机选择的,并且设 X 0 ⊆ X \mathcal{X}_0 \subseteq \mathcal{X} X0X。记 ∣ Y ∣ = M |\mathcal{Y}| = M Y=M。假设 h ( x ) h(x) h(x) 的值仅当 x ∈ X 0 x \in \mathcal{X}_0 xX0 时通过查询 h h h 的预言机来确定。那么对于所有 x ∈ X ∖ X 0 x \in \mathcal{X} \setminus \mathcal{X}_0 xXX0 和所有 y ∈ Y y \in \mathcal{Y} yY,有 Pr ⁡ [ h ( x ) = y ] = 1 M \Pr[h(x) = y] = \frac{1}{M} Pr[h(x)=y]=M1

算法 5.1:FIND-PREIMAGE(h, y, Q)
选择任意 X 0 ⊆ X \mathcal{X}_0 \subseteq \mathcal{X} X0X ∣ X 0 ∣ = Q |\mathcal{X}_0| = Q X0=Q
对于每个 x ∈ X 0 x \in \mathcal{X}_0 xX0
如果 h ( x ) = y h(x) = y h(x)=y 则返回 ( x ) (x) (x)
返回 ( 失败 ) (失败) (失败)

该算法试图找到一个输入 x x x,使得其哈希值等于给定的 y y y

定理 5.2
对于任意 X 0 ⊆ X \mathcal{X}_0 \subseteq \mathcal{X} X0X ∣ X 0 ∣ = Q |\mathcal{X}_0| = Q X0=Q,算法 5.1 的平均成功概率为 ϵ = 1 − ( 1 − 1 / M ) Q \epsilon = 1 - (1 - 1/M)^Q ϵ=1(11/M)Q
该定理描述了算法 5.1 在给定条件下的平均成功概率。

算法 5.2:FIND-SECOND-PREIMAGE(h, x, Q)
y ← h ( x ) y \leftarrow h(x) yh(x)
选择 X 0 ⊆ X ∖ { x } \mathcal{X}_0 \subseteq \mathcal{X} \setminus \{x\} X0X{x} ∣ X 0 ∣ = Q − 1 |\mathcal{X}_0| = Q - 1 X0=Q1
对于每个 x 0 ∈ X 0 x_0 \in \mathcal{X}_0 x0X0
如果 h ( x 0 ) = y h(x_0) = y h(x0)=y 则返回 ( x 0 ) (x_0) (x0)
返回 ( 失败 ) (失败) (失败)

该算法试图找到一个不同于 x x x 的输入 x ′ x' x,使得其哈希值等于 x x x 的哈希值。

定理 5.3
对于任意 X 0 ⊆ X ∖ { x } \mathcal{X}_0 \subseteq \mathcal{X} \setminus \{x\} X0X{x} ∣ X 0 ∣ = Q − 1 |\mathcal{X}_0| = Q - 1 X0=Q1,算法 5.2 的成功概率为 ϵ = 1 − ( 1 − 1 / M ) Q − 1 \epsilon = 1 - (1 - 1/M)^{Q-1} ϵ=1(11/M)Q1

以下是对每个图片内容的介绍,使用中文和Markdown格式,并且按照您的要求使用数学公式和符号:

算法 5.3:FIND-COLLISION(h, Q)
选择 X 0 ⊆ X , ∣ X 0 ∣ = Q \mathcal{X}_0 \subseteq \mathcal{X}, |\mathcal{X}_0| = Q X0X,X0=Q
对于每个 x ∈ X 0 x \in \mathcal{X}_0 xX0
执行 y x ← h ( x ) y_x \leftarrow h(x) yxh(x)
如果 y x = y x ′ y_x = y_{x'} yx=yx 对于某个 x ′ ≠ x x' \neq x x=x
则返回 ( x , x ′ ) (x, x') (x,x)
否则返回 ( 失败 ) (失败) (失败)
该算法试图找到两个不同的输入 x x x x ′ x' x,使得它们的哈希值相同,即找到碰撞。

定理 5.4
对于任意 X 0 ⊆ X \mathcal{X}_0 \subseteq \mathcal{X} X0X ∣ X 0 ∣ = Q |\mathcal{X}_0| = Q X0=Q,算法 5.3 的成功概率为
ϵ = 1 − ( M − 1 M ) ( M − 2 M ) ⋯ ( M − Q + 1 M ) . \epsilon = 1 - \left(\frac{M-1}{M}\right)\left(\frac{M-2}{M}\right)\cdots\left(\frac{M-Q+1}{M}\right). ϵ=1(MM1)(MM2)(MMQ+1).

该定理描述了算法 5.3 在给定条件下的成功概率。

碰撞概率估计
使用此估计,找到没有碰撞的概率大约为
∏ i = 1 Q − 1 ( 1 − i M ) ≈ ∏ i = 1 Q − 1 e − i M = e − ∑ i = 1 Q − 1 i M = e − Q ( Q − 1 ) 2 M . \prod_{i=1}^{Q-1} \left(1 - \frac{i}{M}\right) \approx \prod_{i=1}^{Q-1} e^{-\frac{i}{M}} = e^{-\sum_{i=1}^{Q-1} \frac{i}{M}} = e^{\frac{-Q(Q-1)}{2M}}. i=1Q1(1Mi)i=1Q1eMi=ei=1Q1Mi=e2MQ(Q1).
因此,我们可以估计找到至少一个碰撞的概率为
1 − e − Q ( Q − 1 ) 2 M . 1 - e^{\frac{-Q(Q-1)}{2M}}. 1e2MQ(Q1).

这段内容提供了找到至少一个碰撞的概率估计。

碰撞概率估计(忽略 − Q -Q Q 项)

如果我们忽略 − Q -Q Q 项,那么我们估计
Q ≈ 2 M ln ⁡ 1 1 − ϵ . Q \approx \sqrt{2M \ln \frac{1}{1-\epsilon}}. Q2Mln1ϵ1 .
如果我们取 ϵ = 0.5 \epsilon = 0.5 ϵ=0.5,那么我们的估计是
Q ≈ 1.17 M . Q \approx 1.17 \sqrt{M}. Q1.17M .

这段内容提供了在特定条件下的碰撞概率估计,特别是当 ϵ = 0.5 \epsilon = 0.5 ϵ=0.5 时的估计值。




迭代哈希函数
在这里插入图片描述

  • 迭代哈希函数:将压缩函数扩展为具有无限定义域的哈希函数 h h h
  • 预处理步骤必须确保映射是单射(injective)。
  • 迭代哈希函数的处理步骤。

Merkle-Damgård 构造

  • Merkle-Damgård 构造
    • 这种构造被用于设计许多流行的哈希算法,例如 MD4、MD5、SHA-1 和 SHA-2。
    • 如果压缩函数满足某些安全属性(例如抗碰撞性),那么得到的哈希函数也满足这些属性。
    • x k + 1 应该在左侧填充零,使得 x k + 1 = t − 1 x_{k+1} \text{应该在左侧填充零,使得} x_{k+1} = t - 1 xk+1应该在左侧填充零,使得xk+1=t1
    • 如果可以为 h h h找到碰撞,那么也可以为压缩函数找到碰撞。换句话说,只要压缩函数是抗碰撞的, h h h就是抗碰撞的。
    • t = 1 t=1 t=1时, h h h是抗碰撞的,前提是压缩函数是抗碰撞的。

假设存在一个压缩函数 compress : { 0 , 1 } m + t → { 0 , 1 } m \text{compress} : \{0,1\}^{m+t} \rightarrow \{0,1\}^{m} compress:{0,1}m+t{0,1}m(其中 t ≥ 1 t \geq 1 t1)。我们将基于这个压缩函数构建一个迭代哈希函数
h : ⋃ i = m + t + 1 ∞ { 0 , 1 } i → { 0 , 1 } ℓ , h : \bigcup_{i=m+t+1}^{\infty} \{0,1\}^i \rightarrow \{0,1\}^\ell, h:i=m+t+1{0,1}i{0,1},
哈希函数 h h h 的计算包括以下三个主要步骤:

预处理步骤
给定一个输入字符串 x x x,其中 ∣ x ∣ ≥ m + t + 1 |x| \geq m+t+1 xm+t+1,构造一个字符串 y y y,使用一个公共算法,使得 ∣ y ∣ ≡ 0 ( mod  t ) |y| \equiv 0 (\text{mod } t) y0(mod t)。记作
y = y 1 ∥ y 2 ∣ ⋯ ∣ y r , y=y_{1}\|y_{2}|\cdots|y_{r}, y=y1y2yr,
其中 ∣ y i ∣ = t |y_{i}|=t yi=t 对于 1 ≤ i ≤ r 1\leq i\leq r 1ir

一个常用的预处理步骤是按照以下方式构造字符串 y y y
y = x ∥ pad ( x ) , y = x \| \text{pad}(x), y=xpad(x),
其中 pad ( x ) \text{pad}(x) pad(x) 是使用一个填充函数从 x x x 构造的。一个填充函数通常结合 ∣ x ∣ |x| x 的值,并用额外的位(例如零)填充结果,使得结果字符串 y y y 的长度是 t t t 的倍数。

其中 pad ( x ) \text{pad}(x) pad(x) 是使用填充函数从 x x x 构造的。一个填充函数通常结合 ∣ x ∣ |x| x 的值,并用额外的位(例如零)填充结果,使得结果字符串 y y y 的长度是 t t t 的倍数。

处理步骤
IV \text{IV} IV 是一个公共初始值,它是一个长度为 m m m 的比特串。然后计算以下内容:
z 0 ← IV z 1 ← compress ( z 0 ∥ y 1 ) z 2 ← compress ( z 1 ∥ y 2 ) ⋮ z r ← compress ( z r − 1 ∥ y r ) . \begin{align*} z_{0} &\leftarrow \text{IV} \\ z_{1} &\leftarrow \text{compress}(z_{0} \| y_{1}) \\ z_{2} &\leftarrow \text{compress}(z_{1} \| y_{2}) \\ & \vdots \\ z_{r} &\leftarrow \text{compress}(z_{r-1} \| y_{r}). \end{align*} z0z1z2zrIVcompress(z0y1)compress(z1y2)compress(zr1yr).

输出转换
g : { 0 , 1 } m → { 0 , 1 } ℓ g : \{0,1\}^{m} \rightarrow \{0,1\}^{\ell} g:{0,1}m{0,1} 是一个公共函数。定义 h ( x ) = g ( z r ) h(x) = g(z_{r}) h(x)=g(zr)
备注 输出转换是可选的。如果不希望进行输出转换,则定义 h ( x ) = z r h(x) = z_{r} h(x)=zr




例子

参数设置

  • 压缩函数:
    compress : { 0 , 1 } m + t → { 0 , 1 } m , m = 4 ,    t = 4 \text{compress} : \{0,1\}^{m + t} \rightarrow \{0,1\}^{m}, \quad m=4,\; t=4 compress:{0,1}m+t{0,1}m,m=4,t=4
    压缩函数将8位输入压缩为4位输出。
  • 初始值:
    IV = 1111 \text{IV}=1111 IV=1111
  • 输出转换函数:
    g ( z r ) = z r g(z_r)=z_r g(zr)=zr(即直接输出压缩结果,不作额外转换)。

输入示例

假设输入字符串:
x = 101011010011 ( 长度  12  位 ,    ∣ x ∣ = 12 ) x = 101011010011 \quad (\text{长度 }12\text{ 位},\; |x|=12) x=101011010011(长度 12 ,x=12)

预处理步骤

目标:构造字符串 y y y,使其长度是 t = 4 t=4 t=4的倍数。

  • 原长度 ∣ x ∣ = 12 |x|=12 x=12,已满足条件(无需填充)。
  • 分割为 r = 3 r=3 r=3个4位块:
    y 1 = 1010 ,    y 2 = 1101 ,    y 3 = 0011 y_1 = 1010,\; y_2 = 1101,\; y_3 = 0011 y1=1010,y2=1101,y3=0011

处理步骤

逐块应用压缩函数:
z 0 ← IV = 1111 z 1 ← compress ( z 0 ∥ y 1 ) ← compress ( 1111 ∥ 1010 ) ← compress ( 11111010 ) = 0110 (通过一定算法) z 2 ← compress ( z 1 ∥ y 2 ) ← compress ( 0110 ∥ 1101 ) ← compress ( 01101101 ) = 1001 z 3 ← compress ( z 2 ∥ y 3 ) ← compress ( 1001 ∥ 0011 ) ← compress ( 10010011 ) = 1100 \begin{align*} z_0 &\leftarrow \text{IV} = 1111 \\ z_1 &\leftarrow \text{compress}(z_0 \| y_1) \\ &\leftarrow \text{compress}(1111 \| 1010) \\ &\leftarrow \text{compress}(11111010) = 0110(通过一定算法) \\ z_2 &\leftarrow \text{compress}(z_1 \| y_2) \\ &\leftarrow \text{compress}(0110 \| 1101) \\ &\leftarrow \text{compress}(01101101) = 1001 \\ z_3 &\leftarrow \text{compress}(z_2 \| y_3) \\ &\leftarrow \text{compress}(1001 \| 0011) \\ &\leftarrow \text{compress}(10010011) = 1100 \end{align*} z0z1z2z3IV=1111compress(z0y1)compress(1111∥1010)compress(11111010)=0110(通过一定算法)compress(z1y2)compress(0110∥1101)compress(01101101)=1001compress(z2y3)compress(1001∥0011)compress(10010011)=1100

输出转换

哈希值为:
h ( x ) = g ( z 3 ) = 1100 h(x) = g(z_3) = 1100 h(x)=g(z3)=1100

总结

  • 预处理:填充(若需)并分割输入为固定长度块。
  • 处理:逐块压缩,将前一状态与当前块组合。
  • 输出转换:直接取最终压缩结果(或进一步处理)。

通过迭代设计,即使输入极长,也能高效生成固定长度输出,并累积处理全输入。




迭代哈希函数的示例

  • 1990年,MD4,由 Rivest 提出。
  • 1992年,MD5,对 MD4 的修改,由 Rivest 提出。
  • 1993年,SHA(-0),由 NIST 提出作为标准,被采用为 FIPS 180。
  • 1995年,SHA-1,对 SHA 的小幅修改,被发布为 FIPS 180-1。
  • 中期1990年代,发现了 MD4 和 MD5 的压缩函数的碰撞。
  • 2004年,Joux 找到了 SHA-0 的碰撞,并在 CRYPTO 上报告。
  • 2004年,在 CRYPTO 2004 上,Wang、Feng、Lai 和 Yu 展示了 MD5 和其他几种流行的哈希函数的碰撞。
  • 2017年,Stevens、Bursztein、Karpman、Albertini 和 Markov 找到了 SHA-1 的第一个碰撞。
  • 2002年,SHA-2 包括四种哈希函数,分别称为 SHA-224、SHA-256、SHA-384 和 SHA-512。
  • 2015年,SHA-3 成为 FIPS 标准。(采用不同的设计技术——称为海绵构造)

海绵构造

  • SHA-3 基于一种称为海绵构造的设计策略。
  • 由 Bertoni、Daemen、Peeters 和 Van Assche 开发。
  • 不使用压缩函数,而是使用一个基本的“构建块”——一个函数 f f f,它将固定长度的比特串映射到相同长度的比特串。
  • 通常 f f f是双射函数,因此每个比特串都有唯一的原像。
  • 海绵构造可以产生任意长度的输出(即消息摘要)。
  • f : { 0 , 1 } b → { 0 , 1 } b f: \{0,1\}^b \rightarrow \{0,1\}^b f:{0,1}b{0,1}b
    整数 b b b称为宽度。
  • b b b写成 r + c r + c r+c,其中 r r r是比特率(bitrate), c c c是容量(capacity)。

海绵函数

  1. 输入为消息 M M M,这是一个任意长度的比特串。

  2. M M M适当填充,使其长度是 r r r的倍数。

  3. 然后将填充后的消息分成长度为 r r r的块。

  4. 吸收阶段(Absorbing Phase):将填充后消息的第一个块与状态的前 r r r位进行异或操作。然后应用函数 f f f,更新状态。

  5. 挤压阶段(Squeezing Phase):对当前状态应用 f f f,并取前 r r r位输出比特。这个过程重复进行,直到我们得到至少 ℓ \ell 位的总输出。将连接结果截断为 ℓ \ell 位。

SHA-3

SHA-3 包括四种哈希函数,分别称为 SHA3-224、SHA3-256、SHA3-384 和 SHA3-512。(后缀表示消息摘要的长度,即上述讨论中的参数 ℓ \ell 。)
此外,SHA-3还包括名为SHAKE128和SHAKE256的可扩展输出函数(XOF)。
如果碰撞安全性为 t t t,这表明攻击需要大约 2 t 2^t 2t步。

消息认证是一种验证过程,用于确认以下内容:

  1. 接收到的消息来自声称的来源
  2. 接收到的消息未被篡改
  3. 消息的顺序和及时性

三种替代方法如下:

  • 消息加密
  • 哈希函数
  • 消息认证码(MAC)

对称消息加密

  • 加密也可以提供认证。
  • 如果使用对称加密,则:
    • 接收者知道消息必须由发送者创建,因为只有发送者和接收者知道密钥。
    • 如果消息具有合适的结构、冗余或校验和以检测任何更改,则可以检测到篡改。

公钥消息加密

  • 如果使用公钥加密:
    • 任何人都可能知道公钥。
    • 然而,如果:
      • 发送者使用其私钥对消息进行签名,
      • 然后使用接收者的公钥进行加密,
      • 则可以同时实现保密性和认证。
    • 再次需要识别被篡改的消息,但代价是需要对消息进行两次公钥操作。

消息认证码(MAC)

  • 通过一个算法生成一个小的固定大小的块,依赖于消息和某个密钥。
    MAC = C ( K , M ) \text{MAC} = C(K, M) MAC=C(K,M)
    • 与加密类似,但不需要可逆。
  • 将其附加到消息上作为签名。
  • 接收者对消息执行相同的计算,并检查其是否与MAC匹配。
  • 提供消息未被篡改且来自发送者的保证。
  • 构建MAC的一种常见方法是将密钥嵌入到无密钥哈希函数中,通过将密钥作为要哈希的消息的一部分。

嵌套MAC

  • 嵌套MAC通过两个(带密钥的)哈希函数族的组合构建MAC算法。
  • 假设 ( X , Y , K , G ) (X, Y, K, G) (X,Y,K,G) ( Y , Z , L , H ) (Y, Z, L, H) (Y,Z,L,H)是哈希函数族。
  • 这些哈希函数族的组合是哈希函数族 ( X , Z , M , G ∘ H ) (X, Z, M, G \circ H) (X,Z,M,GH),其中 M = K × L M = K \times L M=K×L
    ( G ∘ H ) ( K , K ′ ) = { f K ∘ h K ′ : f K ∈ G , h K ′ ∈ H } (G \circ H)_{(K,K')} = \{f_K \circ h_{K'} : f_K \in G, h_{K'} \in H\} (GH)(K,K)={fKhK:fKG,hKH}
    其中, ( f K ∘ h K ′ ) ( x ) = h K ′ ( f K ( x ) ) (f_K \circ h_{K'})(x) = h_{K'}(f_K(x)) (fKhK)(x)=hK(fK(x))
  • 嵌套MAC是安全的,前提是满足以下两个条件:
    1. ( Y , Z , L , H ) (Y, Z, L, H) (Y,Z,L,H)作为MAC是安全的,给定一个固定的(未知的)密钥;
    2. ( X , Y , K , G ) (X, Y, K, G) (X,Y,K,G)是抗碰撞的,给定一个固定的(未知的)密钥。

HMAC

  • HMAC是一种嵌套MAC算法,于2002年3月被采纳为FIPS标准。
  • 基于SHA-1的HMAC:
    • 一个512位的密钥,记为 K K K
    • i p a d ipad ipad o p a d opad opad是512位的常量,以十六进制表示如下:
      i p a d = 3636 ⋯ 36 , o p a d = 5 C 5 C ⋯ 5 C ipad = 3636 \cdots 36, \quad opad = 5C5C \cdots 5C ipad=363636,opad=5C5C5C
    • x x x是要认证的消息。160位的MAC定义如下:
      HMAC K ( x ) = SHA-1 ( ( K ⊕ o p a d ) ∥ SHA-1 ( ( K ⊕ i p a d ) ∥ x ) ) \text{HMAC}_K(x) = \text{SHA-1}((K \oplus opad) \parallel \text{SHA-1}((K \oplus ipad) \parallel x)) HMACK(x)=SHA-1((Kopad)SHA-1((Kipad)x))
  • HMAC非常高效。第二次“外部”哈希以固定长度的短比特串作为输入。
  • 随着SHA-3的采用,HMAC可能会变得过时,因为基于海绵构造的MAC不易受到长度扩展攻击。

CBC-MAC

  • 构建MAC的一种流行方法是使用块密码的CBC模式和一个固定的(公开的)初始化向量。
  • 已知如果底层加密满足适当的安全属性,则CBC-MAC是安全的。

消息认证码(MAC)的基本用途

  • 加密用于提供保密性。
  • MAC用于提供数据完整性。
  • 结合这两种过程通常称为认证加密
  • 优先采用“加密后加MAC”的方式。

参考:
sha3
https://www.bilibili.com/video/BV1oY41197g4
md5
https://www.bilibili.com/video/BV1u44y1z7t1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-S3 42引脚 语音控制模块、设备运转展示 GOOUUU TECH 果云科技S3-N16R8 控制舵机 LED开关 直流电机

最近还是想玩了下esp32,基于原来的开发板,看见佬做了一个语音识别的项目,通过这个语音识别可以控制LED开关和直流电机这些,详情可见视频(推荐)具体硬件就在下方。 信泰微】ESP32-S3 42引脚 语音控制模块、…

《Qt窗口动画实战:Qt实现呼吸灯效果》

Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…

数据库测试

TPCH 22条SQL语句分析 - xibuhaohao - 博客园 TPCH模型规范、测试说明及22条语句 - zhjh256 - 博客园 TPC-DS 性能比较:TiDB 与 Impala-PingCAP | 平凯星辰 揭秘Oracle TPC-H性能优化:如何提升数据库查询速度,揭秘实战技巧与挑战 引言 T…

《Kafka 理解: Broker、Topic 和 Partition》

Kafka 核心架构解析:从概念到实践 Kafka 是一个分布式流处理平台,广泛应用于日志收集、实时数据分析和事件驱动架构。本文将从 Kafka 的核心组件、工作原理、实际应用场景等方面进行详细解析,帮助读者深入理解 Kafka 的架构设计及其在大数据领域的重要性。 ​1. Kafka 的背…

Day11,Hot100(贪心算法)

贪心 (1)121. 买卖股票的最佳时机 第 i 天卖出的最大利润,即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…

STM32呼吸灯实验手册(TIM定时器)

一、实验目标 使用TIM定时器的PWM模式控制LED亮度实现LED渐亮渐灭的呼吸灯效果掌握HAL库的TIM配置方法 二、硬件准备 开发板:STM32F103C8T6LED模块:LED串联220Ω电阻两组USB-TTL调试器硬件连接 三、软件配置(STM32CubeMX) 打开…

51页精品PPT | 农产品区块链溯源信息化平台整体解决方案

PPT展示了一个基于区块链技术的农产品溯源信息化平台的整体解决方案。它从建设背景和需求分析出发,强调了农产品质量安全溯源的重要性以及国际国内的相关政策要求,指出了食品安全问题在流通环节中的根源。方案提出了全面感知、责任到人、定期考核和追溯反…

python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣(LeetCode) 解法 1:动态规划(O(n) 时间,O(n) 空间) class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…

Grafana服务安装并启动

Grafana服务安装并启动 1、介绍2、下载Grafana3、解压缩文件4、启动Grafana服务5、增加数据源,填写Prometheus访问地址6、增加图表 1、介绍 Grafana是一个开源的可视化系统监控和警报工具包。 2、下载Grafana 介绍:Grafana是一个开源的可视化系统监控和警报工具包…

6. grafana的graph简介

1. Settings功能 2. Visualization功能 (可视化的方式,后续会写一些) 3. Display 功能(显示方面的设置) bars 柱状图方式显示 lines(不选不会出功能) line width 线条的粗细 staircase 会让折…

react18自定义hook实现

概念:自定义 hook 是一种将组件逻辑提取到可复用函数中的方式,它允许你在多个组件中共享相同的状态和行为。自定义 hook 的本质上是一个普通的 JavaScript 函数,它可以使用 React 内部的 hook(如 useState、useEffect、useContext…

千峰React:函数组件使用(3)

多组态进行正确记忆 首先看这个代码 import { useState } from reactfunction App() {const [count, setCount] useState(0)const [count2, setCount2] useState(0)const [count3, setCount3] useState(0)const handleClick () > {setCount(count 1)}return (<div&…

xss-labs搭建及学习

搭建 搭建过程与一般的网站搭建差不多 参考资料 当出现这个界面就是成功了 学习 学习资料 xss概念理解&#xff1a;XSS跨站脚本攻击 xss常见标签&#xff1a;XSS常见触发标签 level1-直接打 这里提示payload长度为4查看一下源码 发现get传参name的值test插入了html里头&am…

网络安全审计员

在当今数字化时代&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言&#xff0c;网络安全不仅关乎数据资产的安全&#xff0c;更与组织的声誉、客户信任乃至法律法规的遵从…

安全模块设计:token服务、校验注解(开启token校验、开启签名校验、允许处理API日志)、获取当前用户信息的辅助类

文章目录 引言pom.xmlI 校验注解ApiValidationII token服务TokenService获取当前用户信息的辅助类III 域登录接口响应数据登陆用户信息引言 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/PO…

SpringBoot 2 后端通用开发模板搭建(异常处理,请求响应)

目录 一、环境准备 二、新建项目 三、整合依赖 1、MyBatis Plus 数据库操作 2、Hutool 工具库 3、Knife4j 接口文档 4、其他依赖 四、通用基础代码 1、自定义异常 2、响应包装类 3、全局异常处理器 4、请求包装类 5、全局跨域配置 补充&#xff1a;设置新建类/接…

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…

基于Redis 的分布式 session 图解

Redis 分布式 Session 工作原理 1. 传统 Session 的问题 在传统单服务器环境中&#xff0c;HTTP Session 存储在应用服务器的内存中。这在分布式系统中会导致问题&#xff1a; 用户的请求可能被分发到不同服务器&#xff0c;导致会话不一致服务器宕机会导致会话丢失需要依赖…

pikachu

暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程&#xff08;非常详细&#xff09;零基础入门到精通&#xff0c;看一篇就够了&#xff01;让你挖洞事半功倍&#xff01;_burpsuite使用教程-CSDN博客 登录页面&#xff0c;随意输入抓包&#xff0c;发送到攻击…

vmware:新装ubuntu无法使用ssh连接或者复制粘连

前言 如标题所示&#xff0c;我在使用vmware-workstation安装ubuntu22.04LTS桌面版虚拟机后&#xff0c;发现没办法使用ssh远程连接&#xff0c;或者与宿主机之间的复制粘连功能。 解决方案 卡了一天&#xff0c;以为是网络通讯问题&#xff0c;没想到是内部服务的问题。 远程连…