单向函数(one-way function)的概念是公开密钥密码学的核心之一。尽管其本身并非一个协议,但它是重要的理论基础,对于很多协议来说它是一个重要的基本结构模块。单向函数顺向计算起来非常容易,但求逆却非常困难。也就是说,已知x,我们很容易计算出f(x)。但已知f(x),却很难计算出x。这里的“难”定义为,即使世界上所有的计算机都用来参与计算,从f(x)计算出x也要花费数百万年的时间。
下面举一个现实生活中的例子帮助大家理解:打碎碗碟是一个很好的单向函数的例子,我们将碗碟打碎成数百片的碎片是一件很容易的事情,但是把这些碎片再拼成一个完整无缺的碗碟却是一件非常困难的事情。
按照严格的数学定义,目前其实并不能完美地证明单向函数的存在性,同时也没有实际的证据表明能够构造出单向函数。即使如此,还是有很多函数看起来像单向函数:我们可以有效地计算它们,但至今我们还不知道有什么有效的方法能够很容易地求出它们的逆。比如,在有限域中计算x的平方很容易,但计算x的根则难得多。
单向函数一般是不用于加密的,因为用单向函数进行加密往往是不可行的(没有人能破解它)。
继续用现实生活中的例子进行说明:你要给你的朋友传递一个信息,你将信息写在了盘子上,然后你将盘子摔成无数的碎片,并将这些碎片寄给你的朋友,要求你的朋友读取你在盘子上写的信息。这是不是一件十分滑稽的事情?
那么单向函数是不是就没有意义了呢?事实当然不是这样,单向函数在密码学领域里发挥着非常重要的作用,其更是很多应用的理论基础。
Massey称此为视在困难性(Apparent Difficulty),相应的函数称之为视在单向函数。以此来和本质上(Essentially)的困难性相区分。单向函数是贯穿整个公钥密码体制的一个核心概念。单向函数在密码学上的常见应用如下:
(1)口令保护。我们熟知的口令保护方法是用对称加密算法进行加密。然而,对称算法加密必须有密钥,并且该密钥对验证口令的系统必须是可知的,因此验证口令的系统总是可以获取口令明文的。这样在口令的使用者与验证口令的系统之间就存在严重的信息不对称。我们可以使用单向函数对口令进行保护来解决这一问题。比如,系统方只存放口令经单向函数运算过的函数值,而验证则是将用户口令重新计算函数值,然后和系统中存放的值进行比对。如果比对成功,则验证通过。动态口令认证机制很多都是基于单向函数的原理进行设计的。
(2)用于数字签名时产生信息摘要的单向散列函数。公钥密码体制的运算量往往较大,为了避免对待签文件进行全文签名,一般在签名运算前使用单向散列算法对签名文件进行摘要处理,将待签文件压缩成一个分组之内的定长位串,以提高签名的效率。MD5和SHA-1就是两个曾被广泛使用、具有单向函数性质的摘要算法。