如何用MD5和SHA等构造密码方案中的哈希函数

常见符号

先复习一些常见符号

符号 意义
p , q p, q p,q 大素数
Z p \mathbb{Z}_p Zp 集合 { 0 , 1 , 2 , … , p − 1 } \{ 0,1,2, \dots, p-1 \} { 0,1,2,,p1}
Z N ∗ \mathbb{Z}^*_N ZN N N N互质的整数
Z p ∗ \mathbb{Z}^*_p Zp p p p互质的整数,即集合 { 1 , … , p − 1 } \{1, \dots, p-1\} { 1,,p1}
{ 0 , 1 } λ \{0, 1\}^\lambda { 0,1}λ 长度为 λ \lambda λ的比特串
{ 0 , 1 } ∗ \{0, 1\}^* { 0,1} 任意长度的比特串
G \mathbb{G} G 阶为素数的有限循环群
G \mathbb{G} G 双线性配对有关的有限循环群

如何实现 H : { 0 , 1 } ∗ → Z p ∗ H : \{0, 1\}^* \to \mathbb{Z}^*_p H:{ 0,1}Zp

记输入为 x x x,用SHA256哈希函数实现 H H H,且 log ⁡ 2 ( p ) > 256 \log_2 (p) > 256 log2(p)>256注: 这里的哈希函数 H H H在密码方案中一般被当成随机谕言机

直接思路: ( S H A 256 ( x )   m o d   ( p − 1 ) ) + 1 \left( \mathsf{SHA256}(x) ~ \mathrm{mod} ~ (p-1) \right) + 1 (SHA256(x) mod (p1))+1。直接模 p p p无法保证哈希结果不为零。模 ( p − 1 ) (p-1) (p1)使得值域为 [ 0 , p − 2 ] [0, p-2] [0,p2],加1使得值域为 [ 1 , p − 1 ] [1, p-1] [1,p1]

由于哈希函数 S H A 256 ( x ) < 2 256 \mathsf{SHA256}(x) < 2^{256} SHA256(x)<2256,而 Z p ∗ \mathbb{Z}^*_p Zp元素比特串长度大于256,所以上述思路无法做到与随机函数 f : y ← Z p ∗ f: y \gets \mathbb{Z}^*_p f:yZp不可取分,即 Z p ∗ \mathbb{Z}^*_p Zp中有一些元素总是取不到,这与随机谕言机的定义冲突。

改进思路: 拓展SHA256的长度。

k = 1 + ⌈ log ⁡ 2 ( p ) / 256 ⌉ k = 1 + \lceil \log_2(p) / 256 \rceil k=1+log2(p)/256,利用HMAC构造 k k k不同的输出为256比特的哈希函数 H i ( x ) H_i(x) Hi(x),HMAC的定义详见维基百科。

在这里插入图片描述

具体而言,对 H i ( x ) H_i(x) Hi(x),随机选取512比特的种子 c i c_i ci,使

H i ( x ) = S H A 256 ( ( c i ⊕ o p a d ∥ S H A 256 ( ( c i ⊕ i p a d ∥ x ) ) H_i(x) = \mathsf{SHA256} \Big( (c_i \oplus\mathsf{opad} \| \mathsf{SHA256} \big( (c_i \oplus\mathsf{ipad} \| x \big) \Big) Hi(x)=SHA256((ciopadSHA256((ciipadx))

最终构造

( ( H 0 ( x ) ∥ H 1 ( x ) ∥ ⋯ ∥ H k − 1 ( x ) )   m o d   ( p − 1 ) ) + 1 \Big( \big( H_0(x) \| H_1(x) \| \cdots \| H_{k-1}(x) \big) ~ \mathrm{mod} ~ (p-1) \Big) + 1 ((H0(x)H1(x)Hk1(x)) mod (p1))+1

扩展之后,取模之前的数的长度肯定大于 log ⁡ 2 ( p ) \log_2(p) log2(p)

我的疑问: 这里怎么保证抗碰撞性质?即使HMAC是抗碰撞的,那么攻击者不可以利用 ( p − 1 ) (p-1) (p1)的循环制造扩展哈希的碰撞对吗?例如:攻击者分别给出5的原像和 ( p − 1 + 5 ) (p-1+5) (p1+5)的原像。为了解决这个问题,可不可以一旦检测到 H 0 ∥ ⋯ ∥ H k − 1 ≥ ( p − 1 ) H_0 \| \cdots \| H_{k-1} \geq (p-1) H0Hk1(p1),就对 x x x加一个随机成分 γ \gamma γ,利用雪崩效应使 H 0 ∥ ⋯ ∥ H k − 1 < ( p − 1 ) H_0 \| \cdots \| H_{k-1} < (p-1) H0Hk1<(p1)

如何实现 H : Z p ∗ → { 0 , 1 } λ H: \mathbb{Z}^*_p \to \{0, 1\}^\lambda H:Zp{ 0,1}λ

跟上述做法类似,用 2 λ 2^\lambda 2λ取模。

参考答案:网址

如何实现 H : M → Z N ∗ H: \mathcal{M} \to \mathbb{Z}^*_N H:MZN

这里 M \mathcal{M} M是消息(message)的定义域, N N N是大素数 p p p q q q的积。

参考答案:网址

主要思路: Z N ∗ \mathbb{Z}^*_N ZN不包含 p , q , 0 p, q, 0 p,q,0,那么可以直接用哈希函数对 N N N取模。只要 N N N足够大,刚好取到 p , q , 0 p, q, 0 p,q,0的概率为可忽略函数。

个人思考: 若运气不好刚好取到 p , q , 0 p, q, 0 p,q,0,则对 m ∈ M m \in \mathcal{M} mM填充随机成分。

如何实现 H : { 0 , 1 } ∗ → G H: \{0, 1\}^* \to \mathbb{G} H:{ 0,1}G

可以先将输入 x x x映射至 Z q \mathbb{Z}_q Zq得到 h h h,再将 g h g^h gh作为哈希输出。这里的 g g g是群的生成元。

双线性对上的哈希函数

PBC library和Charm-Crypto library都有提供相应函数,不再赘述。

猜你喜欢

转载自blog.csdn.net/u014134327/article/details/129364157