密码学起源
- 古典密码学
- 现代密码学
- 对称加密
- 非对称加密
- 数字签名
- 哈希
密码学起源:
在战争中需要传递信息,所以有了密码学。
隐写术:
在奴隶的头皮上刻字,用头发遮挡;在身上隐私部位刻字。
武侠小说中武功秘籍是空白的,沾水显出字。
古典密码学:
移位式加密:密码棒。
加密算法:缠绕木棒后书写
密钥:木棒的尺寸规格
替换式加密:
字母表、码表
加密:使用码表替换字母表中对应字母
解密:使用字母表中的字母替换码表中对应字母
现代密码学:
随着计算机的发展,数学算法多次计算。不止可以用于文字内容,还可以用于各种二进制数据。按照加解密使用的密钥是否相同,可分为对称加密和非对称加密。
对称加密:
使用密钥和加密算法对数据进行转换,得到的无意义数据即为密文,使用同一密钥和解密算法进行逆向转换,得到原数据。
加密算法:DES、AES。
DES 密钥位数只有 64 位,已经被弃用。主流 AES 128 位。
举个抽象的栗子:
// 原数据是111
// 加密算法是各项加法
// 解密算法是各项减法
// 密钥是4
111 加密: 1+4,1+4,1+4 = 555
对密文555 解密:5-4,5-4,5-4=111
非对称加密:
使用公钥对数据加密得到密文,使用私钥对数据解密得到原数据。
加密算法:RSA、DSA、椭圆曲线等
下图中的加密密钥就是公钥,发送给客户端,让客户端加密数据,解密密钥就是私钥,自己持有,用来解密客户端加密过的数据。
// 原数据是111
// 加密算法是各项加法
// 加密密钥是4
// 解密密钥是6,去除十进制进位后的十位。
111 加密: 1+4,1+4,1+4 = 555
对密文555 解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111
对称加密的优缺点:
算法简单,速度快,适合加密大数据。
缺点:在不安全的网络中,密钥传输过程容易被截获。
举个栗子:
网络通信是不安全的,小明对小红发消息,使用对称加密,小明把密钥发给小红的过程中,被法外狂徒张三拦截到了公钥,小明对小红说我家密码是 123456,加密后的密文是aoeqpe,张三拦截后使用公钥解密,知道了小明家的密码,小明没有等到小红,等到了张三。。。
上面可能有疑问,张三也不知道算法,怎么能破解,其实算法最简单最暴力的破解方法就是穷举法,一个一个试,在计算机发达的时代,简单算法容易被破解。
非对称加密的优缺点:
缺点:速度较慢
优点:安全
上图中,张三拦截到了小明发给小红的公钥,小明给小红发信息我爱你加密后是asbd,张三拦截到,并没有解密密钥,所以不能破解。
上面的例子是单向通信的,要实现双向通信,小明也需要一对密钥,私钥自己保存,公钥发布给小红。这样小红使用小明的公钥也能安全的给小明发信息了。
非对称一定安全吗?
上图中,张三拦截到小明的消息并不能解密,但是他用公钥加密了分手吧发给小红,小红收到后伤心欲绝跳楼了。这就是伪造攻击。
数字签名:
为了防止伪造,就需要在数据上附带数字签名,保证数据来源的合法性。
公钥能不能解密私钥加密的数据?
还记得上面非对称加密的例子吗:
// 原数据是111
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据111 公钥加密: 1+4,1+4,1+4 = 555
密文555 私钥解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111
现在我们使用数字签名的方法重写上面的例子,把加密后的密文当做原数据:
// 原数据是111
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据111 公钥加密: 1+4,1+4,1+4 = 555
密文555 私钥解密:5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111
// 数字签名
// 原数据是555
// 加密算法是各项加法
// 公钥是4
// 私钥是6,去除十进制进位后的十位。
原数据555 私钥加密: 5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,5+6=11抹去溢出的十位1=1,结果是111
对密文111 公钥解密:1+4,1+4,1+4 = 555
公钥可以解密私钥加密的数据。
通常我们使用公钥加密,用私钥解密。而在数字签名中,我们使用私钥加密(相当于生成签名),公钥解密(相当于验证签名)。
我们可以直接对消息进行签名(即使用私钥加密,此时加密的目的是为了签名,而不是保密),验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功,证明是对方发来的消息。但通常我们会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得签名(非对称加密)的效率大大提高。注意,计算消息的散列值不是数字签名的必要步骤。
在实际使用中,我们既想加密消息,又想签名,所以要对加密和签名组合使用,比如TLS就组合了加密和签名。
数字签名的使用:
上图的用法是有漏洞的,如果另一个人拦截了发送方的公钥,就能通过数字签名解密出原数据,数据就被窃听了,并且因为通信中含有2份数据,数据包增大。所以在实际操作中会使用 hash 算法,对原数据摘要进行签名,接收方对解密的数据也进行 hash,把摘要信息和解密的签名数据对比,确定是对方发送的原数据。
现在,通过 hash,数据量很小,并且可以验证数据来源,但是还有一种攻击,就是重放攻击,需要进一步设计才能抵挡。
举个栗子:
小明给银行发送存一千块钱的请求。张三拦截到原数据,张三并不能解开,但是可以一直给银行发。本来小明存一千块,结果银行收到10次,小明存了一万块。这就是重放攻击。为了防止这种攻击,我们要在数据里利用时间戳、唯一序号等计算出一个请求签名。这样就避免重复消息。