密码学概述
密码学的原则
密码技术使得发送方可以伪装数据,使入侵者不能从截取到的数据中获得任何信息。 接收方必须能够从伪装的数据中恢复出初始数据,如图:
现在假设Alice 要向Bob发送一个报文,Alice报文的最初形式“ Bob, I love you. Alicen ”被称为明文。 Alice 使用加密算法加密其明文报文,生成的加密报文被称为密文,该密文对任何入侵者看起来是不可懂的。在许多现代密码系统中,包括因特网上所使用的那些,加密技术本身是已知的,即公开发行的、标准化的和任何人都可使用的,即使对潜在的入侵者也是如此。显然,如果任何人都知道数据编码的方法,则一定有一些秘密信息可以阻止入侵者解密被传输的数据。这些秘密信息就是密钥。 在图中,Alice提供了一个密钥位,它是一串数字或字符,作为加密算法的输入。加密算法以密钥和明文报文处为输入,生成的密文作为输出。用符号KA(m)表示明文报文加的密文形式。类似地,Bob将为解密算法提供密钥K—将密文和Bob的密钥作为输入,输出初始明文。也就是说,如果Bob接收到一个加密的报文K4(m),他可通过计算m进行解密。在对称密钥系统中,Alice和Bob的密钥是相同的并且是秘密的。在公钥系统中, 使用一对密钥:一个密钥为公开的,所有人都可以获取,另一个密钥只有Bob或Alice知道。
对称密钥系统
所谓对称密钥就是要求加密和解密使用同一个共享密钥,因此通信双方都需要妥善保管通信密钥。
对称密码体制分两种,即流密码和分组密码。
流密码
对明文的单个位(或字节)进行运算,明文加密后密文基本保持和明文同样长度。常用流密码算法有RC4、SEAL等。
- 同步流密码:发送方和接收方在传递信息时同步进行加解密操作,密文内容如果在传输过程中被篡改删除或者插入,会导致同步失效,解密失败。必须重新同步来实现解密,恢复密文。如果传输过程中一个加密位改变,则只影响该位的恢复,对后续密文不影响。但是,主动攻击者可以选择性的对密文字符进行改动,并准确知道这些改动对明文的影响。因此,同步流密码具有同步性,无错误传递性、主动攻击性三种特性,适用于为音频或视频数据提供版权保护。
- 自同步流密码:与同步流密码相比,是一种有记忆变换的密码。每一个密钥与已产生的固定数量的密文位有关,密钥由已生成的密文决定。在密文传输过程中如果一个密文位发生改变,该位的变化会影响到后续有限位(如n位)的密文正确解密。
分组密码
将明文信息划分成不同的组(或块),分别对每个组(或块)进行运算,多用于网络加密。分组长度越长,密码分析越困难,越不利于操作和运算,分组长度应权衡安全性与实用性。常用的DES、AES等。公钥系统
公钥加密系统是非对称加密机制,使用一对密钥(一个公钥和一个私钥)来保护加密数据。其中公钥对外界公开,大家都可以获取,而私钥不对外界公开。加密使用的密钥和解密使用的密钥是不相同的:公钥加密的信息,只有私钥才能解密;私钥加密的信息,只有公钥才能解密。公钥是通过私钥产生的且不能由公钥推出私钥。公钥验证系统中A,B双方进行通信需要两套公私钥,A给B发消息时候,用B的公钥进行加密,只有B能解开;同样的,B给A发消息时候,用A的公钥进行加密,只有A能解开。其中比较著名的公钥算法就是RSA算法。
但是,这其实存在一个隐患:有人正在伪装你发送信息。这时候,就需要由权威部门来介入,就是CA( Certificate Authority)来证明你是你,这个由权威部门颁发的称为证书。注意: 证书包含了公钥、证书的所有者、证书的发布机构和证书的有效期。证书请求的过程叫签名算法,只有用只掌握在权威机构手里的东西签名才能保证是真的权威机构签名,这就是 CA 的私钥。

