私钥_公钥_数字签名
私钥公钥的逻辑
私钥和公钥可以视为加密解密算法的一个参数。
明文 + 密钥 + 加密算法 ——> 密文;
密文 + 密钥 + 解密算法 ——> 明文;
先介绍一个“对称加密”和“非对称加密”。
“对称加密”:
相当于两个人手里都有相通的钥匙。要线下交换钥匙,互联网上不适用。
“非对称加密”(公开密钥系统):
两把不同的钥匙,用其中一把上锁,只能用另一把开锁。(公钥、私钥)作为一个通信实体,其中公钥匙公开的,私钥只有发送方自己知道。下面我们用A 给 B 发信息来解释此过程。
A 给 B 发信息:
1、A 给 B 发出请求;A 用 B 公开在网上的公钥,加密好数据得到 Kb公(m),发送给 B。
2、B 收到 A 发出的 K公(m) 之后,用 B 的私钥解密得到 Kb私(Kb公(m))。
分析:
在此过程中第三方拿到 Kb公(m) 报文,也会由于缺少私钥而无法解密。但是,第三方可能胡乱修改报文内容,B拿到被修改的报文后,也无法判断是否报文被修改过。
那么如何让接收方确认信息来自发送方,如何确认内容没有被第三方修改过?
数字签名
如何让接收方 B 确认信息来自发送方A ?一个简单的方法就是将这个发送者独一无二的东西附加到这段报文中,如同现实生活中的 某个领导在某个文件上签名,难以伪造。
在通信中,用私钥对报文进行加密,得到一个密文,这种行为叫做文件的签名。Ka私(m) 。
如果将“签名”和原始数据一起发给接收方,发——> [ m,Ka私(m) ] ——>收。接收方用发送方公开在网上的 公钥 对 Ka私(m) 进行 解密 得到 Ka公( Ka私(m) )。
接收方看看,只要 Ka公( Ka私(m) ) == m ;
则 报文来自发送人,且保证了数据完整。(中间有没有被第三方窃取不知道,但是第三方没有对报文进行修改)。
用密码哈希函数节约算力
前文中,Ka私(m)、Ka公( Ka私(m) )对完整的报文内容加密、解密十分消耗算力。
哈希函数
H(m) = n
哈希函数的顺向计算容易,而由 n 逆变换算 m 很难。可以回顾我之前算法与数据结构学习散列表的内容。
我们用散列函数(又称哈希函数)来处理报文 m ,得到一个报文“摘要” H(m),
Ka公( Ka私( H(m) ) == H(m) ;
则 报文来自发送人,且保证了数据完整。
综上猜想
A ——> Kb公( [ m,Ka私(m) ] ) ——> B
https 协议 规划的就是以上 过程,但是第一步获取公钥其实是 客户端 向 服务器 发出第一个请求,通过URL访问服务器建立SSL连接。服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。