对称、非对称、哈希——三种加密算法一篇讲透,附国密SM全家桶
你在网上买东西,填完信用卡号点「支付」的那一瞬间,你的卡号、密码、手机号这些信息会在互联网上裸奔吗?
不会。因为你的浏览器和服务器之间有一层加密——你输入的数据在被送到网络之前先被「打乱」了,只有目标服务器能「解开」。
但「打乱」和「解开」这件事,远没有听起来那么简单。实际上有三类完全不同的算法在背后干活,它们的思路截然不同,各有各的用武之地。
这三类就是:对称加密、非对称加密、哈希算法。
先拉一张全景图
在开始细讲之前,先看一张大图,搞清楚这三者各自站在什么位置:
好,有了这张图打底,我们一个一个来。
一、对称加密——同一把钥匙开门锁门
对称加密的思路简单到像你的家门钥匙:加锁和解锁用同一把钥匙。
流程就是:
- 你和我要通信
- 我们事先商量好一个密钥,比如「abc123」
- 你发「Hello」之前,拿这个密钥把「Hello」加密成乱七八糟的密文「x7K!@」
- 我收到「x7K!@」,用同样的密钥解密,还原成「Hello」
- 中间如果有人截获了「x7K!@」,他没有密钥,只能看到乱码
这就是整个对称加密的核心逻辑。下面这张图展示了数据是怎么「走」的:
常见对称加密算法:
| 算法 | 密钥长度 | 特点 | 使用场景 |
|---|---|---|---|
| AES | 128/192/256位 | 全球标准,硬件加速 | HTTPS、文件加密、WiFi |
| SM4 | 128位 | 中国国家标准,自主可控 | 政务、金融、关键基础设施 |
| ChaCha20 | 256位 | 移动设备友好,快 | TLS 1.3、Google HTTPS |
| DES/3DES | 56/168位 | 已破解,别用了 | 历史遗留系统 |
优点:快。快得离谱。AES-256在普通CPU上每秒能处理几百MB的数据。所有高清视频流、HTTPS数据,底层都是对称加密在干活。
致命弱点:密钥分发问题。你和小红要通信,你俩怎么事先安全地交换那个密钥?你总不能把密钥写在明信片上寄过去。这个问题的解法,就是接下来要讲的非对称加密。
二、非对称加密——两把不同的钥匙
非对称加密的思路完全不同:锁和钥匙不是同一把。
每个人有两把钥匙:
- 公钥:可以给任何人,谁都看得见。用来「上锁」(加密)。
- 私钥:绝对保密,只有自己知道。用来「开锁」(解密)。
关键魔法:公钥只能加密,不能解密。 小红用公钥加密的消息,公钥自己解不开——因为数学上,「乘大质数」容易,「分解大质数」几乎不可能。这就是RSA背后的「单向函数」思想。
常见非对称加密算法:
| 算法 | 安全基础 | 密钥长度 | 特点 |
|---|---|---|---|
| RSA | 大整数分解 | 2048/4096位 | 最老牌,最广泛,但慢 |
| ECC (ECDSA) | 椭圆曲线离散对数 | 256位 | RSA同等安全,快且省 |
| SM2 | 椭圆曲线(国密曲线) | 256位 | 中国标准,SM2 ≈ ECC |
优点:解决了密钥分发问题。公钥到处扔都行,私钥死守就好。
缺点:慢。比对称加密慢大约1000倍。所以实际使用中没人拿RSA去加密大文件——都用它做「密钥交换」,建立起安全通道后切换到对称加密干活。
三、哈希算法——只进不出的单向门
哈希算法跟前两个完全不同,它自己就是一类。
核心特性:
- 输入任意长度,输出固定长度。一句话和一部电影,输出都是256位(SHA-256)
- 单向不可逆。给你哈希值,你算不出原始输入
- 雪崩效应。输入改一个bit,输出面目全非
常见哈希算法:
| 算法 | 输出长度 | 安全性 | 用途 |
|---|---|---|---|
| SHA-256 | 256位 | 安全 | 比特币、HTTPS证书、Git提交 |
| SHA-3 | 可变 | 安全 | 新一代标准 |
| SM3 | 256位 | 安全 | 中国标准,≈ SHA-256 |
| MD5 | 128位 | 已破解,别用 | 历史上遗留 |
密码存储是哈希最典型的应用。网站不存你的密码明文,只存hash(密码+盐)。登录时把你输入的密码hash一下跟数据库比对,hash一致就放行。
四、三种算法怎么协同工作——以HTTPS为例
现实中这三种算法不打架,它们配合得天衣无缝。你每天访问HTTPS网站时,背后是这样的:
HTTPS的核心策略就是各取所长:非对称解决信任问题(谁是谁),对称解决效率问题(天天用的数据传输),哈希解决完整性问题(数据有没有被改过)。
五、重点讲讲国密算法SM系列
国内的关键基础设施(政务、金融、能源、通信)近年来在大力推进密码算法国产化,核心就是SM系列国密算法。这件事的背景很简单:RSA、AES这些算法虽然安全,但算法本身是国外的,如果哪天出了后门或者被制裁禁用了,整个国家的加密体系都会受影响。
SM系列三条主线:
| 算法 | 对标 | 类别 | 密钥/输出长度 | 状态 |
|---|---|---|---|---|
| SM2 | ECC | 非对称加密 | 256位 | 国家标准,已广泛部署 |
| SM3 | SHA-256 | 哈希 | 256位 | 国家标准 |
| SM4 | AES | 对称加密 | 128位 | 国家标准 |
SM2 用的是国密椭圆曲线(SM2曲线),跟国际上常用的secp256r1不同。曲线是自己设计的,公式不一样,这就意味着——如果国外的椭圆曲线被发现有后门,SM2不受影响。
SM3 的算法结构跟SHA-256很像(都是Merkle-Damgård结构),但压缩函数的内部细节不同。输出也是256位。性能上跟SHA-256同一个级别。
SM4 是分组对称加密算法,128位密钥。在国内金融系统已经大规模使用——银行U盾里跑的就是SM2+SM3+SM4的组合。
国内外企业的使用情况大概是这样:
| 领域 | 国内典型方案 | 国际典型方案 |
|---|---|---|
| 浏览器HTTPS | 大部分用RSA+AES;政务系统已推SM2+SM4 | RSA/ECDSA + AES |
| 金融支付 | 银联:SM2+SM3+SM4全链国密 | Visa/Mastercard:3DES→AES |
| 云计算 | 阿里云KMS、华为云都支持SM系列 | AWS KMS:AES为主 |
| 区块链 | 长安链全面支持SM2/SM3 | 比特币/以太坊:ECDSA+SHA-256 |
| 即时通讯 | 微信/钉钉已部署国密通道 | WhatsApp:Signal协议(ECC+AES) |
| 物联网 | 国网智能电表:SM1/SM2/SM3 | 海外:AES-CCM |
趋势很明确:国内关键基础设施在全面向国密迁移。但这不是「替代」而是「双轨」——系统同时支持国密和国际算法,根据场景选择。
写代码的时候,如果你用Python,可以这样调用国密:
# 需要安装: pip install gmssl
from gmssl import sm2, sm3, sm4
# SM2 非对称加密
sm2_crypt = sm2.CryptSM2(private_key=None, public_key=None)
# 生成密钥对,加密解密...
# SM3 哈希
hash_value = sm3.sm3_hash(b"Hello World")
print(hash_value) # 256位哈希值
# SM4 对称加密
sm4_crypt = sm4.CryptSM4()
sm4_crypt.set_key(b"16bytes_key_here", sm4.SM4_ENCRYPT)
cipher = sm4_crypt.crypt_ecb(b"Hello World")
六、各算法的优缺点总结
一句话选择指南:
- 要加密大文件/数据流? → 对称加密(AES / SM4)
- 要安全地交换密钥或数字签名? → 非对称加密(ECDSA / SM2)
- 要存储密码或校验文件完整性? → 哈希(SHA-256 / SM3)
- 现实中? → 三个一起用,HTTPS就是标准答案
记住一个核心原则:没有哪个算法是万能的。它们各有各的短板,组合起来才无懈可击。