一、为什么需要加密
每个人都有自己的秘密,如果不加密,在网上传输很容易被监听。如果涉及到金钱相关,密码泄露以后很容易造成损失。所以都会利用加密 cryptography 技术,保证信息的机密性 confidentiality。
信息被加密以后变成了密文在网上传播,接收者拿到密文进行解密 cryptanalysis,解密以后就可以看到明文。
二、对称加密
对称密码 (symmetric cryptography)是指在加密和解密时使用同一密钥的方式。对应的加密方式是对称加密。目前广泛使用 AES。
对称密码有多种别名,公共密钥密码(common-key cryptography),传统密码(conventional cryptography),私钥密码(secret-key cryptography),共享密钥密码(shared-key cryptography)等。
对称密码需要解决将解密密钥配送给接收者的密钥配送问题。
三、非对称加密
公钥密码 (public-key cryptography)则是指在加密和解密时使用不同密钥的方式。对应的加密方式是非对称加密。目前广泛使用 RSA。(RSA、ElGamal、Rabin、DH、ECDH)
公钥密码解决了密钥配送的问题,但是存在通过中间人攻击被伪装的风险,因此需要对带有数字签名的公钥进行认证。
四、单向散列函数
网上很多免费的软件,为了防止软件被篡改,有安全意识的软件发布者会在发布软件的同时会发布这个版本软件的散列值 hash。散列值是用单向散列函数(one-way hash function)计算出来的数值。目前广泛使用 SHA-2(SHA-224、SHA-356、SHA-384、SHA-512) 和 具有全新结构的 SHA-3(Keccak 算法)
单向散列函数并不是为了保证消息的机密性,而是完整性(integrity)。完整性指的是,数据是正确的,而不是伪造的。单向散列函数是保证信息的完整性的密码技术,它会检测数据是否被篡改。
单向散列函数可以单独使用,也可以作为消息认证码、数字签名以及伪随机数生成器等技术的组成元素使用。
五、消息认证码
为了确认消息是否来自期望的通信对象,可以通过使用消息认证码(message authentication code)。消息认证码主要是提供了认证(authentication)机制,与此同时它也能保证消息的完整性。
消息认证码中最常用的单向散列函数是 HMAC。HMAC 的构成不依赖于某一种具体的单向散列函数算法。
消息认证码能对通信对象进行认证,但无法对第三方进行认证。它也无法防止否认。消息认证码可以用来实现认证加密。
六、数字签名
试想有这样一种情况,A 欠 B 100 万美刀,于是 A 向 B 打了一张欠条。一周以后,A 拿到钱以后就不承认那张欠条是自己写的,抵赖借钱了。
这个时候就牵扯到密码学里面的防抵赖的技术 —— 数字签名。数字签名类似现实世界中的签名和盖章,数字签名是一种能防止用户抵赖,伪装,篡改和否认的密码技术。目前广泛使用的数字签名算法包括 RSA、ElGamal、DSA、椭圆曲线 DSA(ECDSA)、爱德华兹曲线 DSA(EDDSA)等。
如果用户 B 能让 A 在打欠条的时候,签上自己的签名(数字签名),这样可以防止他日后抵赖。
公钥基础设施 PKI 中使用的证书,就是对公钥加上认证机构的数字签名所构成的。要验证公钥的数字签名,需要通过某种途径获取认证机构自身的合法公钥。
七、伪随机数生成器
伪随机数生成器(Pseudo Random Number Generator,PRNG)是一种能够模拟产生随机数列的算法。伪随机数负责承担密钥生成的职责。它由密码和单向散列函数等技术构成,主要用于生成密钥、初始化向量和 nonce 等。
八、密码技术的实质
密码学家的工具箱中的内容完整整理如下:
密码技术实质是压缩技术
- 对称加密和公钥密码是机密性的压缩
- 单向散列函数是完整性的压缩
- 消息认证码和数字签名是认证的压缩
- 伪随机数生成器是不可预测性的压缩
在消息认证码中,MAC 值就是认证符号,在数字签名中,签名就是认证符号。两者都是通过较短的认证符号来对较长的消息进行认证。
- 密钥是机密性的精华
- 散列值是完成性的精华
- 认证符号(MAC 值和签名)是认证的精华
- 种子是不可预测性的精华
压缩前 | 压缩后 | |||
---|---|---|---|---|
对称密码 | 明文 | ---> | 密钥 | 机密性的压缩 |
公钥密码 | 明文 | ---> | 密钥 | 机密性的压缩 |
单向单列函数 | 消息 | ---> | 散列值 | 完整性的压缩 |
消息认证码 | 消息 | ---> | 认证符号(MAC 值) | 认证的压缩 |
数字签名 | 消息 | ---> | 认证符号(签名) | 认证的压缩 |
伪随机数生成器 | 伪随机数列 | ---> | 种子 | 不可预测性的压缩 |