张三打算给李四写一封信,里面会提到一个天大的秘密。张三不想让第三我的知道那件事,可是这封信却必定要通过其余人才能送到李四手中。这时候张三和李四将面临三个问题:算法
如何保密信的内容?安全
如何保证李四收到的信中的内容没有被其余人修改过?加密
李四如何肯定信的内容是张三本人写的?数学
一些说明:想要传递给他人的有效内容这里称为信息;传递时的基本单元这里称为消息,消息中包含信息和一些用于传递的附加内容。效率
首先,咱们来讨论保密信息的问题。登录
可以直接从中获得信息的消息称为明文;须要通过计算才能从中获得信息的消息称为密文。从明文到密文的计算过程称为加密;反之,则称为解密。把明文计算成密文的方法称为加密算法。随机数
谍战片中常常出现的密码本就是一种经典的加密算法。在这类加密方案中,加密算法自己也是保密的。这类加密算法能够经过试探分析的方式破解。而现代加密方案则基于数学难题的难解性,加密算法自己已经不须要保密,配合保密的密钥实现加密。这样提升了加密算法的复用率。打包
若是加密和解密使用同一个密钥,则称为对称加密;若是加密和解密分别使用不一样的密钥,则称为非对称加密。非对称加密的好处是能够减小单方面密钥泄露形成的信息泄露风险,特别试用于一方接收多方发送的消息收发模型中。非对称加密算法的计算效率通常比对称加密算法的计算效率低。请求
讨论完加密算法自己的问题,接下来讨论密钥分发的问题。有两种可行的方案:一是在传递消息以前已经经过可靠的途径得到了密钥;二是在消息传递前期磋商出一个临时的密钥。密码
密钥磋商算法基于这样的思路:张三和李四各生成密钥的一个计算因子,而后交换各自计算因子通过密钥磋商算法计算得出的结果做为下一步生成密钥的计算成分,以后再分别用各自的计算因子和收到的计算成分通过算法生成出最终的密钥。由于双方没有直接交换计算因子,因此中间人没法获得完整的密钥。须要注意的是,若是在密钥磋商前没有进行身份验证,那么中间人能够假装本身分别跟双方磋商密钥。也就是说,密钥磋商只有在双方身份获得验证的前提下才有意义。密钥磋商通常用于采用对称加密算法的一次性密钥加密通讯,一般密钥磋商过程当中会生成三个随机数,两个计算因子,另外一个用于交换计算成分。
关于加密还有一点须要说明,没有哪种加密方案是永远彻底可靠的,同时信息具备时效性。这样,只要可以保证在信息的时效内可靠的方案,就是合适的加密方案。
值得说明的是,加密算法通常不会关注消息的内容,也不该该关注消息的内容,由于加密是把明文变成密文的过程。也就是说,每一段明文在相应的密文中都应该有一段对应,反过来也是。这样,在只拿到密文的时候,即便没有密钥也能够经过丢弃部分密文段或者插入随意生成的密文段达到修改消息内容的目的,这样就形成了解密后的消息内容混乱。
摘要算法帮助解决了这个问题。摘要算法能够保证内容和摘要值一一对应。这样,只要能拿到有效的摘要值便可验证消息的完整性,至关于纸质文件的骑缝章。
接下来又有了新的问题,如何传递摘要值?一种有效的方法是加密。张三将信息的摘要值的加密后的密文包含在消息中,一同发送给李四。李四在收到消息后,比较对摘要值密文解密获得的摘要值和对消息内容计算摘要获得的摘要值,若是相同则消息内容完整,不然说明消息内容不完整。
上面的操做在结合了下一节将讨论的身份验证以后被称为签名和验签。签名对内容完整性的保证基于下面的思路:摘要值和内容一一对应,故修改内容也要同时修改摘要值。而在没有密钥的前提下是没法生成有效的密文的。除非使用的算法有漏洞,不然能够认为消息的内容获得了完整性的保证。
在讨论了消息内容保密和完整性以后,咱们该来讨论一下确认身份的问题了。
李四如何判断对面的张三真的就是张三呢?一般李四凭借以前掌握的张三这我的的特征来验证张三的身份,好比相貌、行为习惯等。参考这样的模式,咱们也能够给张三制造一些不易被复制的特征。若是能在消息中体现这些特征,那么就能够用于验证身份,至关于签字画押。
在前面的讨论中发现加密算法具备不可经过明文和密文计算密钥的性质,那么这时密钥便可做为一种身份特征。
若是张三在发送的消息中既包含了内容的明文也包含了内容的密文,那么李四就能够用事先保存的张三的身份密钥解密密文或者加密明文来验证张三的身份。这种方式的一个问题是,若是明文内容比较固定,那么中间人就能够保存明文和密文的对应,用于伪造身份。因此更好的方式是李四发送随机明文,张三回复用本身身份密钥加密后的密文。
须要强调的是,身份密钥必须事先经过安全途径得到。若是在传递消息的过程当中分发身份密钥,则可能被中间人替换。这种中间人替换或伪造身份还有前面提到的修改消息内容的行为被称为中间人攻击。
若是张三李四使用对称加密用于鉴定身份,那么这个身份密钥就只能保存在他们两我的手中,双方均可以用此密钥做为对方身份的凭证。可是若是将此密钥分发给了第三我的,那么这时的身份将变得不明确。基于此,身份验证一般采用非对称方案。这样,张三只要保管好本身的身份私钥,而后将公钥分发给其余人,其余人就可使用这个密钥来验证张三的身份了。与加密相反,在一方发送多方接收的模型中,更应该采用非对称身份验证。在多客户端单服务端的模型中,对客户端的认证能够采用对称认证方案,相似使用帐户和密码登陆的状况;而对服务端的认证则采用非对称方案更合理。
到这里,还有一个问题没有解决,如何在没法肯定安全的渠道下使传递的身份公钥有效?一个可行的方案是借助第三方。也就是找一个可靠的人鉴定另外一我的是否是可靠。张三将身份公钥和鉴定人信息以及鉴定人对张三身份信息的签名打包在一块儿传递给李四,李四就能够经过验证鉴定人的签名进而验证张三的身份了。这种包含身份信息和认证机构信息以及认证签名信息的消息被称为证书,证书中还可能包含一些其余信息,好比用于通讯的加密公钥等,但不会也不该该包含保密信息。证书的有效性能够经过查询认证机构验证。一样,认证机构也须要证书,他们的证书由上级认证机构颁发。这样,只要可以保证顶级证书有效,就能够经过信任的向下传递验证全部的证书了。
假想一个场景:张三向李四发送一个包含随机数的消息,请求验证李四的身份。李四用本身的身份私钥对收到的随机数加密,并将加密后的密文和本身的证书发回给张三。张三首先验证李四证书的有效性,再用证书中的身份公钥解密李四发来的密文,并比对内容。接下来只要双方各生成一个计算因子,并交换各自计算因子对于以前那个随机数的计算结果,便可磋商出一个临时的密钥。这个密钥既用来对信息加密,也用来验证身份。在接下来的通讯中,发送消息前先对信息加密,再计算加密后信息的摘要值并对摘要值加密,能够看做是签名,最后将信息密文和摘要值密文做为消息发送;收到消息后,先验证摘要再解密出信息。对信息密文签名而不是对明文签名的好处是,若是消息被破坏,则能够减小一次解密操做。