免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
目录
一:现代密码介绍
现代密码学是研究如何在信息传输和存储过程中保护数据安全的学科,主要目标是实现机密性、完整性、身份认证和不可否认性。随着计算机和互联网的发展,现代密码学已成为网络安全、区块链、金融科技等领域的核心技术。
1.现代密码学的核心组成部分
-
对称加密
-
特点:加密与解密使用同一密钥。
-
典型算法:
-
DES,RC4,3DES,AES...RC5
-
ChaCha20:高效且适用于移动设备。
-
-
应用场景:文件加密、数据库存储、实时通信(如TLS协议)。
-
挑战:密钥分发问题(需安全传输密钥)。
-
-
非对称加密
-
特点:使用公钥(公开)和私钥(保密)配对,公钥加密只能由私钥解密,反之亦然。
-
典型算法:
-
RSA:基于大数分解难题,广泛用于数字签名和密钥交换。
-
ECC(椭圆曲线加密):相同安全强度下密钥更短,适用于资源受限环境(如物联网)。
-
Diffie-Hellman:安全协商密钥,解决对称加密的密钥分发问题。
-
-
应用场景:HTTPS、数字证书、区块链地址。
-
-
哈希函数
-
特点:将任意长度数据映射为固定长度哈希值,具有抗碰撞性和单向性。
-
典型算法:
-
SHA-256(比特币使用)、SHA-3:抗量子计算攻击。
-
BLAKE3:高性能哈希算法。
-
-
应用场景:数据完整性验证、密码存储(加盐哈希)、默克尔树(区块链)。
-
-
数字签名与证书
-
数字签名:用私钥对数据哈希值加密,验证者用公钥解密以确认来源和完整性。
-
PKI体系(公钥基础设施):依赖CA(证书颁发机构)签发数字证书,绑定公钥与身份(如网站SSL证书)。
-
2.现代密码学的应用场景
-
网络安全:
-
TLS/SSL协议(HTTPS)保护网页通信。
-
VPN使用加密隧道保障数据传输安全。
-
-
区块链与加密货币:
-
比特币通过ECDSA签名验证交易。
-
零知识证明(如zk-SNARKs)实现隐私保护(如Zcash)。
-
-
物联网(IoT):
-
轻量级加密算法(如Curve25519)保护设备通信。
-
-
隐私计算:
-
同态加密(Homomorphic Encryption)允许在加密数据上直接计算。
-
3.密码分析:攻击与防御
现代密码学需抵御多种攻击手段:
-
暴力破解:通过密钥空间大小评估安全性(如AES-256需2²⁵⁶次尝试)。
-
侧信道攻击:通过功耗、时间等信息推测密钥(需硬件防护)。
-
量子计算威胁:
-
Shor算法可破解RSA和ECC,Grover算法削弱对称加密安全性。
-
后量子密码学(Post-Quantum Cryptography)研究抗量子算法(如基于格的加密)。
-
4.未来趋势
-
后量子密码标准化:
-
NIST正在推进抗量子算法标准(如CRYSTALS-Kyber、Falcon)。
-
-
隐私增强技术:
-
零知识证明(ZKP)、安全多方计算(MPC)保护数据隐私。
-
-
同态加密实用化:
-
支持加密数据查询与分析(如医疗数据共享)。
-
5.小结
现代密码学结合数学、计算机科学和工程实践,不断演进以应对新型威胁(如量子计算)。其核心在于安全性与效率的平衡,同时依赖标准化(如NIST)和开源社区推动技术落地。学习密码学需掌握基础理论(如数论、群论),并关注实际应用中的协议设计(如OAuth2.0、WireGuard VPN)
(本文先对现代密码学中的对称密码进行介绍,后续会有非对称密码等一系列密码学介绍,感兴趣关注)
二:对称密码
1.流密码
流密码的核心原理
-
密钥流生成器
流密码的核心是生成与明文长度相同的伪随机密钥流,由以下两部分构成:-
密钥(Key):用户提供的秘密值(如128/256位)。
-
初始向量(IV, Initialization Vector):公开的随机数,确保相同密钥加密不同明文时生成不同的密钥流(避免密钥重用攻击)。
伪随机数生成器(PRNG)将密钥和IV作为输入,生成看似随机的密钥流。例如:
-
RC4:基于置换表生成密钥流,但存在漏洞(如WEP协议中的密钥重用问题)。
-
ChaCha20:基于置换和位移操作,支持高吞吐量(如TLS协议中使用)。
-
Salsa20:与ChaCha20类似,但轮数较少。
-
2.加密与解密过程
加密:密文 = 明文 ⊕ 密钥流
解密:明文 = 密文 ⊕ 密钥流
(注:XOR操作可逆性使其加解密过程相同)
2.RC4
RC4(Rivest Cipher 4)是由Ron Rivest于1987年设计的对称密钥流密码算法,曾因其简单性和高效性被广泛应用于SSL/TLS、WEP等协议中。然而,由于其存在的多个安全漏洞,现已被视为不安全算法,逐渐被AES、ChaCha20等替代。
(此上两图参考:详细了解RC4加密算法-优快云博客)
1.RC4的核心结构
RC4由两部分组成:密钥调度算法(KSA)和伪随机生成算法(PRGA)。
密钥调度算法(KSA)
-
作用:使用密钥初始化一个256字节的状态数组S。
-
步骤:
-
初始化数组:将S数组按顺序填充为0到255,即
S[0]=0, S[1]=1, ..., S[255]=255
。 -
密钥扩展:若密钥长度不足256字节,循环重复密钥直至填满临时数组
K[0..255]
。 -
打乱数组:通过交换操作,将密钥与S数组混合
-
for i in 0 to 255:
S[i] = i
j = 0
for i in 0 to 255:
j = (j + S[i] + key[i % keylen]) % 256
swap(S[i], S[j])
伪随机生成算法(PRGA)
-
作用:基于KSA生成的S数组,生成伪随机密钥流。
-
步骤:
-
初始化索引
i = 0, j = 0
。 -
每次生成一个密钥字节:
-
密钥流与明文逐字节异或(XOR)得到密文。
-
i = (i + 1) % 256
j = (j + S[i]) % 256
swap(S[i], S[j])
K = S[(S[i] + S[j]) % 256]
2.KSA与PRGA具体流程
KAS流程图:
PRGA流程图:
KSA(秘钥调度算法):
首先创建一个256字节的数组s表(0~255),然后准备一个种子秘钥比如是secret ,T[i]=k[i mod keylen] 种子秘钥一共有6位,所以keylen为6,这里的i取值为0~255。所以T[0]=K[0 mod 6]=0=s.....T[7]=k[6 mod 6]=0 =s.所以这个公式的规律就是将种子秘钥循环至256位。然后利用T表对S表进行初始置换,首先j=0 i=0~255 所以j=(0+0+T[0]=s=115)mod 256=115 mod 256 =115 。然后将s[0]=0和s[115]=115两个值进行替换。所以新的s表为(115,0......),然后进过循环即可得到新的s表。
PRGA(生成秘钥流k表):
利用新的s表生成秘钥流k表。首先设置i和j和r为0进行for循环256次,第一次循环i=(0+1)mod 256 =1 j=(0+s[1]=0)mod 256 =0 将这两个值进行替换最后得到新的s表(115,208),然后t=(s[i]+s[j])=208+115 mod 256 =67,s[67]=237 然后k[0]=237。然后将明文iloveyou替换为2进制,将k表也替换为2进制,然后进行异或运算。例如237=11101101 i=01101001 进行异或(相同为0不同为1)得到密文=10000100 最后将二进制转化为16进制密文。k表与明文长度相同。
看不懂?看案例
3.案例讲解
KSA(密钥调度算法)流程:装修S表密室
目标:用密钥把S盒从0,1,2,...,255
装修成乱序数组
工具:种子密钥K(长度可变,一般40~2048位)
步骤拆解:
-
初始化S表:
-
生成临时向量T:
-
若密钥是
"Key"
(ASCII码:75, 101, 121
),则T表循环填充直到256字节:
-
-
洗牌大师j登场:
示例演示(简化版):
-
密钥:
[3, 4, 5]
→ T表前6位:[3,4,5,3,4,5]
-
初始S表:
[0,1,2,3,4,5]
(假设仅6元素)
轮数i | j计算 | 交换后S表 |
---|---|---|
i=0 | j=(0 + S[0]=0 + T[0]=3 → 3 | S[0]↔S[3] → [3,1,2,0,4,5] |
i=1 | j=(3 + S[1]=1 + T[1]=4 → 8 → 2(mod6) | S[1]↔S[2] → [3,2,1,0,4,5] |
i=2 | j=(2 + S[2]=1 + T[2]=5 → 8 → 2(mod6) | S[2]↔S[2](无变化) |
最终S表(部分):[3,2,1,0,4,5]
吐槽:密钥短时,搓澡搓了个寂寞,S表仍然有规律可循 😅
PRGA(伪随机生成算法)流程:密钥流蹦迪现场
目标:用装修后的S表生成无限长的密钥流(每个字节用于加密1字节明文)
步骤拆解:
-
初始化指针i和j:
-
循环生成密钥流字节:
示例演示(接上例S表[3,2,1,0,4,5]
):
轮数 | 操作步骤 | 当前S表 | 密钥流字节 |
---|---|---|---|
1 | i=1, j=(0+S[1]=2) → 2 → 交换S[1]↔S[2] | [3,1,2,0,4,5] | S[(1+2)%6=3] → 0 |
2 | i=2, j=(2+S[2]=2+2=4) → 4 → 交换S[2]↔S[4] | [3,1,4,0,2,5] | S[(4+2)%6=0] → 3 |
3 | i=3, j=(4+S[3]=0 → 4+0=4) → 交换S[3]↔S[4] | [3,1,4,2,0,5] | S[(2+0)%6=2] →4 |
吐槽:S表越蹦越乱,密钥流像抽盲盒,但前几个字节可能暴露装修痕迹 🕵️♂️
安全漏洞吐槽
-
KSA装修翻车:
-
弱密钥:若密钥为
[0,0,0]
,S表最后可能变成0,1,2,3,...
(搓澡搓了个寂寞) -
前字节偏科:首字节密钥流概率偏向
(K[0]+K[1])%256
,黑客可反推密钥🔓
-
-
PRGA社死现场:
-
密钥流重用:同一密钥加密不同明文 → 明文1⊕密文1⊕密文2 = 明文2(裸奔警告⚠️)
-
多学几遍就会了
RC4加解密python代码
# RC4密钥调度算法(KSA)
def KSA(key):
# 初始化状态数组S(0到255)
S = list(range(256))
j = 0
# 对S进行初始化处理
for i in range(256):
j = (j + S[i] + key[i % len(key)]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]的值
return S
# RC4伪随机生成算法(PRGA)
def PRGA(S):
i = 0
j = 0
while True:
# 生成伪随机字节流
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]的值
K = S[(S[i] + S[j]) % 256] # 生成伪随机字节
yield K # 使用yield生成伪随机字节
# RC4加解密函数
def RC4(key, data):
# 1. 执行KSA生成状态数组S
S = KSA(key)
# 2. 获取PRGA生成伪随机字节流
prga = PRGA(S)
# 3. 对数据进行加解密(RC4的加解密过程是相同的,都是逐字节与伪随机字节异或)
result = []
for byte in data:
result.append(byte ^ next(prga)) # 异或生成加密字节
return bytes(result)
# 示例密钥(字节数组形式)
key = [1, 2, 3, 4, 5]
# 明文数据(字节数组形式)
data = b"Hello, RC4!" # 例如加密字符串 "Hello, RC4!"
# 加密
ciphertext = RC4(key, data)
print(f"密文: {ciphertext.hex()}")
# 解密(RC4是对称加密,所以加密和解密使用相同的过程)
decrypted = RC4(key, ciphertext)
print(f"解密后的数据: {decrypted.decode('utf-8')}")
2.分组密码
1.分组密码核心原理
分组密码是一种对称密码学方法,其核心原理是将明文数据分成固定大小的块(通常为64位或128位),然后对每个块进行加密或解密。以下是分组密码的核心原理:
-
数据分组:
-
将明文数据划分为固定长度的块。例如,AES使用128位(16字节)块。
-
如果数据不能完全填满一个块,会使用填充方法(如PKCS#7)补充,确保每个块大小一致。
-
-
加密算法:
-
每个块通过特定的加密算法转换为密文块。
-
常见算法包括AES、DES、Triple DES等。
-
-
工作模式:
-
分组密码需要配合工作模式(Mode of Operation)使用,以增强安全性和适用性。
-
常见模式有ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、CFB(Cipher Feedback)、OFB(Output Feedback)、CTR(Counter)等。
-
ECB:每个块独立加密,简单直接,但不安全,容易被频率分析攻击。
-
CBC:将前一个块的密文与当前明文混合后加密,提升安全性,防止重复块攻击。
-
CFB:将加密块的输出反馈到下一个加密过程中,适用于数据流加密。
-
OFB:与CFB类似,但不适合所有应用。
-
CTR:使用计数器生成密钥流,适合并行处理,安全性高
-
-
4.优点
算法标准化,实现成熟可靠。
高加密效率,适合大量数据加密。
5.缺点
不适合实时数据流(需配合流密码模式)。
需要处理不完整块填充问题。
密钥管理复杂。
2.DES
1.总体加密流程
首先明文为64位(算法规定),然后进来进行ip置换目的是将明文顺序打乱,(ip置换表固定如将第58位放在第一位第60位放在第二位),将打乱后的明文进行分组,分为左半部分L₀(32位)和右半部分R₀(32位)。然后进行16轮feistel网络处理,将右半部分r0作为下一次加密的左半部分,左半边l0分作为下一次加密的右半部分。r1右半部分由左半部分l0和轮函数异或作为下次左半部分l2。轮函数由r0和16把子密钥中第一把子密钥组成。然后经过16轮替换后进行IP⁻¹置换(IP⁻¹与ip置换表相对应)如上文将60位放在第一位,逆置换则将第一位放在第60位以此类推。然后得到密文
2.轮函数
(1)E盒扩展变换 (48位)
左边加一个右边加一个。左边加前面一行末尾最后一个值右边加下一行第一位的值。
(2)异或
R0和第一把子密钥k1进行异或
(3)S盒替代(32位)(八个盒子具体值自行查找或找博主领取,本文就不呈现了)
s盒一共有八个盒子,盒子中的数据是固定的,第一轮使用第一个盒子,第二轮使用第二个盒子以此类推。将48位数据分为八组每组6位,然后将每组6位的二进制取头和尾(如011101取0和1),将头和尾组合为行号01行中间4位1110为列号与第一个盒子进行对应假如取的6然后将其转化为二进制就算压缩完成。将6位2进制压缩为4位二进制。最后48位变为32位
(4)P盒替代 (32位)
将s盒输出的32位数据按照固定置换表进行重新排序(例如将16位放在第一位)
经过如上轮函数过程就得到与l0进行异或的值进而得到了R1
3.子密钥生成
(1)择初始密钥(64位其中有八位校验位)
(2)进行pc-1置换后得到56位数据
PC-1表
列 1 | 列 2 | 列 3 | 列 4 | 列 5 | 列 6 | 列 7 | 列 8 |
---|---|---|---|---|---|---|---|
57 | 49 | 41 | 33 | 25 | 17 | 09 | 01 |
58 | 50 | 42 | 34 | 26 | 18 | 10 | 02 |
59 | 51 | 43 | 35 | 27 | 19 | 11 | 03 |
60 | 52 | 44 | 36 | 63 | 55 | 47 | 39 |
31 | 23 | 15 | 07 | 62 | 54 | 46 | 38 |
30 | 22 | 14 | 06 | 61 | 53 | 45 | 37 |
29 | 21 | 13 | 05 | 28 | 20 | 12 |
(3)将56位数据拆分为左右个28位数据c0d0
(4)然后将c0和d0进行左移然后得到了c1和d1
循环轮数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
左移位数 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
(5)将c1和d1进行pc-2置换压缩得到48位数据
PC-2表
数值 1 | 数值 2 | 数值 3 | 数值 4 | 数值 5 | 数值 6 |
---|---|---|---|---|---|
14 | 17 | 11 | 24 | 01 | 05 |
03 | 28 | 15 | 06 | 21 | 10 |
23 | 19 | 12 | 04 | 26 | 08 |
16 | 07 | 27 | 20 | 13 | 02 |
41 | 52 | 31 | 37 | 47 | 55 |
30 | 40 | 51 | 45 | 33 | 48 |
44 | 49 | 39 | 56 | 34 | 53 |
46 | 42 | 50 | 36 | 29 | 32 |
(6)第二轮将c1和d1进行左移然后进行pc-2压缩以此类推得到16个子密钥
你肯定没看懂,正常正常!!看下面的案例
4.案例讲解
DES轮函数大冒险:一场16回合的“左右互搏”擂台赛 🥊
欢迎来到 DES加密擂台!这里每回合都上演着 “左右半区相爱相杀” 的戏码,64位数据块要经历16轮“变态折磨”才能修成密文正果!🎭
回合规则说明书(以第1轮为例):
第一回合:右半区的“变形记” 🌀
1. 拉面师傅E盒:32位→48位(物理膨胀术)
-
操作:把32位的右半区像拉面一样扯成48位!
-
秘技:重复某些位,比如原第32位变成新第1&47位
-
吐槽:这不是注水,是 战略注位!💦
-
示例:
输入:0000...0001
(32位)
输出:100000...000001
(48位,头尾强行加戏)
-
2. 子密钥K1的激情互怼:48位异或大战
-
规则:48位拉面 vs 48位子密钥,相同位变0,不同变1
-
密钥生成:主密钥被PC-1/PC-2表搓成16把钥匙(后文揭秘)
-
效果:拉面变成 椒盐味,亲妈都尝不出原味🌶️
-
3. 穿越8个魔法S盒:48位→32位(瘦身黑科技)
-
S盒黑魔法:
-
把48位切成8坨6位面团
-
每坨扔进对应的S盒(共8个),按首尾两位定行,中间四位定列
-
查表输出4位(比如S1盒输入
101100
→ 行2列6 → 输出0100
)
-
-
吐槽:每个S盒都是 非线性变形器,专门制造混乱!🤪
4. P盒大魔王:32位乾坤大挪移
-
操作:把S盒输出的32位按固定路线打乱(比如第16位变第1位)
-
目的:让黑客找不着北,堪称 位操作界的华容道 🧩
-
5. 和左半区L0贴身肉搏(异或决斗)
-
终极PK:P盒输出 vs 左半区L0
-
规则:相同位变0,不同变1
-
结果:生成新右半区R1
-
左半区躺赢:L1直接继承R0(复制粘贴大法好📋)
-
16回合战报总结 📜
回合数 | 左半区行动 | 右半区行动(地狱级变形) |
---|---|---|
1 | L1 = R0 | R1 = L0 ⊕ P盒(S盒(异或(E(R0),K1)) |
2 | L2 = R1 | R2 = L1 ⊕ P盒(...) |
... | ... | ...(重复15轮) |
16 | 禁止交换! L16=R15 | R16 = L15 ⊕ P盒(...) |
-
最终合体:R16 + L16 → IP⁻¹逆置换 → 64位密文
-
设计心机:最后一轮不交换左右,黑客猜不到结尾!😈
子密钥生成:钥匙工厂流水线 🔑
-
轮移玄学:
-
第1轮左移1位:钥匙轻微漂移 🚗
-
第3轮左移2位:钥匙甩尾入库 🏎️
-
-
黑客の噩梦:16把钥匙各不相同,暴力破解算到秃头👨🦲
DES擂台の黑历史 🕶️
-
56位密钥太短:1999年被22小时暴力破解,从此走下神坛⏳
-
S盒暗藏后门? 其实NSA优化过S盒抗差分攻击,但当年没人信🤫
-
3DES急救包:加密→解密→加密,密钥长度X3,但速度慢如蜗牛🐌
赛后总结 🏆
-
DES必杀技:Feistel结构(加密解密结构相同)+ S盒非线性混淆
-
现代替代:AES表示“我更快更长更抗揍!” 💪
-
学习意义:密码学活化石,理解对称加密的 混淆与扩散 精髓!🔐
现在你明白了吗?DES就像一场 左右半区互扇耳光16回合 的游戏,最后扇出一串谁也看不懂的密文!😜
5.DES步骤表
步骤 | 操作 | 说明 |
---|---|---|
初始置换(IP 置换) | 对 64 位明文进行置换 | 根据 IP 置换表重新排列明文的位顺序 |
密钥处理 | 生成子密钥 | 初始 64 位密钥经 PC-1 置换、移位、PC-2 置换等操作,生成 16 轮子密钥 |
轮函数运算 | 16 轮迭代 | 每轮中,将数据分为左右两部分,右侧进行扩展变换、与子密钥异或、S 盒替代、P 盒置换,再与左侧异或,然后左右交换 |
最终置换(IP⁻¹ 置换) | 对运算结果置换 | 根据 IP⁻¹ 置换表重新排列位顺序,得到 64 位密文 |
扩展变换(E 盒) | 将 32 位数据扩展为 48 位 | 通过特定规则扩展数据位数 |
S 盒替代 | 48 位数据经 S 盒处理 | 将 48 位数据分成 8 个 6 位组,每个组通过对应的 S 盒进行替代操作,输出 32 位 |
P 盒置换 | 对 S 盒输出进行置换 | 根据 P 盒置换表对 32 位数据重新排列 |
DES加解密算法具体python代码
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
# DES加密函数
def des_encrypt(key, data):
# 1. 创建DES对象,密钥需要8字节
cipher = DES.new(key, DES.MODE_CBC)
# 2. 对数据进行填充,使其符合DES的块大小(8字节)
padded_data = pad(data.encode('utf-8'), DES.block_size)
# 3. 执行加密
ciphertext = cipher.encrypt(padded_data)
# 返回加密后的密文与初始化向量
return cipher.iv, ciphertext
# DES解密函数
def des_decrypt(key, iv, ciphertext):
# 1. 创建DES对象,使用相同的密钥和IV
cipher = DES.new(key, DES.MODE_CBC, iv)
# 2. 解密数据
padded_data = cipher.decrypt(ciphertext)
# 3. 去除填充,得到原始明文
plaintext = unpad(padded_data, DES.block_size).decode('utf-8')
return plaintext
# 示例密钥(DES要求密钥长度为8字节)
key = get_random_bytes(8) # 随机生成8字节密钥
print(f"密钥: {key.hex()}")
# 示例数据
data = "Hello, DES!"
# 加密
iv, ciphertext = des_encrypt(key, data)
print(f"密文: {ciphertext.hex()}")
# 解密
decrypted_data = des_decrypt(key, iv, ciphertext)
print(f"解密后的数据: {decrypted_data}")
三:总结
流密码:流密码将明文数据按位或按字节进行加密,通常使用伪随机字节流(密钥流)与明文进行逐位异或操作。流密码的加解密过程相同,密钥流是根据密钥和初始化向量生成的。流密码的优势是加密速度较快,适用于处理长数据流,如实时通信和视频流等。但流密码容易受到密钥管理不当等因素的影响,如RC4就是一种典型的流密码。
分组密码:分组密码将明文分成固定大小的块(如128位),每个块独立加密。常见的分组密码包括DES、AES等。分组密码的加密算法有多种模式,如ECB、CBC等,决定了如何处理多个数据块之间的关系。分组密码通常较为安全,但处理方式相对复杂,适合加密固定大小的批量数据,如文件加密等。
两者各有优缺点,流密码适合实时性强的场合,而分组密码适合高安全性需求的环境。
(本文介绍现代密码的一小部分,后续将介绍其他。如果你对此感兴趣请关注)
(需要源代码联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)