非对称加密算法与数字签名
非对称加密算法
非对称加密算法,也称为公钥加密算法,是一种利用公钥和私钥,实现加密和解密的密码技术。非对称加密算法的核心思想是将加密和解密分别分配给两个不同的密钥,一个是公钥,一个是私钥,公钥和私钥是成对使用。公钥可以自由传播,任何人都可以获取和使用,而私钥则只能由密钥的拥有者保管和使用。 在非对称加密算法中,公钥用于加密,私钥用于解密。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。这样,即使加密的信息被截获,黑客也无法通过公钥推算出私钥,因此无法破解信息内容。
非对称加密算法的优点是安全性高,密钥保密性好,公钥可以自由传播,易于实现数字签名、密钥交换等操作。其缺点是加密和解密速度较慢,不适合对大量数据进行加密处理。
非对称加密算法可以总结为两句话一句是“公钥加密,私钥解密”另一句是“私钥签名、公钥验签”。
“私钥签名、公钥验签”(加密)的流程图:
“私钥签名、公钥验签” (数字签名)流程图:
前面提到,公钥是公开的,私钥是私有不公开的。非对称加密算法是成对出现的,所以公钥能解开的密文一定是私钥加密的。
Bob使用自己的私钥计算签名后,Alice接到密文后使用Bob的公钥进行验签,如果验签成功,就能说明这条信息是由Bob发出的。如果Eve拦截信息后用自己的私钥签名,那么Alice在接受到密文后是无法用Bob的公钥验签成功,也就确认了信息的来源不是Bob。
可以看出我们这里数据是明文传输的,存在窃听风险。但是我们为了阐述数字签名机制是如何运转的,故意将保证信息机密性的机制省略了。
如果想要保证数据的机密性,我们常见的做法是,通信双方通过非对称加密安全交换对称加密的密钥,后续通信过程的数据都使用对称加密保证数据机密性。
并且「签名」的作用本身也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。
一般而言,我们不会直接对数据本身直接计算数字签名,为什么呢?
因为数字签名属于非对称加密,非对称加密依赖于复杂的数学运算,包括大数乘法、大数模等等,耗时比较久。
如果数据量大的时候计算数字签名将会比较耗时,所以一般做法是先将原数据进行 Hash 运算,得到的 Hash 值就叫做「摘要」
为什么「摘要」最好是不可逆转的?
因为既然 Alice 可以用 Bob 公钥解开签名,那么理论上其它人,比如 Eve 也可以使用 Bob 公钥解开签名拿到数据。
所以我们最好对数据的「摘要」进行签名,这样,Eve 就算解开签名,拿到的也是「摘要」,如果摘要是不可逆转的,也就是无法从摘要反推出原文,也就达到了保密的作用。
发送者使用私钥对「摘要」计算数字签名。那么接收者如何验证呢?
接受者 Alice 收到后,取下数字签名,同时用 Bob 的公钥解密,得到「摘要1」,证明确实是 Bob 发的。
再对邮件内容使用相同的散列函数计算「摘要2」,与上面得到的「摘要1」进行对比,两者一致就说明信息未被篡改。
这样两步分证明发送者身份和保证数据未被篡改。
Bob 和 Alice 现在可以依赖于对称加密进行保密通信,也可以依赖于数字签名验证消息是否是对方发送的。
但是这一切的根基是建立在 Alice 持有的公钥确实是 Bob的,反之亦然。
什么意思呢?
试想,Eve 如果将自己的公钥冒充 Bob 发送给 Alice,然后 Alice 保存了下来,那以后凡是 Bob 发送的消息,反而会验证签名失败,被当做冒充者。 那你可能会问,为什么 Eve 可以将自己的公钥发送给 Alice,而 Alice 毫不知情呢?
因为 Bob 的公钥是直接通过网络发送给 Alice的,所以 Eve 才可以在这一步做手脚,进行篡改,将自己的公钥冒充 Bob 发送给 Alice,也就是发送公钥这一步没有做到:
- 防篡改
- 防冒充
防篡改怎么和防冒充怎么实现的呢?
为了解决这个问题,就引入了「数字证书」