应用密码学总结
前言
数据加密在当今信息传输中发挥着举足轻重的作用,而数据加密的基础是密码学的各类知识,加密的方法也是层出不穷,思维足够活跃,总有各种神奇的加密方法。鉴于此,对应用密码学做个总结笔记。
提示:以下是本篇文章正文内容,下面案例可供参考
一、概述
1,信息安全问题的三点根源:
(1)协议和业务的不安全,Internet设计的缺陷,如DDos无法根治。
(2)网络的开放性,连接基于信任原则,如RDP,SSH的远程爆破。
(3)人为因素,如PHP设置不当,全部东西仅用一个密码,泄露=全网裸奔。
2,密码学进行信息加密的三大特性:
(1)机密性:加密后的数据别人看不懂
(2)完整性:收数据方能确认数据是否被增删改,方法有类似根据Hash加密,将收到的数据与发送方给予的源文件Hash值比较,相同则没有。
(3)非否认性:即数据签名效果,发送方送数据后无法抵赖数据不是它发的,如只有两方进行数据传输的RSA加密,收方即解密方仅能解密发送方送的加密数据。
3,安全机制:
(1)加密:即机密性。
(2)数字签名:为数据来源真实性提供服务。
(3)访问控制:即用户的权限,如MySQL中使用grant语句限制个别用户访问的资源。
(4)数据完整性:确认不可被篡改,伪造,即使会也能被发现。
(5)认证交换:最简单的口令认证,短信认证,确保用户的身份。
(6)流量填充:持续传递一些随机数据,挫败信息流分析。
(7)路由控制:只使用安全网络中的信息传输通道,防止数据包被截取。
(8)公证:即第三方,防止否认。
如fidder证书的某些信息:![](https://img-
blog.csdnimg.cn/1e35434fbd78446e9375713fa116a714.png)
4,安全服务:
机密性,完整性,鉴别,非否认性,访问控制,可用性,与上面其实一样,有些换了个词罢了。
5,攻击的主要形式和分类:
(1)截取,通过传输通道截获数据库,对数据包分析,得出明文内容,如使用cain的局域网抓包
(2)中断:阻碍通信设备的正常使用,阻断信息的传输路径,放大攻击使服务器崩溃等。
(3)篡改:以截取为基础后更改报文流,如改变IP地址的目的地址,使包发向其它地方。
(4)伪造:伪造成某用户登录,操作,如通过跨站请求伪造CSRF盗用身份进行登录,服务端请求伪造SSRF进行内网探测,敏感信息泄露等。
(5)重放:把以前窃听的数据重新发送,达到欺骗效果。易受时间戳的限制。
(6)否认:发送方事后否认发送行为,所以要公证和非否认性
分类:
被动攻击:不对信息进行篡改,只偷听,难以发现,如nmap -sN的被动探测
主动攻击:会影响系统的政策工作,易被检测。
二、密码学基础
1,五种密码分析:
(1)唯密文攻击:即只知道密文的情况下,猜测明文和密钥,撞库穷举攻击,根据大量密文统计某些属性进行分析等。
(2)已知明文攻击:主要是发送方疏漏造成的,攻击者已知道以前的一对明密文和密钥,发送方使用同一套密钥继续发送信息,被攻击者通过以前获取的加密系统分析现在的密文。可能性低
(3)选择明文攻击:攻击者可以自定义明文并获取到对应的密文,进行分析破解。如RSA加密器能够输入明文,输出密文,通过明文和密文分析大素数p与q
(4)选择密文攻击:攻击者可自定义密文并获取到明文。可能性极低
(5)选择文本攻击:攻击者可以制造任意明文/密文获取对应的密文/明文。可能性究极低。
2,加密的分类:
(1)代替:单表的凯撒,多表维吉尼亚,希尔,普莱费尔。猪圈加密,八卦阵加密等
(2)换位:简单的纵行换位,横行换位等
(3)单密钥密码(对称加密):DES,AES,IDEA等
(4)双密钥密码(非对称加密):RSA,EC,等
(5)分组密码(对称加密):AES,DES等
(6)序列密码(对称加密):RC4等
对称密码的优点: 只用一个密钥,加密解密速度快,计算量小,适用于大量数据加密
对称密码的缺点:通信过程中密钥保密难度大,难以进行数字签名。
非对称密码的优点:安全性高,能达到数字签名的效果
非对称密码的缺点:加密解密的速度慢,适用于短数据的加密,如RSA速度对比同级别对称密码要慢上一千倍左右。
三、各种加密方法的分析:
1,代替密码:
(1)单表代替密码(凯撒):
算法如下:
def caesar(plaintext):
str_list = list(plaintext)
i = 0
while i < len(plaintext):
if not str_list[i].isalpha(): # 检测是否只有字符组成
str_list[i] = str_list[i]
else:
a = "A" if str_list[i].isupper() else "a" # 如果str_list[i]是大写字符就是A,否则就是a
str_list[i] = chr((ord(str_list[i]) - ord(a) + 5) % 26 + ord(a) or 5) # 进行ROT5的代替加密
i = i + 1
return ''.join(str_list)
print(caesar('Abcde'))
输出:Fghij
简单来说,就是根据字母表进行移位,ROT5即向后移5位,还能设置一个密钥,去掉字母表中重复的字母,再去掉重复的字母表a-z排序到密钥后方。
(2)放射加密:
过程:1,选定字母k1和k2为密钥(k1,k2),一般k1需要与26互素(关键),k2需0 <=k2<26
2,求出k1mod(26)的逆元k3,确定k4=k3*k2mod26
3,选取明文m,加密算法为c=(k1*m+k2)mod26
4,解密的密文c=(k3*c-k4)mod26
如例3-4算法:
**
import gmpy2
from Crypto.Util.number import inverse
from gmpy2 import gcd
letters = {
'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7,
'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,
'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20,
'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}
def fang_she(plaintext, k1, k2):
return (k1 * plaintext + k2) % 26
def de_fangshe(c, k3, k4):
return (k3 * c - k4) % 26
if __name__ == '__main__':
k1 = int(input("输入k1,要求k1与26互素:\n"))
if gcd(k1, 26) != 1:
k1 = int(input("输入k1不符合,请重新输入k1,要求k1与26互素"))
k2 = int(input("输入k2,要求k2大于0少于26:\n"))
k3 = inverse(k1, 26) # 求逆元
k4 = (k2 * k3) % 26
plaintext = input("请输入明文信息:\n")
c = ''
for i in plaintext:
plaintext = letters[i]
k = fang_she(plaintext, k1, k2)
for key, value in letters.items():
if value == k:
c += key
print("仿射加密的密文为:", c)
m = ''
for i in c:
crypto_text = letters[i]
k = de_fangshe(crypto_text, k3, k4)
for key, value in letters.items():
if value == k:
m += key
print(m)
输入:7,3,china 输出rahqd china
(3)多表代替密码(playfair)即矩阵加密:
过程如下:
1,填充矩阵,将密钥从左到右,从上到下填入5x5矩阵,去掉重复字母,I/J为同一字母,填充不满则按字母表顺序依次填入没有的字母。
2,将明文分成两个一组p,k加密,加密方法如下:
(1)若p,k在同一行,则密文cp,ck为仅靠右端字母,第一列靠最后一列右端。
(2)若p,k在同一列,则cp,ck仅靠下方字母,第一行为最后一行下方。
(4)若p,k不在一行也不在一列,则cp,ck为p,k组成矩阵的两脚字母,cp与p同行,ck与k同行。
(5)若p与q相等,则插入一个事先约定的字母
(4)多表代替密码(维吉尼亚):
**
![](https://img-
blog.csdnimg.cn/img_convert/b834f6b355b3264e49792d5f3a2d3f14.png)
过程:
明文字母为行,密钥字母为列,循环使用,分别对应密文即可
算法如下:
import string
letters = string.ascii_letters
def encode_vigenere(plaintext, key):
encode = ''
j = 0
for i, value in enumerate(plaintext):
if value.isalpha(): # 是否为英文字母
n = 0
print(letters.find(key[(i - j) % len(key)]))
n = (letters.find(value) + letters.find(key[(i - j) % len(key)])) % 26 # 循环使用密钥
if value.isupper():
n += 26
encode += letters[n]
else:
encode += value
j += 1
return encode
def decode_vigenere(cipertext, key):
decode = ''
j = 0
for i, value in enumerate(cipertext):
if value.isalpha():
n = 0
n = (letters.find(value) - letters.find(key[(i - j) % len(key)])) % 26
if value.isupper():
n += 26
decode += letters[n]
else:
decode += value
j += 1
return decode
if __name__ == "__main__":
plaintext = input("输入加密的明文")
key = input("输入密钥")
cipertext = encode_vigenere(plaintext, key)
print(cipertext)
print(decode_vigenere(cipertext, key))
输入:China 输出:Mlgxe China
(4)多表代替密码(Hill密码):
过程:
1,确定加密的密钥矩阵,将明文转换为字母表对应的数字**
2,将明文转换成的数字与矩阵相乘并模26再转换为对应的字母
3,解密则求出对应的逆矩阵,再把密文乘以逆矩阵即可
(5)猪圈密码(代替密码):
即每个字母对应的边缘线,逐个代替,如ABCDE加密后为,![](https://img-
blog.csdnimg.cn/0bb1d59752de4b3c8796a7b27f001bc5.png)
(5)八卦阵加密(代替密码):
分开的横线用0,没有分开的用1,转换为二进制进行加密解密。
"震": "001", "离": "101", "兑": "011", "乾": "111", "坤": "000", "艮": "100", "坎":
"010", "巽": "110"
三、对称密码
1,分组密码:
原理:基于扩散和混乱构成,扩散指重新排列消息的比特位,使明文一位能影响密文的多个或全部位的改变,混乱指密文和密钥的统计特性尽可能复杂化,隐藏密钥和密文的关系。
S盒和P盒变换:S盒分为可逆与不可逆两种,可逆S盒输入和输出位数相同,都用于代替,将二进制位与盒子内对应的位进行替换。
P盒分为普通型,压缩型,扩展型。普通型即几位即与几位交换位置,如1,2,3,4等4个二进制位交换成2,3,4,1。压缩型输入比输出位数多,输入的某些二进制位不进行交换。扩展型则输出比输入的位高,某些输入二进制位同时与多位输出进行了交换。其中扩展型与压缩性是不可逆的,不可逆是指解密时没有条件表明输出位是由那个输入位映射。
2,Feistel密码结构(DES密码基础):
Feistel密码指同时使用了可逆和不可逆的基本变换部件构成的算法,非Feistel密码指只使用了可逆的基本变换部件。
Feistel的参数和特征:分组长度取64倍数位,越长安全性越高,一般迭代16轮,每轮迭代的轮函数相同,但是子密钥不同。
Feistel密码结构的逻辑关系:
** =![\small
Rk](https://latex.csdn.net/eq?%5Csmall%20Rk)(k=i-1,i=1,2,3,...n)**
**![\small
Ri=LkxorF(Rk,Ki)](https://latex.csdn.net/eq?%5Csmall%20Ri%3DLkxorF%28Rk%2CKi%29)
(k=i-1,i=1,2,3..n)**
过程如下(16轮为例):
**1,输入长为2w位的明文和十六轮的
,将明文对半分成w位的L0和R0。**
2,将R0和K1作为轮函数F的参数运算出结果R,R与L0进行异或加密结果为R1
3,再进行第二轮加密,此时L1为R0的值,R1为第一轮异或输出的结果,采用第二轮的密钥K2进行轮函数加密,再异或,输出R2,L2为R1的值。
4,以此循环十六轮。
解密过程如下:
1,将2w的密文分为两部分,R16与L16,将L16与密钥K16作为轮函数F的参数进行运算输出的结果再与R16进行异或,输出为L15,R15的值为L16。
2,以此回推,循环。
分组密码设计准则:S盒设计准则(非线性度,差分均匀性,完全性,扩散特性,可逆性),P盒设计准则(混淆性),轮函数F设计准则(实现非线性,速度,灵活性,安全性),迭代轮数(越多越安全),子密钥的生成方法(简单性,速度,两密钥不存在简单关系,不存在弱密)。
3,分组密码工作模式:
1,电子密码本(ECB)特征:
(1)明文分组为64位,最后不足则进行填充,每组加密密钥相同。
(2)不具备错误传播特性,适用于内容较短的加密,不同分组可以并行处理。
2,密码分组链接(CBC)特征:
过程:
(1)存在初始向量IV与第一个明文分组P1异或后用密钥加密生成一组密文分组C1
(2)密文分组C1与明文分组P2异或后用密钥加密生成C2以此类推。
特点:
(1)存在初始向量IV,每组加密密钥相同。
(2)不同分组不能并行处理
**(3)密文分组的一位出错具有自恢复能力。因为解密时,上一个密文分组仅仅用作下一次密文分组的解密,所以![\small
Cj](https://latex.csdn.net/eq?%5Csmall%20Cj) 仅仅影响![\small
P(j+1)](https://latex.csdn.net/eq?%5Csmall%20P%28j+1%29)的解密,其后的不再影响。**
3,计数器模式(CTR)特征:
过程:
(1)计数器CTR与密钥进行加密后再与明文分组P1异或得到密文分组C1
(2)随后计数器递增,CTR+1与密钥加密再与P2异或得到密文分组C2
(3)以此类推
特点:
(1)计数器长度与明文分组长度相同
(2)只需要一个加密函数,无需解密函数即可解密,使用同一密钥。
(3)不具有错误传导特性,适用于速度要求高和实时性的场合。
4,输出反馈模式(OFB)特征:
过程:
1,系统初始化向量IV,与加密函数加密后得到结果与明文分组P1进行异或得到密文分组C1。
2,第一次加密函数得到的结果作为第二次加密函数的输入,第二次加密函数的结果与明文分组P2进行异或得到密文分组C2,
3,以此类推
特点:
1,每次加密需要使用初始化向量IV
2,没有错误传导特性,密文一位传输错误仅影响响应明文位
3,不是通过密码算法直接对明文加密,而是将密码算法输出与明文分组进行加密
4,输出反馈指的是密码算法的输出会反馈到下一次密码算法的输入。
5,也只需加密函数,不需解密函数即可完成。
5,密码反馈模式(CFB)特征:
过程:
1,将初始化向量IV加载到顶部寄存器。
2,使用密钥K加密寄存器中的数据值。
3,将j个最高有效位作为加密过程输出的作为,与明文分组P异或得密文分组。
4,将上一次加密的密文分组送入顶部寄存器,并继续按以上步骤加密。
特点:
1,需要初始向量IV。
2,具有错误传导特性,Cj出现传输错误,Pj的相同位置会出错,后续明文分组有50%出错概率,直至寄存器被全部刷新。
3,不能进行同步流加密,即无法跳过明文P1而对明文P2进行加密。
6,DES加密:
加密过程:
1,将64位的明文初始置换IP,然后分成两组,32位的L0和R0。
置换过程如下: (1)顺置换则让最右边一列排列为2,4,6,8,1,3,5,7,往左隔一行则加+8
* (2)逆置换则让左边第二列为87654321,往右隔行+8,最右边隔行为最左边。*
2,产生密钥。
过程如下:(1)64位的密钥将8的倍数位不使用变为56位的密钥。
(2)将产生的64位密钥分成两组28位C0,D0。
(3)将C0,D0按照循环左移表确定1位或2位左移。
(4)将C0,D0作为下一密钥生成的输入,同时输入压缩型P盒中,将56位的密钥压缩成48位的密钥。
3,将R0的32位输入进8行6列的矩阵中,每行最后两位作为第一行的前两位,重用了16位,32位的R0扩展成了48位。
4,扩展后的48位R0与48位的密钥异或后进行S盒替换后生成32位的结果。
S盒替换的过程如下:
(1)输入6位的二进制数据,头尾两位数据作为列,中间四位为行,转换为十进制,在S盒中寻找数字,转换为四位的二进制输出。这样每6位二进制为变为4位,48位变成了32位。
如S1盒中输入110101,行为1010即10,列为11即3,对应S1盒中3,输出为0110
5,经过S盒替换的32位数据进行置换运算后与L0的32位异或生成R1
6,将R0作为下一次L1,即左右两半部分交换,继续下一轮加密,一共进行十六轮
7,最后一轮的左右两半部分不进行交换。
8,最后的结果进行逆IP置换后得出64位的密文。
循环移位表如下:
总结:DES加密的基础就是Feistel结构,不过是增加了IP置换,以及64位的密钥如何变换成56位,再变换成48位,以及R进行扩展变换成48位后再与48位密钥进行S盒变成32位。
3DES:DES被破解后,进行了优化,将64位的密钥长度增加到了112位或者168位
7,AES加密:
AES加密的基础知识:
1,字节运算:主要是系统左移一位,右边补0,以为GF(2^8)域为例如:
**
2,字运算:
(1)乘法:
**
AES加密的四个阶段:
1,字节替换(即S盒替换):以字节为单位,8个二进制位,高四位为行,低4位为列,映射S表中对应的值。
2,列混淆:将输入或态与生成的常数矩阵进行相乘,生成新态,常熟矩阵生成如下,s'(x)=c(x)*s(x)mod(x^4+1),如:
**c(x)={03}
+{01}![\small
x^{2}](https://latex.csdn.net/eq?%5Csmall%20x%5E%7B2%7D)+{01}x+{02},![\small
x^{3}](http://www.aiwin.fun/)要与{01}x相乘mod(x^4+1)为0,以此类推,所以s0'(x)={01}s3+{02}s2+{03}x1+{02}x0,生成的矩阵第一行为02,03,02,01。**
3,行移位:第0行不变,第1行左移1个字节,第2行左移2个,以此类推。
4,轮密钥异或:将输入或者中间态的每一列与密钥Ki进行按位异或。
AES的加密过程:
* 1,将明文与轮密钥按位异或。*
2,最后一轮外的每一轮都进行S盒替换,行移位,列混淆,轮密钥异或。
3,最后一轮进行S盒替换,行移位,轮密钥异或。
4,生成密钥Y。
三、非对称密码体制
1, 对称密码体制原理:
拥有一对加密和解密的密钥,知道公钥p和消息,很容易能计算出密文,但不知道私钥的情况下,解密几乎不可能(即单向陷门函数)。
2,RSA算法:
原创链接https://mp.csdn.net/mp_blog/creation/editor/125168311
四,杂凑算法(HASH),消息认证
1,杂凑函数:
要求:1,无需密钥,算法公开
2,能进行数据压缩
3,能轻易对消息M进行计算出杂凑值,但是知道杂凑值,不可能求出M
4,强抗碰撞性:即不同的消息杂凑值不可能相同,事实上,碰撞是存在的,像MD5的碰撞就有,但是按要求找到一个碰撞几乎不可能。
某md5碰撞实例:a与b字符串中%00和%02不相同,但是md5后的值相同
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
2,杂凑算法的应用:
1,数字签名:由于强抗碰撞性,对消息摘要进行数字签名,几乎不能被伪造。
2,生成文档或程序的数字指纹:即网上下载的程序或文档的HASH值与官网的比较,确保数据是未被篡改的,完整的。
3,存储口令:数据库等存储口令的Hash值,即使数据泄露也无法被看到,保证了数据的机密性,用户输入口令仅需再次计算Hash与存储的对比即可。
3,SHA-1:
最大输入长度:2^64比特的消息,以512比特分组为单位处理,输出160比特消息摘要
算法核心:4轮循环模块,每轮由20个步骤组成,如下图:
使用的常理K:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79).
使用的函数f:
ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
初始化链接变量(十六进制):
H0=67452301
H1=efcdab89
H2=98badcfe
H3=10325476
H4=c3d2e1f0
**过程如下:
1,附加填充位:对消息进行填充,让它长度%512=448。填充的规则是填充一个1和若干个0使它长度mod512和448同余,然后添加64比特的无符号整数,值为原始消息长度。**
2,初始化链接变量:5个32比特固定数值赋给5个32比特的寄存器,即上图的H0,H1,H2,H3,H4的输入为A,B,C,D,E。
3,将512位的消息M,分成16x32位,分别为W0-W16。
4,对于16-79的Wt,Wt= S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16)。
**5,对于t=0-79,执行以下循环,![\small
S^{k}](https://latex.csdn.net/eq?%5Csmall%20S%5E%7Bk%7D) 为循环左移k比特位:**
**(1)A=
- ft(B,C,D) + E + Wt + Kt.**
(2) B=A
**(3) C=
(B) **
(4) D=C
(5) E=D
6,将下一轮缓冲区的值H0=H0+A,H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
7,四轮循环,每轮20步结束后,将得到的缓存区的5个H与初始化的H进行模2^32加,输出为160位的密文。
4,消息认证:
认证的分类:实体认证和消息认证。
认证的三类函数:消息加密函数,消息认证码,杂凑函数。
消息认证的方法:
1,对称密码体制:机密性,认证,只能解密用同一密钥加密的信息,不能提供数字签名,可否认
2,公钥密码体制:能实现数字签名,因为公钥只能解密私钥加密的数据,但不能提供机密性,因为私钥加密的信息,能公开的公钥解密。
3,公钥密码体制:将数据先进行私钥加密,再进行公钥加密,提供机密性,签名和认证。假如先进行公钥加密,再进行私钥加密,实则只进行了一次公钥一次加密,不能达到效果。
4,消息码的认证:即在数据中附带一个用密钥K和数据加密的函数值,接收方收到后再利用密钥K对数据进行加密,与附带的函数值比较,确定报文未被篡改,因为收发双方都知道密钥,不能提供数字签名。
5,基于杂凑函数:
(1)对称密码加密信息和杂凑值:提供机密性,完整性
(2)对称密码加密杂凑值:不提供机密性,提供完整性
(3)公钥体制加密杂凑值:提供完整性,数字签名。
(4)公钥和对称体制结合:用私钥对杂凑值加密得数字签名,对称密码加密消息M和数字签名,提供机密性,鉴别,数字签名。接收方先用对称密码密钥解密消息M和数字签名,提供机密性,用公钥解密数字签名,确保对方是由拥有私钥者发出,比较杂凑值鉴别完整性,
文章标题:应用密码学总结
文章链接:https://aiwin.fun/index.php/archives/1378/
最后编辑:2024 年 5 月 14 日 10:50 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)