为什么要用混合加密系统?
基于 非对称加密技术 解决了密钥配送问题,但是非对称加密有两个问题:
- 非对称加密 处理速度不如 对称加密;
 - 无法抵御 中间人攻击;(指攻击者与通讯的两端分别建立独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制)
 
采用混合加密系统,就能完美解决问题1,但无法解决问题2,需要用到证书(证书不是本文的重点)。
当然,混合加密系统,还有如下好处:
- 高效性与性能优化
- 对称加密处理数据:对称加密(如AES)计算速度快,适合加密大量数据(如文件、通信内容)。
 - 非对称加密管理密钥:非对称加密(如RSA、ECC)用于安全交换对称密钥,避免了对称加密的密钥分发问题。
 - 资源消耗低:仅在密钥交换阶段使用计算密集的非对称加密,后续通信由高效的对称加密完成,节省计算资源。
 
 
- 安全的密钥分发
- 解决密钥交换难题:对称加密的密钥通过非对称加密传输(如用接收方的公钥加密),确保即使通信被监听,攻击者也无法获取密钥。
 - 前向保密(Forward Secrecy):若使用临时密钥(如Diffie-Hellman的临时密钥对),即使长期私钥泄露,历史会话仍无法解密。
 
 
- 灵活性与兼容性
- 适应不同场景:可灵活选择对称和非对称算法(如AES+ECC或ChaCha20+RSA),满足不同协议(TLS、PGP)的需求。
 - 支持多重功能:非对称加密还可用于数字签名、身份认证等,与对称加密无缝结合。
 
 
- 增强的安全性
- 双重防护:攻击者需同时破解对称密钥和非对称私钥,难度极高。
 - 动态密钥管理:每次会话生成唯一的对称密钥(会话密钥),减少长期密钥泄露风险。
 
 
- 扩展性与易用性
- 大规模部署:公钥基础设施(PKI)支持多用户环境,非对称加密的公钥可公开分发,无需预共享密钥。
 - 移动设备友好:对称加密的低计算需求适合手机、IoT设备等资源受限的环境。
 
 
- 前向保密(Perfect Forward Secrecy, PFS)
- 通过临时密钥交换机制(如ECDHE),即使服务器私钥未来被泄露,过去的会话仍无法被解密,显著提升长期安全性。
 
 
总结:
混合密码系统结合了对称加密和非对称加密两者的优势,在安全性、效率和实用性之间实现了平衡。
实际应用示例:
- HTTPS/TLS:客户端生成随机对称密钥,用服务器的公钥加密后传输,后续通信使用对称加密。
 - PGP/GPG:用接收方的公钥加密对称会话密钥,再使用该会话密钥加密邮件内容。
 - SSH:非对称加密验证身份后,协商对称密钥用于数据传输。
 
加密流程
- 生成随机数做对称密钥;
 - 用对称密钥加密提高速度;
 - 用公钥加密保护对称密钥;
 

解密流程
- 用私钥解密对称密钥;
 - 用对称密钥解密密文;
 

Reference
https://blog.csdn.net/Octopus21/article/details/109335708
一个前后端的加密过程
加密流程时序图
# 背景知识
|| 是拼接符号,案例如下:
如果a是101,b是110,
那么h(a||b)=h(101110)。
sequenceDiagram
note right of Client: 加密流程
Client->>Servers: Get SM2 Public Key
Servers->>Client: Return SM2 Public Key
Client->>Client: Create SM4 Key
Client->>Client: ciphertext_1 = SM4 Encrypt(SM4 Key, plaintext_1)
Client->>Client: ciphertext_2 = SM2 Encrypt(SM2 Public Key, SM4 Key||plaintext_1)
Client->>Servers: ciphertext_2
note right of Client: 解密流程
Servers->>Servers:SM4 Key||ciphertext_1 = SM2 Decrypt(SM2 Private Key, ciphertext_2)
Servers->>Servers: plaintext = SM4 Decrypt(SM4 Key, ciphertext_1)
Servers->>Servers: plaintext_2 = Handle( plaintext )
Servers->>Servers: ciphertext_3 = SM4 Encrypt(SM4 Key, plaintext_2)
Servers->>Client: Return ciphertext_3
Client->>Client: plaintext_2 = SM4 Decrypt(SM4 Key, ciphertext_3)
步骤
- 
客户端请求一个公钥,存储在JS代理里,服务器端保存私钥;

gJ.apiUrl = cJ, gJ.interceptors.request.use((async e => ("post" === e.method && e.data && "json" === e.headers.contentType && (e.headers["Content-Type"] = "application/json;charset=UTF-8"), mJ.includes(e.url) && (pJ = btoa(uJ.sm4.encrypt(JSON.stringify(e.data), dJ)), fJ = btoa(uJ.sm2.doEncrypt(dJ, "049e2ed7ff95ecb3de4ca313dddf3956ead1386840ea752b4ccb227f4ffb361c37ed53eb30989bc88de0c56832fe8e251311f163518695221558cc114aff7cd0fa")), vJ = uJ.sm3(atob(pJ) + atob(fJ)), e.data = vJ + ":" + pJ + ":" + fJ),
 - 
每次客户端生成一个随机密钥,作SM4对称密钥(DEK),
使用公钥(CEK)作为 加密 对称密钥(DEK) = DEK的密文,
 - 
服务器使用私钥,解密出明文DEK, DEK 可以解密 DEK加密的密文 得到登录信息的明文。
 
                    
                
                
            
        
浙公网安备 33010602011771号