密码学
发送者,接收者和窃听者
一条消息从 a 的计算机发送到 b 的计算机,中间经过很多台计算机和通信设备进行中转,这个过程中存在被恶意窃听者偷看到的可能
a 不想别人看到消息内容,于是将消息进行加密在发送出去,加密前的消息称为明文,加密后的消息称为密文,密文的内容是无法理解的。b 接收到了 a 的加密消息,b 需要进行解密才能阅读。这样即使窃听者知道了内容也是无法理解的密文,内容安全得到了保证
在上述场景中,a 将消息进行加密,b 进行解密,通过运用密码技术,保证了机密性
如果窃听者想要破解密文,必须采取某种手段将密文还原成明文,这种行为被称为密码破译或密码分析
密码算法
从明文生成密文的步骤,就是加密的步骤,称为加密算法,解密步骤称为解密算法,加密和解密的算法合在一起统称密码算法
密码算法需要密钥(key),就像现实世界中的钥匙一样,密码算法中的密钥则是一串数字或字母,无论加密还是解密都需要密钥,但是必须保管好密钥,否则再坚固的算法都没有用
对称密码和公钥密码
根据密钥的使用方法,密码可以分为两种:
- 对称密码 - 加密和解密使用同一种密钥
- 公钥密码 - 加密和解密使用不同密钥,也被称为非对称密码
现代计算机和互联网安全非常依赖公钥密码
对称密码和公钥密码可以结合起来使用,被称为混合密码系统
其他密码技术
密码不仅仅保证机密性,还用于检验内容的完整性,以及认证等
下载的软件是否和作者的东西一模一样,为了避免有人在软件中植入了恶意程序,有安全意识的作者在发布软件的同时会发布该软件的散列值,下载该软件的人可以自行计算所下载的散列值和作者发布的散列值进行对比,如果一致,则说明文件是相同的,否则就说明经过篡改,在这个过程中通过单向散列函数计算出的散列值保证了完整性
散列值
又被称为哈希值,密码校验和,指纹,消息摘要
为了确认消息是否来自所期望的对象,可以使用消息认证码技术,这种技术不仅能确认消息是否被篡改,还能确认消息是否来自期望的对象。不仅能够保证完整性,还能提供认证功能
消息如果被篡改,或者事后被否认,这种被伪装的情况可以使用数字签名来防止,就是将现实中的签名和盖章移植到数字世界的技术,发送方可以对消息进行签名再发送,接收方可以对该消息进行验证,这样就能防止伪装和篡改,还能防止事后否认。因此数字签名是一种保证完整性,提供认证并防止否认的密码技术
伪随机数生成器技术通常用来模拟产生随机数列的算法,随机数承担着密钥生成的重要职责
隐写术和数字水印
隐写术的目的是隐藏消息本身,但如果搞懂了嵌入消息的方法,就能搞清楚消息的内容,因此隐写术不能代替密码,但密码和隐写术通常结合使用,密码隐藏内容,隐写术隐藏消息本身
密码常识
- 不要使用保密的密码算法 - 因为密码算法一旦公开就会容易破解,反而公开的密码算法没有设想过保密,因此强度依然很高
- 使用低强度的密码比不进行任何加密更危险
- 任何密码总有一天会被破解 - 只是时间问题
历史上的密码
这些密码已经不再似乎用,但是给破译密码和密钥算法等方面提供了思路
凯撒密码是最简单的密码,将明文中使用的字母按照一定的字数”平移“来进行加密,将字母表中的字母平移就是凯撒密码的算法,平移字母的数量相当于密钥
如果凯撒密码只有 26 个字母,破译着会尝试使用 26 种密钥来进行破解,这种将所有密钥尝试一遍的方法称为暴力破解,由于是穷举出所有的密钥又叫做穷举搜索
简单替换密码
简单替换密码是依次将每个字母按照替换表换成另一个字母,解密的时候按照替换表反向替换就行了,因此发送者和接收者都必须拥有该替换表,它比简单的使用凯撒密码要更难破译,因为密钥数量要多太多了
一种密码能够使用的“所有密钥的集合”称为密钥空间,总数越多越难通过暴力破解,比如在简单替换密码中,a 可以对应 26 个字母中的任意一个,b 可以对应除了 a 对应以外的 25 个字母任意一个,因此简单替换密码的密钥总数为:262524..*1=40329146112660563558400000,这太难了,不知道通过暴力破解要到猴年马月去
虽然暴力破解很难破译简单替换密码,但使用频率分析法,就能够破译简单替换密码,这是因为什么呢?因为频率分析利用了明文中的字母出现的频率与密文字母出现频率一致的特性,这就为破译提供了线索:
- 高频字母和低频字母
- 搞清开头和结尾能够成为线索,高清单词之间的间隔也能称为线索
- 密文越长越容易破译
- 同一个字母连续出现也能成为线索
- 最后的破译速度会越来越快
编码和解码
计算机的世界中,它只能懂得0和1(即二进制),但是,我们交流的时候是通过字符进行交流,所以,如果想要计算机了解我们想表达的东西,以及我们想了解计算机想表达的东西,就需要在字符和0与1之间进行转换,也就是: 编码和解码
就编码和解码而言,针对的是我们(即在计算机中闯荡的人),这样就不会混淆这两个概念。
编码: 将字符按照对应的编码类型转换成计算机能够识别的0或者1(类似于生活中的:将中文翻译成英文的翻译官)
解码: 将0和1根据对应的解码类型转换成我们能够读懂的字符(类似于生活中的: 将英文翻译成中文的翻译官)
编码: 在屏幕输入文字 -> 根据指定编码类型 -> 将输入的文字编码成计算机能够识别的二进制数 -> 计算机存储编辑成的二进制数值
解码: 计算机读取存储的二进制数值 -> 根据指定的解码类型解码 -> 将二进制数值解码成字符集中表达的字符 -> 在屏幕显示
乱码出现的原因
编码过程和解码过程使用的编码方式不一致