哈希函数
密码学中的哈希函数(hash functions)和通常意义下的哈希函数一样,都起到“把复杂对象映射到简单对象”的功能。从二进制串的角度,哈希函数能把长的二进制串映射到短的二进制串。
抗冲突性(Collision Resistance)
\(\newcommand{\A}{\mathcal{A}}\)正是因为定义域总比值域更大,所以数学意义上哈希冲突(collision)是不可避免的。所以我们不可能设计出一个没有哈希冲突的哈希函数。但我们容易设想,在密码学的背景下,我们只需要保证哈希函数在多项式次查询下发生冲突的概率可忽略就行了。下面我们需要严格定义怎样的哈希函数是抗冲突的(collision resistant)。
一个自然但是错误的想法是,对于一个哈希函数\(H\),我们让敌手\(\A\)参加以下实验:敌手可以不断选择\(x\)计算出\(H(x)\),重复多项式次;最终敌手选出\(x,x'\),如果\(x\neq x'\land H(x)=H(x')\)就称敌手成功。如果任何敌手成功的概率都\(\leq \text{negl}\),就称\(H\)是抗冲突的。这样的定义是显然有问题的,因为我们知道从数学上哈希冲突一定存在,因此对于每个给定的哈希函数一定存在一个直接输出这对哈希冲突的敌手。换言之如果采取上面这种定义,任何一个哈希函数都不是抗冲突的。
因此,为了定义一个合理的抗冲突性,我们需要引入key \(s\),把哈希函数看作关于\(s\)和自变量\(x\)的二元函数,称为keyed hash functions。一个keyed hash function是一个二元组\((\text{Gen},H)\),其中\(\text{Gen}\)是key的生成器,输入\(n\),输出\(s\)(这里我们不要求\(s\)的长度必须是\(n\),但我们要求至少要有一个规则使得我们能从\(s\)中推出\(n\)的大小)。\(H\)是一个确定性的函数,输入一个任意长度的01串\(x\),输出一个关于\(s,x\)的确定值\(H(s,x)\)。我们要求\(H(s,x)\in \{0,1\}^{\ell(n)}\),也即哈希函数的输出值的长度固定的关于\(n\)的函数。记\(H^s(x):=H(s,x)\)。通常,\(H\)只接受长度大于\(\ell(n)\)的输入\(x\)。另外,如果\(H\)只接受固定长度\(\ell'(n)\)的输入\(x\),我们就称\(H\)是一个定长哈希函数,又称为压缩函数(compression function)。现在我们可以设计一个实验定义keyed hash function的抗冲突性:对于一个哈希函数\((\text{Gen},H)\),我们让敌手\(\A\)参加以下实验:输入\(n\)给\(\text{Gen}\),得到key \(s\);把\(s\)交给敌手,敌手可以不断选择\(x\)计算\(H^s(x)\),重复多项式次;最终敌手选出\(x,x'\);如果\(x\neq x'\land H^s(x)=H^s(x')\)就称敌手成功。如果任何敌手成功的概率\(\Pr[HashColl_{A,H}=1]\leq \text{negl}\),就称\(H\)是抗冲突的。

浙公网安备 33010602011771号