通用密码学原理和应用实战KE
链接: pan.baidu.com/s/1_76lIW6L… 提取码: 6zf2
作者-\/ 307570512
初入密码学,基础为主,简单的古典密码就不记录了。
加密与编码不同,编码意义在于将现实生活各种信息映射到字符中,而加密则是为了避免字符被不允许的人获取信息。
基础
英文术语
密码(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 = 327 mod 12=3称之为27与3以12为模同余,加减乘除都类似,而对数称为离散对数,如7 5 m o d 12 7^{5} \space mod \space 1275 mod 12。
RSA
开发者Rond Rivest 、Adi Shamir、Leonard Adleman(Rivest-Shamir-Adleman)的缩写,应用于公钥签名和数字签名。
加密方式:密 文 = 明 文 E m o d N 密文 = 明文^{E} \space mod \space N密文=明文E mod N,E(Encryption)、N(Number)组合为公钥,写法为公钥是(E,N)或公钥是{E,N}。
解密方式:明 文 = 密 文 D m o d N 明文 = 密文^{D} \space mod \space N明文=密文D mod N,和公钥类似,D、N为私钥。
E、D和N是生成密钥对。
生成步骤
- 求N:准备两个很大的质数p、q,N = p × q N=p\times qN=p×q。
- 求L:L为p-1和q-1的最小公倍数(least common multiple, lcm),L = l c m ( p − 1 , q − 1 ) L=lcm(p-1,q-1)L=lcm(p−1,q−1)
- 求E:E是一个比1大、比L小的数,E和L最小公约数(greatest common divisor, gcd)为1(即E与互质),即1 < E < L , g c d ( E , L ) = 1 1<E<L,gcd(E,L)=11<E<L,gcd(E,L)=1求最大公约数可用欧几里得的辗转相除法。
- 求D:D满足1 < D < L , E × D m o d L = 1 1<D<L,E \times D\space mod \space L=11<D<L,E×D mod L=1,
例如p=17、q=19,可得到N=323、L=144、E=5、D=29,可得到公钥(E,N)=(5,323)和密钥(D,N)=(29,323),加密时,如明文为123,密文即为12 3 5 m o d 323 = 225 123^{5} \space mod\space 323=2251235 mod 323=225,解密为22 5 29 m o d 323 = 123 225^{29}\space mod \space 323=12322529 mod 323=123。
攻击**
- 暴力破解:取决于长度
- 通过E、N求D:通过大数分解N拿到p、q,就能拿到D。
- 中间人攻击(man-in-the-middle attack):虽然不能拿到密钥,但是可以利用公钥伪造信息。
- 选择密文攻击(Chosen Ciphertext Attack):能通过各种手段让解密程序解密,没有密钥,但可以获得相关信息,从而趋近于解密。可以通过认证即最优非对称加密填充(Optiomal Asymmetric Encryption Padding,RSA-OAEP)防范。
其他公钥
- ElGamal:利用
mod N下求离散对数的困难度,特征是经过加密的密文长度变为明文的两倍。 - Rabin:利用
mod N下求平方根的困难度。 - 椭圆曲线密码(Elliptic Curve Cryptography, ECC):需要的密钥比RSA短,
混合密码系统
混合密码系统(hybrid cryptosystem)将对称密码和公钥密码结合的方法,对称密码对消息加密,伪随机数生成器生成对称密码的密钥,然后用公钥密码对加密消息的密钥进行加密。如网络通信的SSL/TLS都运用了混合密码系统。
常用解密方法
RSA
yafu应该与机器有关,确实不如上面那个网站快。
使用注意
RSATool2:右上角Number Base为下方输入的P、Q、R等进制类型,Public Exponent(E)注意HEX,输入为16进制,非十进制。
openssl:遇到公钥,可以使用命令得到N、E
openssl rsa -in public.key -pubin -noout -text -modulus