找了一圈B站大学,发现应用密码学还是太小众了(网安和密码已经被卷爆了),所以我还是自己写一个纲要吧,不求精深,但求全面。
一、密码学基础
1、密码学相关概念
首先密码体系主要分为三大板块:明文、密文、密钥,所有的加解密手法和攻击手法都是基于这三个元素进行展开的。然后再加上加密算法和解密算法,共同构成了密码学的五元组{P,C,K,E,D},满足:
因此,我们对攻击进行分类:1.唯密文攻击,2.已知明文攻击,3.选择明文攻击,4.选择密文攻击,5.选择文本攻击
1.唯密文攻击
这是档次最低的攻击也是算法必须要能抵抗的攻击。是验证一个密码系统是安全的必要条件。攻击者已知算法和密文,要能在有限时间内破解出明文。具有代表性的是爆破,统计攻击(通过统计特征如词频统计来进行模仿),模式攻击(用密文形成的某些模式来进行攻击)
2.已知明文攻击
攻击者已知算法,一定量的明文-密文对和待解密的密文,要能在有限时间内破解出明文。
应对已知明文攻击的核心是采用“深度防御”策略:优先选择AES等强算法,结合CBC或GCM等安全模式,并辅以严格的密钥管理和随机性引入。现代应用中,推荐使用标准化库(如OpenSSL或Libsodium)实现上述手法,其中最简单有效的就是定期更换密钥。
3.选择明文攻击
攻击者已知算法,选定的明文-密文对和待解密的密文,要能在有限时间内破解出明文。比如说对于ECB模式,给定选择的明文-密文对,就可以根据规律推出对应的密钥,因为明文的特征逻辑没有在加密过程中得到隐藏。
4.选择密文攻击
攻击者已知算法,选定的密文和对应的明文还有待解密的密文,要能在有限时间内破解出明文。
4.选择文本攻击
就是把选择明文攻击和选择密文攻击结合起来,也是强度最高的攻击。一般情况下,验证一个密码体制的安全性是看前面三个攻击下是否安全。
2、密码系统
柯克霍夫原则:密码体制的安全性仅应依赖于对密钥的保密,而不应依赖于对算法的保密。
破译算法也分为四个级别:全部破译,即找出密钥;全部推导,即找出替代算法;实例推导,即找出替代算法;信息推导,即获得一些有关密钥或明文的信息。
同样的,评价密码体制安全性也分为三个途径:计算安全性(现有算力资源无法在有效时间内破解),可证明安全性(将问题归结到一个数学上的求解困难问题上),无条件安全性(假定拥有无限的计算资源仍无法破解,目前只有一次一密方案满足)
3、安全模型
1.网络传输中的信息安全
收发方通过安全信道交换密钥,然后通过密钥加密的密文通过不安全的公开信道进行传输,所谓不安全的信道,是指除了信息的预定接收方以外,其他方也能对信息进行重组、删除、插入和读取操作。
有时还需要可信的第三方,当双方对于信息真实性起争执时可以进行仲裁,还可以进行密钥等秘密信息的分发。
2.计算机系统中的信息安全
就是等于平时的渗透测试,通过waf或者edr等一系列防护手段,不允许黑客通过web口等访问通道对用户主机进行伤害影响。
4、密码体制
1.对称密码体制
优点:加解密速度快,保密度高
缺点:密钥分发过程很复杂,代价高,多人通信时密钥组合数量会爆炸性膨胀,存在数字签名困难问题
2.非对称密码体制
优点:每个用户单独保存自己的私钥,密钥分配简单,可以实现数字签名
缺点:加解密速度慢,同等安全强度下要求的密钥位数多
二、数学基础
1、数论
若存在整数a,m,b满足a=mb,则称b整除a,记作b|a
素数:只能被1和它本身整除的整数。可以引出以下定理
算术基本定理:任何大于一的整数a都可以唯一分解为素数幂之积的形式:
素数定理:当n是素数时,它不能被任一整数d(1<d<n^(1/2))整除
推论:a是一个完全平方数(4/9/16)D(a)是奇数
最大公约数:gcd(a,b)=max{k | k|a且k|b}
辗转相除法(欧几里得算法):这个不用解释吧
模运算:a模n同余的数全体为a的同余类,记为[a]
Zn域上的就直接放图吧
乘法消去律需要满足gcd(a,n)=1才能消去
贝祖等式:任意整数a>b>0,存在整数x,y,使得gcd(a,b)=xa+yb
拓展欧几里得算法:就是把正常的欧几里得算法算出来之后倒序求解贝祖等式中的x和y等
费马定理:如果p是素数且a是不能被p整除的正整数,则
欧拉函数:
欧拉定理:对于任何互素的两个整数a和n,有
阶与本原元:如果a与n互素,满足至少有一个m,使得a^m与1模n同余,称最小m为模n下a的阶
如果此时m=n的欧拉函数,则称a为n的本原元
本原元并不一定唯一,且只有以下形式才有本原元:2,4,p^a,2p^a(p为奇素数)
中国剩余定理:
2.群论
群由一个非空集合G组成,定义一个二元运算符"*",满足以下属性:
1)封闭性
2)结合律
3)单位元
4)逆元
如果满足交换律,则称为交换群
如果群中每一个元素都是某一个元素g的幂,则称该群是循环群(循环群总是交换群)
一个群中元素a的阶就是使得a^n=i(单位元)成立的最小正整数n
群的性质:
群中单位元唯一
群中每一个元素的逆元唯一
满足消去律
3.有限域理论
域:在一个非空集合中定义两个二元运算符,关于两个运算符都满足交换群,并满足分配律,且对任意a,b∈F,如果a·b=0,则a=0或b=0
用定义来说,域就是可以上面加减乘除都不会超出范围的一个集合,有理数集合、实数集合、复数集合都是域,但是整数集合不是。
有限域:域中只包含有限个元素,就称为有限域,其中元素的个数称为有限域的阶。
有限域定理:
- 每个有限域的阶必定是素数的幂,即可以表示为p^n,该有限域通常成为伽罗华域,记为GF(p^n)
- 当n=1时,有限域GF(p)也称为素数域
- 同理,我们也可以类似得到有限域GF(p)的生成元(或本原元)g
推论:a=g^i的乘法逆元是a^(-1)=g^(-i)(mod (p-1))
有限域上的多项式运算:
按照正常的规则来进行运算,只要倍数为2的都消去
有限域GF(2^n)由GF(2)上所有次数小于n的多项式组成
4、计算复杂性理论
1.算法复杂性
用时间复杂度和空间复杂度来衡量算法的复杂性,通常,如果时间需求T(n)=O(a^(P(n))),则称该算法是计算上安全的
算法还分为确定性算法和非确定性算法
2.问题复杂性
指数时间类问题>NPC类问题>NP类问题>P类问题
- P问题:在多项式时间内可以用确定性算法求解的问题
- NP问题:在多项式时间内可以用非确定性算法求解的问题
- NPC问题:所有NP问题都可以通过多项式时间转换为NPC问题,即NP完全问题,这是NP类问题中困难最大的一类问题
- 对于一个NPC问题,不存在任何已知的确定性算法在多项式时间内可求解该问题
- 在不知道计算序列的情形下,求解NPC问题计算上不可行 由于NPC问题目前没有找到有效的算法,因此适合用来构造密码体制,现有密码算法基本都是基于NPC问题
三、古典密码
1、隐写术
藏头诗啊,对角线隐藏啊,常出现于脑筋急转弯以及misc题中,典中典了
2、代替密码
一战时期的密码本就是以此为理论基础,根据替换表对明文进行加密,可以分为单表代替密码和多表代替密码
1.单表代替密码
移位密码、带密钥的移位和仿射密码
特点:密钥量小,无法抵抗穷举,也无法抵抗统计分析攻击
2.多表代替密码
将明文划分为长度相同的分组,每组分别进行代替,多个映射表
普莱费尔密码、维吉尼亚密码、希尔密码
playfair密码:根据给定的密钥k构造字母矩阵,先按顺序填密钥中字母,再补上剩余字母。i,j填在同一格。每两个字母作为一个明文对,如果在同一行则取每个明文字母右侧的作为密文,如果在同一列则取每个明文字母下方的作为密文,如果在对角线则取另一条对角线的作为密文
维吉尼亚密码:确定一个密钥k,作为密钥流,每次取对应位置的字母与明文进行mod26加密,密钥循环使用
Hill密码(希尔密码):给定密钥矩阵k(n×n阶),计算k·p,利用行列式求逆的思想进行解密。
特点:可以抵抗统计攻击,同时易受已知明文攻击和选择明文攻击
3、换位密码
将明文各字符位置重新排列组合得到密文的一种密码体制,加入密钥可以读出不同顺序的明文排序。
周期置换密码、列置换密码(都很经典了这里就不赘述了)
四、对称密码
1、序列密码(流密码)
根据明文流和密钥流生成密文流,以一个符号作为基本的处理单元,每一时刻使用的密钥是不同的
1.同步序列密码
密钥流的产生与明密文信息流相互独立,两者互不干扰。
特点:
- 无错误传播,一个传播错误只影响一个符号,后续无关
- 收发方必须保持同步,确保密钥位置相同,才能正确解密,只要丢失或者错误一个,接收方就会一直错到底,撞了南墙也不回头
- 但是对应的是容易检测到插入删除等主动攻击
实际应用中的序列密码安全性由密钥流保证,理论上无限长的密钥流可以产生一次一密的结果,绝对安全,但是我们没有无限长的密钥流,只能将其尽可能拉长,以提高安全性,因此我们产出了线性反馈移位寄存器(LFSR),通过不断的向右移动一位输出然后左边通过当前的线性函数计算补充,序列周期不超过2^n-1
基于LFSR的密钥流生成器有:Geffe生成器,钟控生成器,交错停走式发生器(是钟控发生器的一种,采用三个LFSR)
2.自同步序列密码
密钥流依赖于前面已经产生的密文字符,通过结合前面n个密文字符产生新的密钥。
特点:
- 有限错误传播:一个符号的传输错误最多影响到后面n个符号的解密
- 自同步
- 但是这里引入了生成的密文进行加密,密钥流的分析会复杂化,难以从理论上进行详尽分析
3.流密码算法RC4
主要用密钥调度算法KSA和伪随机数生成算法PRGA实现
KSA用密钥k来打乱状态数组S,然后打乱的数组S再用PRGA生成伪随机的密钥流
简化版RC4的python实现:
def KSA(key):
# 初始化S
S = list(range(256))
T = [key[i % len(key)] for i in range(256)] # 扩展密钥
j = 0
for i in range(256):
j = (j + S[i] + T[i]) % 256
S[i], S[j] = S[j], S[i]
return S
def PRGA(S):
i, j = 0, 0
while True:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256
k = S[t]
yield k
def RC4(key, data):
# 加密或解密数据
S = KSA(key)
keystream = PRGA(S)
res = []
for byte in data:
k = next(keystream)
res.append(byte ^ k)
return bytes(res)
2、分组密码
简单来说就是把明文分组,然后每个组根据密钥分组进行置换得到密文分组,然后再合并成密文。大部分的分组密码算法设计都是基于Shannon提出的扩散和混乱原理实现的。
扩散原则:将每一个明文和密钥的影响尽可能快速的分布到多个密文中,以隐藏明文的统计特性
混乱原则:使密文与明文、密钥之间的统计关系尽可能复杂化,难以从密文的统计特性推出密钥
1.SP网络
通过S变换和P变换进行密码迭代,其中S盒起到混乱作用,P盒起到扩散作用。
- S 盒的输入和输出位数不一定相同,有可逆和不可逆之分。可逆的S盒的输入位数和输出位数相同
- P盒有三种类型:普通型、压缩型、扩散型(雪崩效应)
Lucifer算法:每轮32个S盒,P盒在每个S盒输出中间打乱S盒输出数字的次序,将其扩散到下一级的各个S盒中,S盒内部做非线性变换进行混淆。
(1)Feistel密码(典型:DES算法)
将明文分为左右两半,每次先调换位置再进行轮函数加密和异或求出右半。
(2)非Feistel密码(典型:AES算法)
ECB模式:用同一个密钥加密,尾数不足就用任意二进制序列填充
CBC模式:每次明文都是当前明文和上一个密文的异或再加密,因此定义有一个初始向量IV
CTR模式:用一个与明文分组规模相同的计数器进行加密再与明文进行异或
CFB模式:用初始向量IV输入64比特移位寄存器,最左j比特与明文第一分组异或,然后输出的密文再移入移位寄存器的最右端
OFB模式:将加密算法的输出直接反馈作为下一次的输入,与明文异或
(3)DES加密原理
明文分组64比特,使用密钥64位,有效密钥长度为56位(8位用于奇偶校验位或随机设置),然后进行16轮Feistel变换
S盒首位2位确定行号,中间4位确定列号,然后按表索引(这是6->4)
由于DES内部S盒设计准则未公开,密钥长度太短,代数结构存在互补对称性,所以安全性较低,现在基本被淘汰了,除了某tf的烂题会出。。。
鉴于密钥长度,可以采用多重加密的方式来间接增加密钥长度
DES-EEE3:使用三个不同密钥顺序来进行三次DES加密
DES-EDE3:使用三个不同密钥依次进行加密--解密--加密
DES-EEE2:顺序进行三次DES加密,其中第一和第三次密钥相同
DES-EDE2:依次进行加密-解密-加密,其中第一和第三次密钥相同
(4)AES加密原理
AES加密过程包括多个“轮”(rounds),轮数取决于密钥长度(例如,128位密钥对应$10$轮)。每轮执行四个主要步骤:
- 字节替换(SubBytes):使用S-box(代换盒)对每个字节进行非线性变换,增加混淆性。
- 行移位(ShiftRows):将数据块的行进行循环移位,促进数据扩散。
- 列混淆(MixColumns):通过矩阵乘法混淆列数据,增强扩散效果(最终轮省略此步)。
- 轮密钥加(AddRoundKey):将轮密钥与数据块进行异或操作。
初始轮只执行AddRoundKey,最终轮省略MixColumns。解密过程是加密的逆过程,使用相同密钥。
五、非对称密码
终于到非对称了哈哈哈哈哈哈主包逐渐疯狂。。。。。(关于非对称,相信大家都很熟悉了,前情提要就直接略过了)
单向陷门函数:正向求解容易,知道私钥反向求解也容易,但是不知道私钥的情况下反向求解困难
1、Diffie-Hellman密钥交换算法
收发方各自选取一个随机数作为私钥,将生成的公钥进行交换,然后计算出加密用的密钥K
2、RSA
3、椭圆曲线密码体制ECC
椭圆曲线密码加密简述
椭圆曲线密码学(ECC)是一种公钥加密技术,其核心原理基于椭圆曲线离散对数问题(ECDLP)的困难性。在椭圆曲线上,给定一个基点G和一个点Q = kG(其中k是整数),计算k是计算上困难的(即无法在多项式时间内求解)。这种困难性确保了ECC的安全性,同时相比于传统公钥加密(如RSA),ECC在相同安全级别下使用更短的密钥(例如256位ECC密钥相当于3072位RSA密钥),从而更高效。
椭圆曲线通常定义为方程y^2 = x^3 + ax + b(其中a和b是常数,且4a^3 + 27b^2 ≠ 0),点运算(如点加法和标量乘法)在有限域上进行。加密流程通常采用标准方案(如ECIES),以下是简化步骤:
1. 密钥生成(接收方操作)
- 接收方随机生成一个私钥d(一个整数,取值范围基于椭圆曲线的阶)。
- 计算公钥Q = dG,其中G是椭圆曲线上预定义的基点。
- 公钥Q公开分享,私钥d严格保密。
- 发送方获取接收方的公钥Q。
- 随机生成一个临时私钥k(整数),计算临时公钥R = kG。
- 计算共享密钥S = kQ(利用点运算,S是一个椭圆曲线点)。
- 将S转换为对称密钥(例如通过哈希函数),并使用对称加密算法(如AES)加密明文消息M,得到密文C。
- 发送(R, C)给接收方(R用于共享密钥恢复)。
- 接收方收到(R, C)后,使用自己的私钥d计算共享密钥S = dR(因为dR = d(kG) = k(dG) = kQ)。
- 将S转换为对称密钥,并用其解密密文C,恢复原始消息M。
- 安全性基础:攻击者即使截获R和Q,也无法计算k或d,因为求解k需要解决ECDLP(在椭圆曲线上,标量乘法kG容易计算,但逆运算困难)。
- 效率优势:点运算在有限域上高效实现,结合对称加密(处理大数据),使ECC速度快且资源消耗低。
- 应用场景:广泛用于TLS/SSL、数字签名和物联网设备等资源受限环境。
- 效率优势:点运算在有限域上高效实现,结合对称加密(处理大数据),使ECC速度快且资源消耗低。
- 应用场景:广泛用于TLS/SSL、数字签名和物联网设备等资源受限环境
六、数字签名
其实我感觉这个跟非对称没啥区别,RSA和ECC也可以用于数字签名,无非就是相应的密钥和算法微调一下,所以就不写了
赞美应用密码!!!