2.1 加密解密基础

加密解密主要用于保证信息安全,加密是以某种特殊的算法改变原有的信息数据的过程,而解密则是将改变后的信息数据进行还原的过程。

加密算法可以分为单向加密和双向加密两大类,单向加密是不可逆的加密,只能加密无法解密。单向加密有以下特性,任意两段不同的明文加密之后的密文是不同的,而同一段明文经过加密之后的密文是相同的,不可逆,即理论上通过密文无法解密出原文。单向加密可以用于判断文件在传输过程中是否被窜改过,也可以用于记录一些隐蔽的信息。例如,用户的密码,可以通过MD5加密之后存储到数据库中,每次用户登录都只将用户提交的经过MD5加密的密文与数据库中的密文进行比较来判断,这样大大提高了安全性。常用的单向加密算法有MD5、SHA、HMAC等。

双向加密与单向加密相反,经过双向加密的密文可以被解密回明文,而双向加密又可以分为对称加密和非对称加密。对称加密指的是可以通过同一个密钥加密和解密,常见的对称加密算法有DES、3DES、AES等。而非对称加密指的是加密和解密用的是不同的密钥,常见的非对称加密算法有RSA。

2.1.1 公钥/私钥与非对称加密

理解非对称加密是理解数字签名与数字证书等一系列概念的关键,每一个技术的出现都是为了解决问题,非对称加密主要是为了解决以下几个问题。

❑ 如何确保收到的内容没有被窜改。

❑ 如何确保收到的内容确实是对方发的,而不是其他人伪造的。

如果使用普通的对称加密,是解决不了上面这两个问题的,因为如果希望朋友能够对我加密了的内容进行解密,就需要把密钥给朋友,但密钥在传输的过程中有可能泄露,一旦密钥被泄露,其他人就可以在我们的通信中拦截通信的内容,对其解密然后进行修改,然后重新加密再发送。

非对称加密很好地解决了上面这两个问题,首先非对称加密会生成两个密钥,称之为公钥和私钥,公钥是可以公开的,私钥掌握在自己的手上,当发送一个文件给朋友,可以用我的私钥加密,朋友需要用我的公钥解密,而当朋友要发送一个文件给我的时候,需要用我的公钥加密,然后我可以用我的私钥进行解密。这段话非常关键的点在于,私钥加密之后,只有公钥可以解开(私钥解不开);而公钥加密之后,则只有私钥可以解开(公钥解不开),如图2-1所示。

图2-1 非对称加密

因为我的私钥不需要经过任何传输,自己保管即可,泄露的风险非常低。而别人拿不到我的私钥,就无法冒充或修改我发送的内容,因为只有经过我的私钥加密之后,才能用我的公钥解开,否则用我的公钥是解不开的。如果有人想窜改朋友发给我的文件,因为没有我的私钥,解不开朋友发送的文件,所以也就无法窜改朋友发送给我的文件了。

2.1.2 信息摘要与数字签名

由于非对称加密算法的复杂度很高,效率比对称加密算法要大得多,所以对一个巨大的文件执行非对称加密的代价非常大,因此可以对文件先执行信息摘要,然后对文件的摘要进行非对称加密。信息摘要指的是将一个文件执行一次单向加密,输出一段固定简短的摘要内容,这段摘要内容相当于这个文件的指纹,对不同的文件执行信息摘要可以得出不同的摘要内容,而对同一个文件执行信息摘要得出的摘要内容是相同的。对文件的指纹进行加密要比对整个文件进行加密高效得多。而数字签名就是对摘要进行非对称加密的操作,把数字签名当作名词时可以理解为经过非对称加密后的摘要内容。

当我希望发送一个巨大的文件给朋友时,保证这个文件没有被篡改过,就可以对文件进行信息摘要和数字签名,然后把签名结果和文件一起发送给朋友,如图2-2所示。

图2-2 信息摘要与数字签名的生成

当朋友接收到文件和数字签名时,先用公钥对数字签名进行解密(这个过程也称之为验签),然后对文件执行一次信息摘要,对比摘要内容,如果签名中的摘要内容和文件执行信息摘要得出的摘要内容一致,说明这个文件没有被篡改过,如图2-3所示。

图2-3 验签

2.1.3 数字证书

为了让其他人能够方便地辨别使用公钥,可以将公钥以及公钥使用的算法、所有者、有效期等一系列属性进行打包,这样的一个数据结构称之为PKCS10数据包,在操作iOS开发者证书时会碰到.p10文件就是对应一个这样的数据结构。

不论是直接给出公钥还是给出PKCS10数据包,都存在一个隐患,就是公钥或PKCS10数据包在传输的过程中被替换修改,这样其他人就可以伪装成我们发送任何内容,那么如何保证你拿到的公钥确确实实就是我发给你的公钥呢?

数字证书就是用来解决这个问题的,首先需要有一个颁发证书的权威的第三方机构(CA数字证书认证中心),来帮我们认证这个PKCS10数据包,CA使用它的私钥来对我们的PKCS10数据包进行数字签名,这样就得到了一份经过CA认证的数字证书,数字证书一般遵循同一个格式标准(X509标准)。

在发送文件的时候,除了对文件进行签名之外,还需要附带我们的证书。接收到文件时可以使用CA的公钥对证书进行验签,确保这个证书是有效的,接下来再使用证书中的公钥对文件的数字签名进行验签。经过了双重验签之后,就可以保证文件的来源和内容没有经过窜改。