密码学(哈希函数)
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),满足以下条件:
- X \mathcal{X} X 是可能的消息集合
- Y \mathcal{Y} Y 是可能的消息摘要或认证标签(或简称标签)的有限集合
- K \mathcal{K} K,即密钥空间,是可能的密钥的有限集合
- 对于每个 K ∈ K K \in \mathcal{K} K∈K,存在一个Hash函数 h K ∈ H h_K \in \mathcal{H} hK∈H。每个 h K : X → Y h_K : \mathcal{X} \rightarrow \mathcal{Y} hK:X→Y。
在上述定义中, 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}| ∣X∣≥2∣Y∣。
4.2 哈希函数的安全性
如果一个哈希函数被认为是安全的,那么以下三个问题应该难以解决:
- 原像问题(Preimage)
- 第二原像问题(Second Preimage)
- 碰撞问题(Collision)
问题 5.1:原像问题
实例: 给定一个哈希函数 h : X → Y h: \mathcal{X} \rightarrow \mathcal{Y} h:X→Y 和一个元素 y ∈ Y y \in \mathcal{Y} y∈Y。
求解: 找到一个 x ∈ X x \in \mathcal{X} x∈X 使得 h ( x ) = y h(x) = y h(x)=y。
问题 5.2:第二原像问题
实例: 给定一个哈希函数 h : X → Y h: \mathcal{X} \rightarrow \mathcal{Y} h:X→Y 和一个元素 x ∈ X x \in \mathcal{X} x∈X。
求解: 找到一个 x ′ ∈ X x' \in \mathcal{X} x′∈X,使得 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:X→Y。
求解: 寻找 x , x ′ ∈ X x, x' \in \mathcal{X} x,x′∈X,使得 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:X→Y是随机选择的,我们只能通过预言机访问该函数 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}} h∈FX,Y 是随机选择的,并且设 X 0 ⊆ X \mathcal{X}_0 \subseteq \mathcal{X} X0⊆X。记 ∣ Y ∣ = M |\mathcal{Y}| = M ∣Y∣=M。假设 h ( x ) h(x) h(x) 的值仅当 x ∈ X 0 x \in \mathcal{X}_0 x∈X0 时通过查询 h h h 的预言机来确定。那么对于所有 x ∈ X ∖ X 0 x \in \mathcal{X} \setminus \mathcal{X}_0 x∈X∖X0 和所有 y ∈ Y y \in \mathcal{Y} y∈Y,有 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} X0⊆X, ∣ X 0 ∣ = Q |\mathcal{X}_0| = Q ∣X0∣=Q
对于每个 x ∈ X 0 x \in \mathcal{X}_0 x∈X0
如果 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} X0⊆X 且 ∣ X 0 ∣ = Q |\mathcal{X}_0| = Q ∣X0∣=Q,算法 5.1 的平均成功概率为 ϵ = 1 − ( 1 − 1 / M ) Q \epsilon = 1 - (1 - 1/M)^Q ϵ=1−(1−1/M)Q。
该定理描述了算法 5.1 在给定条件下的平均成功概率。
算法 5.2:FIND-SECOND-PREIMAGE(h, x, Q)
y ← h ( x ) y \leftarrow h(x) y←h(x)
选择 X 0 ⊆ X ∖ { x } \mathcal{X}_0 \subseteq \mathcal{X} \setminus \{x\} X0⊆X∖{x}, ∣ X 0 ∣ = Q − 1 |\mathcal{X}_0| = Q - 1 ∣X0∣=Q−1
对于每个 x 0 ∈ X 0 x_0 \in \mathcal{X}_0 x0∈X0
如果 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\} X0⊆X∖{x} 且 ∣ X 0 ∣ = Q − 1 |\mathcal{X}_0| = Q - 1 ∣X0∣=Q−1,算法 5.2 的成功概率为 ϵ = 1 − ( 1 − 1 / M ) Q − 1 \epsilon = 1 - (1 - 1/M)^{Q-1} ϵ=1−(1−1/M)Q−1。
以下是对每个图片内容的介绍,使用中文和Markdown格式,并且按照您的要求使用数学公式和符号:
算法 5.3:FIND-COLLISION(h, Q)
选择 X 0 ⊆ X , ∣ X 0 ∣ = Q \mathcal{X}_0 \subseteq \mathcal{X}, |\mathcal{X}_0| = Q X0⊆X,∣X0∣=Q
对于每个 x ∈ X 0 x \in \mathcal{X}_0 x∈X0
执行 y x ← h ( x ) y_x \leftarrow h(x) yx←h(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} X0⊆X 且 ∣ 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−(MM−1)(MM−2)⋯(MM−Q+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=1∏Q−1(1−Mi)≈i=1∏Q−1e−Mi=e−∑i=1Q−1Mi=e2M−Q(Q−1).
因此,我们可以估计找到至少一个碰撞的概率为
1 − e − Q ( Q − 1 ) 2 M . 1 - e^{\frac{-Q(Q-1)}{2M}}. 1−e2M−Q(Q−1).
这段内容提供了找到至少一个碰撞的概率估计。
碰撞概率估计(忽略 − Q -Q −Q 项)
如果我们忽略 − Q -Q −Q 项,那么我们估计
Q ≈ 2 M ln 1 1 − ϵ . Q \approx \sqrt{2M \ln \frac{1}{1-\epsilon}}. Q≈2Mln1−ϵ1.
如果我们取 ϵ = 0.5 \epsilon = 0.5 ϵ=0.5,那么我们的估计是
Q ≈ 1.17 M . Q \approx 1.17 \sqrt{M}. Q≈1.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=t−1
- 如果可以为 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 t≥1)。我们将基于这个压缩函数构建一个迭代哈希函数
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 ∣x∣≥m+t+1,构造一个字符串 y y y,使用一个公共算法,使得 ∣ y ∣ ≡ 0 ( mod t ) |y| \equiv 0 (\text{mod } t) ∣y∣≡0(mod t)。记作
y = y 1 ∥ y 2 ∣ ⋯ ∣ y r , y=y_{1}\|y_{2}|\cdots|y_{r}, y=y1∥y2∣⋯∣yr,
其中 ∣ y i ∣ = t |y_{i}|=t ∣yi∣=t 对于 1 ≤ i ≤ r 1\leq i\leq r 1≤i≤r。
一个常用的预处理步骤是按照以下方式构造字符串 y y y:
y = x ∥ pad ( x ) , y = x \| \text{pad}(x), y=x∥pad(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*} z0z1z2zr←IV←compress(z0∥y1)←compress(z1∥y2)⋮←compress(zr−1∥yr).
输出转换
设 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*} z0z1z2z3←IV=1111←compress(z0∥y1)←compress(1111∥1010)←compress(11111010)=0110(通过一定算法)←compress(z1∥y2)←compress(0110∥1101)←compress(01101101)=1001←compress(z2∥y3)←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)。
海绵函数
-
输入为消息 M M M,这是一个任意长度的比特串。
-
M M M适当填充,使其长度是 r r r的倍数。
-
然后将填充后的消息分成长度为 r r r的块。
-
吸收阶段(Absorbing Phase):将填充后消息的第一个块与状态的前 r r r位进行异或操作。然后应用函数 f f f,更新状态。
-
挤压阶段(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步。
消息认证是一种验证过程,用于确认以下内容:
- 接收到的消息来自声称的来源
- 接收到的消息未被篡改
- 消息的顺序和及时性
三种替代方法如下:
- 消息加密
- 哈希函数
- 消息认证码(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,G∘H),其中 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\} (G∘H)(K,K′)={fK∘hK′:fK∈G,hK′∈H}
其中, ( f K ∘ h K ′ ) ( x ) = h K ′ ( f K ( x ) ) (f_K \circ h_{K'})(x) = h_{K'}(f_K(x)) (fK∘hK′)(x)=hK′(fK(x)) - 嵌套MAC是安全的,前提是满足以下两个条件:
- ( Y , Z , L , H ) (Y, Z, L, H) (Y,Z,L,H)作为MAC是安全的,给定一个固定的(未知的)密钥;
- ( 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=3636⋯36,opad=5C5C⋯5C - 设 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((K⊕opad)∥SHA-1((K⊕ipad)∥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
相关文章:
密码学(哈希函数)
4.1 Hash函数与数据完整性 数据完整性: 检测传输消息(加密或未加密)的修改。 密码学Hash函数: 构建某些数据的简短“指纹”;如果数据被篡改,则该指纹(以高概率)不再有效。Hash函数…...
设计模式Python版 备忘录模式
文章目录 前言一、备忘录模式二、备忘录模式示例1三、备忘录模式示例2 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:…...
CES Asia 2025聚焦量子计算,多领域进展引关注
作为亚洲地区极具影响力的科技盛会,CES Asia 2025第七届亚洲消费电子技术贸易展(赛逸展)将在首都北京举办。本届展会以“创新、智能、互联”为主题,将全方位展示全球消费科技领域的最新成果与发展趋势。其中,量子计算作…...
MySQL索引深度剖析:从数据结构到实际应用
引言 在数据库系统中,索引是提高查询效率的关键技术之一。MySQL作为最流行的关系型数据库之一,其索引机制尤为重要。本文将剖析MySQL索引的数据结构、分类、创建方式以及实际应用场景,帮助读者更好地理解和应用索引技术。 主体部分 1. MyS…...
【deepseek】本地部署+RAG知识库挂载+对话测试
文章目录 前言一、Deepseek模型下载(以7B为例)二、RAG本地知识库挂载三、创建本地对话脚本四、结果展示 前言 本文主要涵盖Deepseek在ubuntu系统中的部署全流程,包括模型的下载、系统部署、本地文档向量化、向量列表存储、RAG知识库挂载、对话测试等内容 一、Deeps…...
Vue.js 组件开发全面详解及应用案例
Vue.js 的组件化开发是其核心特性之一,使得代码复用、维护和扩展变得更加容易。以下是关于 Vue.js 组件开发的全面解析,并附带一个实际应用案例。 一、组件基础概念 1. 什么是组件? 组件是 Vue 应用的基本构建块,封装了 HTML、C…...
java面试场景问题
还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…...
MySQL数据库基本概念
目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…...
【wiki知识库】07.用户管理后端SpringBoot部分
目录 一、今日目标 二、??SpringBoot部分类的添加 2.1 使用逆向工程新增User模块 2.2 UserQueryParam添加 2.3 UserSaveParam添加 2.4 UserResetPasswordParam添加 2.5 UserQueryVo添加 2.6 SnowFlake工具类 三、??后端新增接口? 3.1 /user/list接口添加 3.2 /…...
千峰React:案例二
完成对html文档还有css的引入,引入一下数据: import { func } from prop-types import ./购物车样式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…...
Junit框架缺点
JUnit 是 Java 生态中最流行的单元测试框架,广泛应用于单元测试和集成测试中。尽管它功能强大且易于使用,但也存在一些缺陷和局限性。以下是 JUnit 的主要缺点: 1. 功能相对固定 问题:JUnit 的核心功能相对固定,缺乏灵…...
计算机毕业设计SpringBoot+Vue.js公司日常考勤系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Python线程池知多少
目录 目标 Python版本 官方文档 概述 线程池 实战 创建线程池的基本语法 批量提交任务 生产者&消费者模型 目标 掌握线程池的基本概念和使用方法。 Python版本 Python 3.9.18 官方文档 concurrent.futures — Launching parallel taskshttps://docs.python.org/3…...
MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 6
从6到12章将会是重中之重,请一定好好看 第06章_索引的数据结构 1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一…...
C++动态与静态转换区别详解
文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中,dynamic_cast 和 static_cast 是两种不同的类型转换操作符,主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别: 一、 类…...
面向AI 的前端发展及初识大模型
AI带来的开发范式迁移 随着AI的涌现,对前端的发展也有着非常大的影响,总结过去前端的发展路径,目前应该属于又一次的大规模的开发范式迁移阶段。上一个阶段是从jquery到React/Vue/Angular迁移(jquery之前的就不讨论了)…...
Java入门的基础学习
Java的基础语法知识 一 初始Java二 Java数据类型和变量1.字面常量2.数据类型基本数据类型引用数据类型 3.变量整型变量浮点型变量字符型变量布尔型变量 4.类型转化和提升类型转化类型提升 三 运算符1.算数运算符2.关系操作符3.逻辑运算符:&&,||&…...
万字详解 MySQL MGR 高可用集群搭建
文章目录 1、MGR 前置介绍 1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程 2.1、环境准备2.2、搭建流程 2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故…...
脚本无法获取响应主体(原因:CORS Missing Allow Credentials)
背景: 前端的端口号8080,后端8000。需在前端向后端传一个参数,让后端访问数据库去检测此参数是否出现过。涉及跨域请求,一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码,出现了这个bug࿰…...
GD32F450 使用
GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 1. 相关知识 参数配…...
神经网络代码入门解析
神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…...
Android 数据库查询对比(APN案例)
功能背景 APN 数据通常存储在数据库中,由TelephonyProvider提供。当用户进入APN设置界面时,Activity会启动,AOSP源码通过ContentResolver查询APN数据。关键分析点在于这个查询操作是否在主线程执行,因为主线程上的耗时操作会导致…...
神卓 S500 异地组网设备实现监控视频异地组网的详细步骤
一、设备与环境准备 硬件清单 主设备:神卓 S500 异地组网路由器 1子设备:神卓 S500 或兼容设备 N(需通过官网认证)监控设备:支持 RTSP/ONVIF 协议的 NVR、摄像头网络要求:各网点需稳定联网(推荐…...
golang安装(1.23.6)
1.切换到安装目录 cd /usr/local 2.下载安装包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3.解压安装包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4.配置环境变量 vi /etc/profile export PATH$…...
leetcode35.搜索插入位置
题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出…...
LeetCode第57题_插入区间
LeetCode 第57题:插入区间 题目描述 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 难度 中…...
人工智能之数学基础:线性代数中矩阵的运算
本文重点 矩阵的运算在解决线性方程组、描述线性变换等方面发挥着至关重要的作用。通过对矩阵进行各种运算,可以简化问题、揭示问题的本质特征。在实际应用中,我们可以利用矩阵运算来处理图像变换、数据分析、电路网络等问题。深入理解和掌握矩阵的运算,对于学习线性代数以…...
SQL Server 创建用户并授权
创建用户前需要有一个数据库,创建数据库命令如下: CREATE DATABASE [数据库名称]; CREATE DATABASE database1;一、创建登录用户 方式1:SQL命令 命令格式:CREATE LOGIN [用户名] WITH PASSWORD ‘密码’; 例如,创…...
MySQL双主搭建-5.7.35
文章目录 上传并安装MySQL 5.7.35双主复制的配置实例一:172.25.0.19:实例二:172.25.0.20: 配置复制用户在实例 1 (172.25.0.19)上执行:在实例 2 (172.25.0.20)上执行&…...
RNN实现精神分裂症患者诊断(pytorch)
RNN理论知识 RNN(Recurrent Neural Network,循环神经网络) 是一种 专门用于处理序列数据(如时间序列、文本、语音、视频等)的神经网络。与普通的前馈神经网络(如 MLP、CNN)不同,RNN…...
Python中字符串的常用操作
一、r原样输出 在 Python 中,字符串前加 r(即 r"string" 或 rstring)表示创建一个原始字符串(raw string)。下面详细介绍原始字符串的特点、使用场景及与普通字符串的对比。 特点 忽略转义字符࿱…...
uniapp 本地数据库多端适配实例(根据运行环境自动选择适配器)
项目有个需求,需要生成app和小程序,app支持离线数据库,如果当前没有网络提醒用户开启离线模式,所以就随便搞了下,具体的思路就是: 一个接口和多个实现类(类似后端的模板设计模式)&am…...
Spring Cloud Gateway 整合Spring Security
做了一个Spring Cloud项目,网关采用 Spring Cloud Gateway,想要用 Spring Security 进行权限校验,由于 Spring Cloud Gateway 采用 webflux ,所以平时用的 mvc 配置是无效的,本文实现了 webflu 下的登陆校验。 1. Sec…...
【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言依赖Flask构建本地网页访问LM Studio 开启网址访问DeepSeek 调用模板Flask 访问本…...
Windows对比MacOS
Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3࿱…...
React实现无缝滚动轮播图
实现效果: 由于是演示代码,我是直接写在了App.tsx里面在 文件位置如下: App.tsx代码如下: import { useState, useEffect, useCallback, useRef } from "react"; import { ImageContainer } from "./view/ImageC…...
Ubuntu20.04确认cuda和cudnn已经安装成功
当我们通过官网安装cuda和cudnn时,终端执行完命令后我们仍不能确定是否已经安装成功。接下来教大家用几句命令测试。 cuda 检测版本号 nvcc -V如果输出如下,则安装成功。 可以看到版本号是11.2 cudnn检测版本号 有两种命令:如果你的cudn…...
sqlilab 46 关(布尔、时间盲注)
sqlilabs 46关(布尔、时间盲注) 46关有变化了,需要我们输入sort,那我们就从sort1开始 递增测试: 发现测试到sort4就出现报错: 我们查看源码: 从图中可看出:用户输入的sort值被用于查…...
AI时代保护自己的隐私
人工智能最重要的就是数据,让我们面对现实,大多数人都不知道他们每天要向人工智能提供多少数据。你输入的每条聊天记录,你发出的每条语音命令,人工智能生成的每张图片、电子邮件和文本。我建设了一个网站(haptool.com),…...
模型优化之强化学习(RL)与监督微调(SFT)的区别和联系
强化学习(RL)与监督微调(SFT)是机器学习中两种重要的模型优化方法,它们在目标、数据依赖、应用场景及实现方式上既有联系又有区别。 想了解有关deepseek本地训练的内容可以看我的文章: 本地基于GGUF部署的…...
Buildroot 添加自定义模块-内置文件到文件系统
目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统,适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…...
蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗
ANS-BT101M是安朔科技推出的蓝牙接近开关模块,低功耗ble5.1,采用UART通信接口,实现手机自动无感连接,无需APP,人靠近车门自动开锁,支持苹果、安卓、鸿蒙系统,也可以通过手机手动开锁或上锁&…...
计算机毕业设计SpringBoot+Vue.js基于工程教育认证的计算机课程管理平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
企业知识库搭建:14款开源与免费系统选择
本文介绍了以下14 款知识库管理系统:1.Worktile;2.PingCode;3.石墨文档; 4. 语雀; 5. 有道云笔记; 6. Bitrix24; 7. Logseq等。 在如今的数字化时代,企业和团队面临着越来越多的信息…...
蓝桥杯(握手问题)
小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。 但有 7个人,这 7 人彼此之间没有进行握手 (但这 7 人与除这 7 人以外…...
如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程
如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程 在软件开发过程中,持续集成(CI)和持续交付(CD)已经成为现代开发和运维的标准实践。随着代码的迭代越来越频繁,传统的手动部署方式不仅低效,而且容易出错。为了提高开发效率和代码质量,Jenkins作为一款…...
c++字符编码/乱码问题
基本概念 c11版本引入了char16_t和char32_t两个类型,他们的特点分别如下: char16_t 16位的unicode字符类型用于表示UTF-16编码大小:2字节字面量前缀:u char32_t 32位unicode字符类型用于表示UTF-32编码大小:4字节…...
侯捷 C++ 课程学习笔记:深入理解类与继承
文章目录 每日一句正能量一、课程背景二、学习内容:类与继承(一)类的基本概念1. 类的定义与实例化2. 构造函数与析构函数 (二)继承1. 单继承与多继承2. 虚函数与多态 三、学习心得四、总结 每日一句正能量 有种承担&am…...
初始化列表
一:声明,定义,赋值的区别 ①:声明 这里,int _year; int _month;int _day; 是成员变量的声明,它们告诉编译器: 类 Date中有三个成员变量_year和 _month和_day。 它们的类型分别都是 int 此…...
7.1 - 定时器之中断控制LED实验
文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过CPU私有定时器的中断,每 200ms 控制一次PS LED灯的亮灭。 2 系统框图 3 软件设计 注意事项: 定时器中断在收到中断后,只需清除中断状态,无需禁用中断、启…...