正如我们在上一节所看到的,一般哈希函数将任意长度的二进制字符串映射到固定长度。但是,在各种密码学原语中,最好不要简单的认为哈希函数的结果是固定长度的字符串,而是认为哈希函数产生了类似群一样的代数结构,同时保持了哈希函数的一些特性,比如抗原象形和抗碰撞性。
这样的哈希函数可以定义在不同的代数结构上,但从某种意义上来说,最基本的哈希函数是映射到群的哈希函数,因为这样的哈希函数可以很容易地拓展到其他代数结构中,如环或域。
下面给出更加精确的定义,设 $\Bbb{G}$ 是一个群,$\{0, 1\}^*$ 是所有有限的二进制字符串构成的集合,那么哈希到群(hash-to-group)函数是确定性的映射:
$$ H: \{0,1\}^* \to \Bbb{G}$$
如以下示例所示,哈希函数函数可以通过舍弃一些属性实现哈希结果为有限循环群。
示例 48
设 $\Bbb{G}$ 是一个 n 阶有限循环群,如果我们想实现一个哈希到群的函数,一个直接方法是可以基于以下观察结果: 大小为 k 的二进制字符串都可以解释为一个整数 $z \in \Z$ 且范围为 $0\leq z < 2^k$ 。
更加准确地说,设 $H: \{0,1\}^* \to \{0,1\}^k$ 是一个由参数 $k$ 定义的哈希函数,$g$ 是 $\Bbb{G}$ 的生成元,而 $s \in \{0,1\}^*$ 是一个二进制字符串。我们可以使用以下等式表示哈希结果:
$$z_{H(s)}= H(s)_0\cdot 2^0 + H(s)_1\cdot 2^1 + \ldots + H(s)_k \cdot 2^k$$
哈希到群 $\Bbb{G}$ 函数可以被定义为指数映射和 $H(s)$ 整数表示的组合:
$$H_{g} : {0,1}^* \to \Bbb{G}: s \mapsto g^{z_{H(s)}}$$
构造这样的哈希到群函数是简单的,且对于部分应用已经足够好了。然而在密码学应用中,该函数是没有足够安全保证的,我们可以在离散值 $H_g(s)$ 和 $H_g(t)$ 中构造离散对数关系,无论 $\Bbb{G}$ 是否是 DL 安全群。
更加准确的说,群元素 $H_g(s)$ 和 $H_g(t)$ 之间的离散关系是对于任何 $x \in \Z_n$ 都有 $H_g(s) = h_g(t)^x$ 成立。要了解如何构造满足此条件的 $x$ ,设 $z_{H(s)}$ 在 $\Z_n$ 中存在乘法逆元。在这种条件下,元素 $x=z_{H(t)}\cdot z_{H(s)}^{-1}$ 是 $H_g(s)$ 和 $H_g(t)$ 存在离散对数关系:
$$ \begin{align*} g^{z_{H(t)}} & = g^{z_{H(t)}} & \Leftrightarrow\\ g^{z_{H(t)}} & = g^{z_{H(t)}\cdot z_{H(s)}\cdot z_{H(s)}^{-1}} & \Leftrightarrow \\ g^{z_{H(t)}} & = g^{z_{H(s)}\cdot x} & \Leftrightarrow \\ H_g(t) & = (H_g(s))^x \end{align*} $$
因此,在哈希值之间存在离散对数关系的应用是不受欢迎的,我们需要一些其他方法构造哈希到群函数,这些方法始于在模 $r$ 的 $\Z_r$ 算术体系内进行哈希计算。