初入密码学,基础为主,简单的古典密码就不记录了。
加密与编码不同,编码意义在于将现实生活各种信息映射到字符中,而加密则是为了避免字符被不允许的人获取信息。
基础
英文术语
密码(cryptography)、加密(encrypt)、解密(decrypt)、明文(plaintext)、密文(ciphertext)、算法(algorithm)、密钥(key)、认证(authentication)、验证(verify)
异或
异或(exclusive or,XOR)基本原理是比特位相同为0,相异为1。存在特点:A xor B = C,C xor B = A,C xor A =B
加密与解密方式
加密时明文+密钥→密文,解密时密文+密钥→明文,加密与解密密钥是否相同分为对称密码和非对称密码(又称为公钥密码)。
压缩程序本质是找出数据出现的冗余的重复序列,替换成较短数据。
对称密码
对称密码加密与解密使用相同密钥。
一次性密码本
一次性密码本(one-time pad):将明文转为二进制位,与随机生成相同二进制位数的密钥进行异或(XOR)运算,解密相同。
很简单流程,但是由于异或时错一个比特位结果都有所不同导致很难得知哪个才是真正的明文。
DES
DES(Data Encryption Standard):分组密码,以64比特为一个单位加密得到64比特密文,密钥56位,每隔7位进行错误检查,是16轮的Feistel密码。
Feistel密码(Feistel cipher):加密一次称为一轮(round),每轮输入数据分为左右两个部分,右侧直接输出,轮函数对右侧数据与子密钥(每轮使用的随机密钥)计算得到的二进制序列与左侧进行XOR运算输出到左边,两者连接即为一轮,而由于右侧未加密,每两轮进行对调。
攻击:在可以任意选择明文和解密结果情况下,称为选择明文攻击(CPA)
- 差分分析:通过不断改变局部二进制位得到结果偏差。
- 线性分析:利用明文与密文XOR计算结果偏离1/2概率得到信息。
三重DES
三重DES(triple-DES):将DES重复3次,密钥长度为168,三次密钥不同。
AES
AES(Advanced Encryption Standard):2000.11.2选用的Rijndael,一般规格有128、192和256位。
输入分组为128bit,即为16字节,依次对16字节输入数据进行SubBytes处理(根据替换表S-Box替换),后经过ShiftRows处理(以4字节为单位一定规则向左偏移),再进行MixColumns处理(对一个4字节进行比特运算,矩阵运算),最后进行AddRoundKey处理(与轮密钥进行XOR)。
分组密码
密码有分组密码和流密码。
分组密码(block cipher):只能处理特点长度的一类算法,1每块为分组(block),一个分组二进制数为分组长度(block length)。如DES、AES
流密码(stream cipher):对数据流连续处理的密码算法,因此在处理时需要保持内部状态,如一次性密码本。
模式(mode):
-
ECB(Electronic CodeBook mode,电子密码本模式)
将明文分组加密后的结果直接作为密文分值。明文分组内容小于分组长度时,使用一些数据填充(padding),
分组过于独立、密文分组与明文分组一一对应很容易被操纵与破解。
-
CBC(Cipher Block Chaining mode,密码分组链接模式)
对第一个明文分组使用一个初始化向量(Initialization Vector)进行XOR运算,之后的明文分组与前一个密文分组进行XOR运算,再进行加密。
填充提示攻击(Padding Oracle Attack):反复发送一段密文,每次对填充数据内容改变,根据错误信息得到相关信息。
对初始化向量(IV)攻击:初始化向量如果可以知道,便可以逐步推算。因此必须使用不可预测的随机数。
-
CFB(Cipher FeedBack mode,密文反馈模式)
前一个密文分组送到密码算法输入端,加密后进行XOR,由于第一个百词斩之前数据,需要初始化向量(IV),和一次性密码本运算类似,但CFB的比特序列非随机,而是用密码算法生产的密钥流(key stream),相当于伪随机数生成器。
重放攻击(replay attack)
-
OFB(Output FeedBack mode,输出反馈模式)
与CFB类似,不同的是OFB是加密算法输出被反馈到加密算法输入。相当于自身不断加密形成密钥流。
-
CTR(CounTeR mode,计数器模式)
将逐次累加的计数器进行加密生成密钥流,与OFB区别在使用的是不断累加的计数器,计数器分为初始值(nonce)与序号两个部分,序号不断累加,形成比特序列。
在CTR基础上增加认证的为GCM模式。
公钥密码
解密密钥与加密密钥不同。
基础
公钥密码基础在于密钥配送问题的解决。密钥配送问题如下:
- 通过实现共享密钥
- 通过密钥分配中心(Key Distribution Center,KDC)解决
- 通过Diffie-Hellman解决
- 公钥密码解决
加密密钥或称为公钥(public key)、解密密钥或成为私钥(private key),私钥不能被其他人获得,而一对公钥和私钥称为密钥对(key pair)。
在通信过程中,A拥有私钥和公钥,把公钥发给B,B利用公钥对需要传输的明文加密,然后发给A,A用私钥进行解密,完成了密钥传输问题。
求余(mod):如 27 m o d 12 = 3 27 \space mod \space 12 = 3 27 mod 12=<