在普通文件中,签名的作用是让对方确信这封信来自于发信人。签名之所以可信,是因为笔迹是难以模仿的。而在互联网出现后,使用RSA加密法就会出现一个问题——可能没法确认这条消息是不是落款人发的。
咱们假设一个场景:
爱丽丝和伊芙同时在追求鲍勃,伊芙可以查一查鲍勃的公钥,然后冒充爱丽丝给鲍勃写信,说自己已经结婚,孩子都好几岁了。这样鲍勃就不会再选择爱丽丝,而会选择伊芙。
那鲍勃怎么才能确认这封信确实源自爱丽丝呢?那就需要签名才行。但问题是,数字信息没有笔迹的。怎么办呢?
没关系。只要把RSA公钥加密私钥解密的过程,反着操作一遍,就可以起到确认身份的功能。
2
这里有点复杂,咱们慢慢说:
本来一条信息应该用公钥加密,私钥解密。但有这样一个事实:
在数学上可以保证,假如我们不那么操作,而是反向操作——用自己的私钥加密信息,而用那把公钥解密的话,也一样可以解开。
不过因为爱丽丝的公钥完全是公开的,所以她能解开,其他人也都可以解开。这样加密就很脆弱,但是这个过程正好可以用来确认身份。
你想,如果一条加密过的信息能用爱丽丝的公钥解开,那就说明这条信息当初肯定是用爱丽丝的私钥加密的。世界上谁有爱丽丝的私钥呢?只有她自己。所以凡是这样的信息,就一定证明它来自于爱丽丝。签名的功能,就是这样实现的。
不过这种信息用公钥就可以解开,谁都可以看,太不安全了,还要改进一下。怎么改进呢?
就是用鲍勃的公钥再加密一次。因为信息是发给鲍勃的,为了只给鲍勃看,所以就用鲍勃的公钥再加一次密。
所以,这条消息等于是加了两次密。第一次加密,是为了确保发信人是爱丽丝;第二次加密,是保证只有鲍勃能解开。
所以带着签名的RSA加密,就有点儿像一个鸡蛋有两层壳:第一层软壳在内层,是为了核对签名用的;第二层硬壳,是在外面保护信息用的。
