Table of Contents:

密码
环游密码世界
口令:password, passcode, pin
编码:encode
密码:cryptography
对称密码是指在加密和解密时使用同一密钥的方式。
公钥密码是指在加密和解密时使用不同密钥的方式,又称为非对称加密。
将对称密码和公钥密码结合起来的密码方式称为混合密码系统。
单项散列函数,用于保证完整性:“数据时正确的而不是伪造的”,没有被篡改过。
数字签名能够保证数据不会被篡改,也防止发送者的否认。
伪随机数生成器是一种能够模拟产生随机数列的算法,同时承担着密钥生成的重要职责。
img1
img1
隐写术隐藏的是消息本身,而密码隐藏的是内容,应用场景:数字水印。
密码与信息安全常识:
不要使用保密的密码算法
使用低强度的密码比不进行任何加密更危险
任何密码总有一天都会被破解
密码只是信息安全的一部分
历史上的密码
凯撒密码,通过平移字母顺序达到加密效果,平移字母个数为密钥。
简单替换密码,通过维护字母对照表达到加密效果。
密钥空间,所有可用密钥的总数就是密钥空间的大小,空间越大,暴力破解越困难。
频率分析破译:通过分析语言中高频使用字母及单词达到破译效果。
Enigma :通过增加通信密码的方式保证安全性。
问题:
通信密码连续输入2词并加密
通信密码是认为设定的
必须有每日密码本
对称密码
将显示世界中的东西映射为比特序列的操作称为编码。
XOR,异或,相同为0 ,不同为1。
比特序列的异或,将明文 A 用密钥 B 进行加密,得到密文 A XOR B,将密文 A XOR B 用密钥 B 进行解密,得到明文 A。
一次性密码本,又称为维纳没密码,通过生成随机比特序列与明文异或加密。
理论上无法破解的原因:无法判断暴力破解的结果是否是争取的明文。
无法使用的原因:
密钥的发送
密钥的保存,密钥长度与明文长度相等。
密钥的重用
密钥的同步
密钥的生成,需要真正的随机数
DES(Data Encryption Standard),可被短时间破译,不推荐使用。
DES 将64 比特的明文加密成64比特的密文,密钥长度是56比特,从规格上说,DES 的密钥长度是64 比特,但由于每隔7 比特会设置一个用于错误校验的比特,因此实质上密钥长度是56比特。
DES 以每 64 比特的明文为最小单位进行加密,属于分组密钥的一种。
DES 结构,又称为 Feistel 网络,在很多密码算法中都有应用。
加密步骤:
将输入的数据等分为左右两部分
将输入的右侧直接发送到输出的右侧
将输入的右侧发送到轮函数
轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列
将上一步得到的比特序列与左侧数据进行 XOR 运算,并将结果作为加密后的左侧
因为上述使用将右侧数据作为密钥的一部分,因此需要指定规则(如每两轮)对输入数据的左右进行数据对调
DES 加密时无论使用任何函数作为轮函数都可以正确解密,也就是说,轮函数无需考虑解密的问题,可以被设计的任意复杂。
三重 DES,为了增加 DES 的强度,将DES 重复3次所得到的一种密码算法。
加密过程为:加密,解密,加密,这么做的目的是为了能够让三重DES 兼容普通的 DES。
AES(Advanced Encryption Standard)取代DES。通过评选,最终选择 Rijndael。
Rijndael 分组成都为 128 比特,密钥长度可以以32比特为单位在128 比特到256 比特的范围内进行选择,在AES 规格中,密钥长度只有 128,192,256 比特三种。
AES 使用 SPN 结构。
加密过程:
SubBytes 处理,输入分组为 128 比特,16 字节,首先逐个字节的对16字节的输入数据进行SubBytes 处理,可以简单的理解为“简单替换密码” 中的 256 个字母的版本
ShiftRows 处理,将 SubBytes 的输出以字节为单位进行打乱处理,注意,打乱处理是有规律的
MixColumns 处理,对一个4字节的值进行比特运算,将其变为另一个4字节的值
AddRoundKey 处理,将 MixColumns 的输出与轮密钥进行XOR
重复上述4步,需要重复 10 - 14 轮计算。
相比 Feistel 网络,SPN 优势:
加密锁需要的轮数更少
所有处理均按照字节为单位进行,速度更快
劣势:
无法使用同一种结构实现加密和解密
分组密码的模式
分组密码是每次只能处理特定长度的一块数据的一类密码算法,一个分组的比特书就称为分组长度。
例如 DES 和三重 DES 的分组长度都是 64 比特,也就是会所一次只能加密64 比特的明文,并生成64 比特的密文。
当对一段很长的明文进行加密时,的呆的方法就称为分组密钥的模式。
主要模式有以下5种:
ECB 模式,电子密码本模式
CBC 模式,密码分组链接模式
CFB 模式,密文反馈模式
OFB 模式,输出反馈模式
CTR 模式,计数器模式
ECB 模式,将明文分组加密之后的结果直接称为密文分组,若分组内容小于分组长度时,则自动向上填充。
弱点:可以在步破译密文的情况下操纵明文。
CBC 模式,首先将明文分组与前一个密文分组进行 XOR 运算,然后再进行加密。
CFB 模式,前一个密文分组会被送回到密码算法的输入端,即初始化向量通过加密算法与明文分组进行异或运算,得到密文分组。
OFB 模式,密码算法的输出会反馈到密码算法的输入中,通过将明文分组和密码算法的输出进行异或运算来产生密文分组。
CTR 模式,通过将逐次累加的计数器进行加密来生成密钥流的流密码。每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流,也就是说,最终的密钥分组时通过将计数器加密得到的比特序列与明文分组进行异或运算得到的。
公钥密码
公钥密码是密码学历史上最伟大的发明,是数学史上最伟大的发现。
公钥密码解决的问题:密钥发送。
在公钥密码中,密钥氛围加密密钥和解密密钥两种,发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。
注意:
发送者只需要加密密钥
接收者值需要解密密钥
解密密钥步可以被窃听者窃取
加密密钥被窃听者获取也没问题
RSA 是一种公钥密码算法,被用于公钥密码和数字签名。
加密公式:对代表明文的数字的 E 次方球 mod N 的结果,结果就是密文。其中 E 和 N 是 RSA 加密的密钥,也就是E 和 N 的组合就是公钥。
解密公式:对代表密文的数字的 D 次方球 mod N 就可以得到明文,其中 N 与加密算法中的N 是相同的。
生成密钥对流程:
求 N
准备两个很大的质数,假设为 p 和 q,并将其相乘,结果为 N
求 L
L 是 p-1 和 q-1 的最小公倍数
求 E
E 是一个比 1 大,比 L 小的数,E 和 L 的最大公约数必须为 1
求 D
1 < D < L
E * D mod L = 1
混合密码系统
公钥密码劣势:
公钥密钥处理速度远远低于对称密码
公钥密码难以抵御中间人攻击
混合密码主要解决上述问题 1。有以下机制:
用对称密码加密消息
通过伪随机数生成器生成对称密码加密中使用的会话密钥
用公钥密码加密会话密钥
从混合密码系统外部赋予公钥密码加密时使用的密钥
img2
img2
img3
img3

