应用密码学总结

28 分钟

前言

数据加密在当今信息传输中发挥着举足轻重的作用,而数据加密的基础是密码学的各类知识,加密的方法也是层出不穷,思维足够活跃,总有各种神奇的加密方法。鉴于此,对应用密码学做个总结笔记。


提示:以下是本篇文章正文内容,下面案例可供参考

一、概述

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密码结构的逻辑关系:

**Li =![\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位的明文和十六轮的\small Ki
,将明文对半分成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}\small x^{3}
+{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=\small S^{5}

  • ft(B,C,D) + E + Wt + Kt.**

(2) B=A

**(3) C=\small S^{30}
(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和数字签名,提供机密性,用公钥解密数字签名,确保对方是由拥有私钥者发出,比较杂凑值鉴别完整性,

~  ~  The   End  ~  ~


 赏 
承蒙厚爱,倍感珍贵,我会继续努力哒!
logo图像
tips
文章二维码 分类标签:Web安全Web安全
文章标题:应用密码学总结
文章链接:https://aiwin.fun/index.php/archives/1378/
最后编辑:2024 年 5 月 14 日 10:50 By Aiwin
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
(*) 4 + 8 =
快来做第一个评论的人吧~