文章目录
常见符号
先复习一些常见符号
符号 | 意义 |
---|---|
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,…,p−1} |
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,…,p−1} |
{ 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 (p−1))+1。直接模 p p p无法保证哈希结果不为零。模 ( p − 1 ) (p-1) (p−1)使得值域为 [ 0 , p − 2 ] [0, p-2] [0,p−2],加1使得值域为 [ 1 , p − 1 ] [1, p-1] [1,p−1]。
由于哈希函数 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:y←Zp∗不可取分,即 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((ci⊕opad∥SHA256((ci⊕ipad∥x))。
最终构造
( ( 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)∥⋯∥Hk−1(x)) mod (p−1))+1。
扩展之后,取模之前的数的长度肯定大于 log 2 ( p ) \log_2(p) log2(p)。
我的疑问: 这里怎么保证抗碰撞性质?即使HMAC是抗碰撞的,那么攻击者不可以利用 ( p − 1 ) (p-1) (p−1)的循环制造扩展哈希的碰撞对吗?例如:攻击者分别给出5的原像和 ( p − 1 + 5 ) (p-1+5) (p−1+5)的原像。为了解决这个问题,可不可以一旦检测到 H 0 ∥ ⋯ ∥ H k − 1 ≥ ( p − 1 ) H_0 \| \cdots \| H_{k-1} \geq (p-1) H0∥⋯∥Hk−1≥(p−1),就对 x x x加一个随机成分 γ \gamma γ,利用雪崩效应使 H 0 ∥ ⋯ ∥ H k − 1 < ( p − 1 ) H_0 \| \cdots \| H_{k-1} < (p-1) H0∥⋯∥Hk−1<(p−1)?
如何实现 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:M→ZN∗
这里 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} m∈M填充随机成分。
如何实现 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都有提供相应函数,不再赘述。