在A、B互相有了对方的证书之后,进行用CA的公钥进行解密就可以知道对方的身份和公钥,然后就可以解密对方用私钥发来的数据。
注意: 也就是说,用私钥解密,公钥解密。
通信安全
数据在网络中通信的安全性主要可以从数据的机密性、报文完整性、身份认证进行考虑。
机密性
数据的机密性就是只要通信双方能够理解通信内容,即使数据被第三者窃取了,他也不能理解这段数据是什么意思,而数据的机密性就是通过加密算法来保证的。
一般来说,在网络中传输的报文都会加密处理,而加密算法通常是对称加密和非对称加密结合使用的。非对称加密通常使用RSA算法,但是改算法加密大量报文的时候耗时比较严重。因此,网络中一般不会直接使用RSA算法加密明文,而是会使用对称加密加密密文,但是对称加密的密钥由RSA算法加密,这样就可以确保对称加密的密钥只有通信双方可以解密获取。
注意: 实际应用过程中使用对称加密和非对称加密相结合的方式,既具备了对称加密的高效率,也具备了非对称加密的安全性。
报文完整性
报文完整性就是确保报文在传输过程中不被第三者窃取并恶意修改内容,即使报文被加密了,还是存在被修改的风险。
一般来说,报文是否有被恶意修改,会通过密码散列还是来鉴别。散列函数就是以m为输入,并计算得到一个称为散列的固定长度的字符串H(m),而且这个函数必须满足当x!=y时,H(x)!=H(y),这样就可以达到鉴别报文是否修修改的效果。如上图所示,整体流程如下:
- 首先,文件经过单向散列函数的处理得到一份占128位的摘要(这份摘要也被称为数字签名),这份摘要相当于该文件的”指纹”,能够唯一地识别文件。只要文件发生改动,经过单向散列函数处理后得到地摘要都会不一样,文件和文件的摘要具有很强的对应关系。
- 随后,用户A使用自己的私钥对这份128位地摘要进行加密,得到一份加密地摘要。
- 然后,用户A把文件、加密的摘要和公钥打包一起发给用户B,传输的过程中并没有对文件进行加密处理。
- 用户B将收到的文件经过单向散列函数处理得出一份128位摘要,这份摘要是通过收到的文件得到的,存在被更改的可能;使用A提供的公钥对收到的”加密的摘要”进行解密得到另一份128位摘要,这份摘要是通过原始文件得到的,一般认为代表真正的文件,然后将两份摘要进行比较。
- 如果两份摘要相等,说明文件经过用户A签名之后,在传输的过程中没有被更改;若不相等,说明文件在传输过程中被更改了,或者说已经不是原来的文件了,此时用户A的签名失效。
注意: 公钥和私钥都可以用于加解密操作,用公钥加密的数据只能由对应的私钥解密,反之亦然。虽说两者都可用于加密,但是不同场景使用不同的密钥来加密,规则如下:
- 私钥用于签名、公钥用于验签
签名和加密作用不同,签名并不是为了保密,而是为了保证这个签名是由特定的某个人签名的,而不是被其它人伪造的签名,所以私钥的私有性就适合用在签名用途上。 私钥签名后,只能由对应的公钥解密,公钥又是公开的(很多人可持有),所以这些人拿着公钥来解密,解密成功后就能判断出是持有私钥的人做的签名,验证了身份合法性。
- 公钥用于加密、私钥用于解密,这才能起到加密作用
因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。
身份认证
所谓身份认证就是确保通信双方确实是和自己通信的人,而不是别人恶意伪装的。上面提到公钥的概念,但是当B收到A发来的公钥,B并不确定这个公钥是否真的是A的公钥还是别人伪造的,也就是B对A不信任,同理,A对B也不信任。因此,这时候就需要一个权威机构来建立A和B之间的信任机制了,这个权威机构就是CA:
- 证书颁发机构,即认证中心CA,来将公钥与其对应的实体(人或机器)进行绑定(binding);即给公司或个人颁发证书。
- 认证中心一般由政府出资建立。每个实体都有CA 发来的证书(certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。有的大公司也提供认证中心服务。

- 首先,用户A向证书颁发机构提交个人信息,申请证书。通过CA审核后,CA生成用户A的证书,证书中包括了A的公钥和私钥还有CA的数字签名。证书颁发机构CA本身拥有一对密钥,这是对CA所颁发的证书进行数字签名和保密的基础,绝不能泄露。
- 用户A收到的证书中包括了带有CA数字签名的、专属A公钥和私钥,CA的数字签名确保了别人不能伪造用户A的公钥和私钥。
- 同时,用户B也必须信任给用户A颁发证书的第三方认证机构CA,即用户B拥有CA颁发的”CA公钥”。
- 通信时,用户A向用户B发送的数据包中的”加密的摘要”上有用户A的数字签名,A公钥上有认证机构CA的数字签名。用户B收到数据包之后,先要验证收到的A公钥是否来源合法:是认证机构颁发的带有CA签名的公钥吗?用户B并不信任用户A,但是用户B信任第三方认证机构CA。所以,用户B先使用证书颁发机构颁发的 “CA公钥” 验证收到的 “A公钥” 是否由同一认证机构颁发,是否在颁发之后更改过。
- 验证通过后,用户B便相信收到的 “A公钥” 确实来自真实的用户A。随后再使用 “A公钥” 对 “加密的摘要” 进行解密,进行上文提到的对比操作,以判断文件是否更改
注意: 当用户A遗失或泄露了CA颁发的证书后,为了避免他人使用该证书冒充用户A,用户A向认证机构CA “挂失” 该证书。于是认证机构CA把该证书放入该认证机构的证书吊销列表(CRL)中,并在网上公示。

