除数字领域外,证明某个人的确生成了某个消息的属性至关重要。在我们现实生活中,这主要是通过纸上手写的签名来实现的。例如,如果我们签订一份合同或签署个订单,收到合同或订单的人就可以向法官证明,我们的确对这个消息进行了签名(当然,有人也可能伪造签名:但也存在不少法律和道德障碍防止大多数人这样做的企图)。与传统手写签名一样,只有创建数字消息的人才能生成有效的签名。为了使用密码学本原元达到这个目的,我们只能使用公钥密码学,其基本思想为:对消息签名的一方使用私钥,接收方则使用对应的公钥。
设Bob的私钥是保密的,只有他本人才能对消息x进行签名。为了将一个签名与一个消息对应,x也必须是数字签名的一个输入。Bob在对消息进行签名后,将得到的签名s附加到消息x之后,并将得到的(x,s)对发送给 Alice。请注意:数字签名本身是没有任何意义,除非与消息一起使用。没有消息的数字签名相当于没有对应合同或订单的手写签名。
数字签名本身仅仅是一个(大)整数,比如一个2048位长的字符串。只有在验证签名是否有效时,此签名对她而言才有用。因此,我们也需要一个输入为x和签名s的验证函数。为了将此签名与Bob挂上关系,此验证函数还需要Bob的公钥。尽管验证函数的输入很长,但其输出却非常简单,就是二进制语句“真”或“假”。如果x的确是使用公开验证密钥对应的私钥签名的,则输出为真,否则为假。
通过上面这些综合观察, 数字签名的核心属性为:被签名的消息可以明确地追踪到它的发起人,因为只有唯一的签名者的私钥才能计算出有效的签名。只有签名者自己才能生成一个签名,因此可以证明:签名方的确生成了这个消息。这样的证明甚至具有法律上的意义,比如美国的国际和国内商业行为的电子签名( ESIGN)法案,德国的签名法等。大家可能已经注意到,上面的基本协议没有为消息提供任何保密性,因为消息x是以明文形式发送的。当然,也可以使用类似AES或3DES的算法对其进行加密,进而保证其保密性三种主流的公钥算法家族,即整数因式分解、离散对数和椭圆曲线,都可以用来构建数字签名。