密码学(哈希函数)

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络流算法: Edmonds-Karp算法

图论相关帖子 基本概念图的表示: 邻接矩阵和邻接表图的遍历: 深度优先与广度优先拓扑排序图的最短路径:Dijkstra算法和Bellman-Ford算法最小生成树二分图多源最短路径强连通分量欧拉回路和汉密尔顿回路网络流算法: Edmonds-Karp算法网络流算法: Dinic算法 环境要求 本文所用…

R语言+AI提示词:贝叶斯广义线性混合效应模型GLMM生物学Meta分析

全文链接:https://tecdat.cn/?p40797 本文旨在帮助0基础或只有简单编程基础的研究学者,通过 AI 的提示词工程,使用 R 语言完成元分析,包括数据处理、模型构建、评估以及结果解读等步骤(点击文末“阅读原文”获取完整代…

深度学习简介

目录 一、剖析,什么是深度学习?二、深度学习人工神经网络、机器学习、人工智能关系三、深度学习的发展3.1 从感知机到人工神经网络1. 早期发展2. 陷入低谷3. 短暂复兴4. 再次受挫5. 深度突破 3.2 深度学习时代1. 语音领域突破2. 大规模图像数据库3. Alex…

进行性核上性麻痹患者的生活护理指南

进行性核上性麻痹是一种神经系统退行性疾病,合理的生活护理能有效改善症状,提高生活质量。 居家环境要安全。移除地面杂物,铺设防滑垫,安装扶手,降低跌倒风险。在浴室、厨房等湿滑区域要特别加强防护措施。建议在床边、…

【数据结构】链表与顺序表的比较

链表和顺序表是两种常见的数据结构,各有优缺点,适用于不同的场景。 ### 顺序表(数组) 顺序表在内存中连续存储元素,支持随机访问。 **优点:** 1. **随机访问**:通过索引直接访问元素&#xf…

osgEarth安装总结

第一步:安装OSG 直接通过git下载源码,使用cmake进行编译, git clone --depth 1 https://github.com/openscenegraph/OpenSceneGraph.git mkdir build cd build cmake .. make sudo make isntall编译过程中缺什么库,就安装什么库 …

网络安全-使用DeepSeek来获取sqlmap的攻击payload

文章目录 概述DeepSeek使用创建示例数据库创建API测试sqlmap部分日志参考 概述 今天来使用DeepSeek做安全测试,看看在有思路的情况下实现的快不快。 DeepSeek使用 我有一个思路,想要测试sqlmap工具如何dump数据库的: 连接mysql数据库&#…

25物理学研究生复试面试问题汇总 物理学专业知识问题很全! 物理学复试全流程攻略 物理学考研复试调剂真题汇总

正在为物理考研复试专业面试发愁的你,是不是不知道从哪开始准备? 学姐告诉你,其实物理考研复试并没有你想象的那么难!只要掌握正确的备考方法,稳扎稳打,你也可以轻松拿下高分!今天给大家准备了…

KTV点歌系统

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…

开源绝版经典小游戏合集

随着生活节奏的日益加快,我们常常需要一些小游戏来缓解疲惫的身心。过去,Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱,但随着系统的更新换代,这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏&#xff…

【AI Coding】Windsurf:【Prompt】全局规则与项目规则「可直接使用」

先看效果 这是在windsurf中与ai对话的反馈 为什么要写这个规则(Prompt) 写的这份针对windsurf的全局规则,详细的涵盖了前端的各个方向:技术栈、测试、工程、性能优化、回答规范 通过提前预设一些关键词,可以提高回答…

传输层协议TCP

TCP全称为 传输控制协议(Transmission Control Protocol),就是要对数据的传输进行一个详细的控制。 TCP协议段格式 源端口:发送方的端口号,用来标识发送端的应用程序或进程。 目标端口:接收方的端口号,用来标识接收端…

SpringBoot 日志 与 门面模式(外观模式)

日志的使用 先引入日志对象,注意是 引入的是 org.slf4j 这个包下的 Logger 在传参上:可以传入类名,或者一个字符串,该参数表示日志名称 例如如果传入 “aaaa”,那么日志的名称就是 aaaa RequestMapping("/log&…

【MySQL篇】数据类型

目录 前言: 1,数据类型的分类 ​编辑 2 ,数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float类型 2.3.2 decimal类型 3,字符串类型 3.1 char 3.2 varchar 3.3 char与varchar的比较 3.4日期和时间类型 3.5 …

网络类型及数据链路层协议

网络类型的分类: p2p----point to point---点到点网络MA---Multi-Access---多点接入网络 BMA--- Broadcast Multi-Access Network ---广播型多点接入网络NBMA--- Non-Broadcast Multi-Access Network ---非广播型多点接入网络 数据链路层协议: MA网络…

序列化选型:字节流抑或字符串

序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…

企业微信里可以使用的企业内刊制作工具,FLBOOK

如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…

Java 大视界 -- Java 大数据在智能安防入侵检测与行为分析中的应用(108)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Spring IoC

前言: 我们介绍下Spring. 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 这么说可能还是很抽象.用一句话概括就是Spring就是一个包含了众多工具和方法的IoC容器. 所…

如何配置虚拟机的IP上网

一.配置vm虚拟机网段 在虚拟机主页点击编辑->虚拟网络编辑器,选择VMnet8,要改动两个地方: 1.子网IP改成192.168.10.0 2.NAT设置->192.168.10.2 让所有的vm配置的虚拟机使用NAT时,它们的网段都是一致的。注意:这里的第三个部…