单向散列函数

单向散列函数(one-way hash function),有一个输入和输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以用来检查消息的完整性。
特性:
* 根据任意长度的消息计算出固定长度的散列值
* 能够快速计算出散列值
* 消息不同散列值也不同
两个不同的消息产生一个散列值的情况称为碰撞(collision),难以发现碰撞的性质称为抗碰撞性
要找到和该条消息具有相同散列值的另一条消息是非常困难的,这一性质称为弱抗碰撞性
要找到散列值相同的两条不同的消息是非常困难的,这一性质称为强碰撞性
密码学中使用的单向散列函数,不仅要具备弱抗碰撞性,还要具备强抗碰撞性
* 具备单向性
实际应用:
* 检测软件是否被篡改
* 基于口令的加密
* 消息认证码
* 数字签名
* 伪随机数生成器
* 一次性口令
具体例子:
* MD4,MD5(不安全)
* SHA-1(碰撞攻击算法由山东大学王小云提出)
* SHA-2(一共六个版本 SHA-256,SHA-512等,主要区别是生成的位数不同,目前也安全)
* RIPEMD-160(RIPEMD的强碰撞性已经被攻破,RIPEMD-160还没有,比特币用的就是RIPEMD-160)
* SHA-3(安全)

Keccak

Keccak是一种被选定为SHA-3标准的单向散列函数
对单向散列函数的攻击:
* 暴力破解:对单向散列函数进行暴力破解时,每次改变一下消息值然后对这些消息求散列值,这相当于尝试破解单向散列函数的“弱抗碰撞性”的攻击。
* 生日攻击:生日攻击是找到散列值相同的两条消息,而散列值则可以是任意值,这相当于尝试破解单向散列函数的“强抗碰撞性”的攻击。
单向散列函数能够辨别出篡改,但是无法辨别出伪装。

消息认证码

消息的完整性(integrity):消息没有被篡改,也叫一致性
消息的认证(authentication):消息来自正确的发送者
消息认证码(message authentication code)是一种确认完整性并进行认证的技术,简称为MAC
消息认证码的输入是任意长度的消息和一个发送者与接收者之间的共享的密码,它可以输出固定长度的数据,这个数据称为MAC值
消息认证码是一种与密钥相关联的单向散列函数

消息认证码的多种实现方式

  1. A生成密钥对

  2. A对消息生成散列值

  3. A用私钥对散列值签名(加密)

  4. A向B发送消息和签名

  5. B生成A消息的散列值

  6. B用公钥解密签名并和散列值对比是否一样

    通过RSA实现数字签名

  1. 接收者生成密钥对

  2. 接收者在认证结构 Trent 注册自己的公钥

  3. 认证结构 Trent 用自己的私钥对 Bob 的公钥施加数字签名并生成证书

  4. 发送者得到带有认证机构 Trent 的数字签名的接收者的公钥(证书)

  5. 发送者使用认证机构 Trent 的公钥验证数字签名,确认接收者公钥的合法性

  6. 发送者使用接收者的公钥加密消息并发送到接收者

  7. 接收者使用自己的私钥解密密文得到发送者的消息

    公钥基础设施(PKI)

    公钥基础设施是为了能够更有效的运用公钥而指定的一系列规范和规格的总称,简称 PKI。
    组成要素: