要理解SSL/TLS协议,需要一些密码学知识,这篇文章简要介绍密码学相关基础知识。
如图,发送者Alice向接收者Bob发送消息,如果将消息直接进行发送,那么很可能被一个心怀恶意的窃听者Eve窃听消息。这样Eve就知道了消息的内容。
为了不让别人看到消息内容,Alice决定对消息进行加密之后再发送出去。加密之前的消息称为明文,加密之后的消息称为密文。我们看到明文可以理解其含义,看到密文则看上去像是一堆乱码。
接收者Bob收到密文后需要先进行解密才能阅读消息 ,解密就是将密文恢复成明文的过程。
将消息加密后发送,窃听者Eve得到是密文,无法得知加密前的消息内容。
正常的接收者将密文还原为明文的过程叫做解密,但接收者以外的人试图进行还原明文则成为密码破译,简称破译。进行破译的人称为破译者,破译者不一定都是坏人,密码学研究者为了研究密码强度,也会需要对密码进行破译,研究者在这种情况下也是破译者。
对称密码 (symmetric cryptography)是指在加密和解密时使用同一密钥的方式。目前广泛使用 AES。
对称加密有一个问题就是密钥配送问题, 即发送方和接收方如何在一个不安全的信道上共享密码的问题。
非对称加密(也叫公钥密码 (public-key cryptography))则是指在加密和解密时使用不同密钥的方式。目前广泛使用 RSA和ECDH。(RSA、ElGamal、Rabin、DH、ECDH)
非对称加密的加密密钥和解密密钥不同,形成一对,具有强烈的数学关系。其中可以公开的一个一般称为公钥,可以给任何人,另一个则不能公开,称为私钥。私钥一定严格妥善保管。通过公钥加密的密文只能由私钥解密。因此接收者Bob可以将公钥发给发送者Alice,然后Alice用公钥加密消息,并发送。即使被窃听者窃取到公钥也没关系。因为用公钥加密的密文只能由对应的私钥解密,而私钥只有接收者Bob才有。因此非对称加密解决了密钥配送问题,但依然存在下面两个问题:
混合密码系统是将对称加密和非对称加密优势相结合的一种混合方式。可以解决对称加密密钥配送和非对称加密处理速度低的问题。主要流程如下
加密算法可以解决消息的机密性问题,但是无法保证消息的完整性。完整性指的是,数据是正确的,而不是伪造的。单向散列函数是保证信息的完整性的密码技术,它会检测数据是否被篡改。常用的散列函数有 md5 、 SHA-2(SHA-224、SHA-356、SHA-384、SHA-512) 和 具有全新结构的 SHA-3(Keccak 算法)等。
单向散列函数能保证消息的完整性的前提是散列值和消息是分开传输的。试想一下,如果窃听者能够同时获取消息和散列值,那么他就可以同时修改消息内容和散列值来进行篡改。接收者验证的时候不会发现消息被修改了,因为散列值对比检测是一致的。进一步说,这里接收者收到的消息和散列值其实不是由发送者发送的,而是经过窃听者修改过后的。
消息认证码(MAC)技术能提供一种认证机制,保证消息是来自于期望的发送者,同时也能保证消息的完整性。消息认证码的输入由任意长度的消息和一个事先由发送者和接收者共享的密钥组成,他可以输出固定长度的数据,这个数据称为MAC值。
任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似。但单向散列函数不需要共享密码。实际上,一种实现消息认证码的方式就是由单向散列函数加分组密码( 比如AES)完成(HMAC),这种实现可以简单的理解为一种与密码相关的单向散列函数。
要计算MAC值就必须拥有共享密钥,没有共享密钥的人就无法计算出MAC值,消息认证码正是基于这一点来完成认证的。试想,窃听者同时窃取了消息和MAC值,但是由于他没有共享密钥,所以无法同时篡改消息并计算正确的MAC值。
由上面的描述可以知道消息认证码同样存在密钥共享的问题,除此之外消息认证码还存在下面两个问题:
假设接收者Bob接收到Alice发送的消息后,想要向第三方验证者Victor证明这条消息的确是Alice发送的,使用消息认证码无法进行这样的证明。为什么呢? 首先Victor想要校验MAC,需要知道共享密钥,就算Bob相信Victor把共享密钥告诉了他,Victor能验证MAC值是正确的,也无法证明消息就是Alice发送的,因为还有可能是Bob发送的。
因为无法向第三方证明这条消息是Alice发送的,Alice就可以声称这条消息不是我发送的,是Bob伪造的。也就是发送方和接收方自己吵了起来。
在这种情况下,使用数字签名就可以防止否认。
消息认证码无法防止否认,其原因就在于发送者和接收者共享密钥,那么如果发送者和接收者不需要共享密钥,而是各自使用一个密钥呢?有没有很眼熟,对,很容易想到之前说过的非对称加密。但数字签名和非对称加密是不同的。看一下数字签名的基本流程和原理:
这就是数字签名技术,我们来理一下为什么数字签名可以向提三方提供证明以及防止否认。首先,验证用的公钥是可以发送给任何人的,所以任何人都可以进行验证。然后由于私钥只有发送者才有,因此只有发送者才能进行“签名“,发送者就没法否认说这个消息不是我发送的了。当然更严格的说,发送者还是可以说”我的密钥丢失了,被别人盗用了“。这个层面就上升到社会工程学层面了。我们将在证书和pki系统中描述这个问题。
上述的描述中是直接对消息内容进行了签名,实际上一般不会这么做,因为如果消息内容很大,签名和验证都会很耗时。所以实际上一般是先对消息计算散列值,然后对散列值进行签名。接收者验证时也先对消息进行散列,然后解密签名得到解密后的散列值,比较两个散列值,相同则验证成功。
注意数字签名和非对称加密的区别 ,其比较如下图
伪随机数生成器(Pseudo Random Number Generator,PRNG)是一种能够模拟产生随机数列的算法。伪随机数负责承担密钥生成的职责。它由密码和单向散列函数等技术构成,主要用于生成密钥、初始化向量和 nonce 等。
上面描述的六种密码技术发挥着重要作用:
我们做一下总结
参考:
《图解密码技术》