对称、非对称、哈希——三种加密算法一篇讲透,附国密SM全家桶

你在网上买东西,填完信用卡号点「支付」的那一瞬间,你的卡号、密码、手机号这些信息会在互联网上裸奔吗?

不会。因为你的浏览器和服务器之间有一层加密——你输入的数据在被送到网络之前先被「打乱」了,只有目标服务器能「解开」。

但「打乱」和「解开」这件事,远没有听起来那么简单。实际上有三类完全不同的算法在背后干活,它们的思路截然不同,各有各的用武之地。

这三类就是:对称加密非对称加密哈希算法

先拉一张全景图

在开始细讲之前,先看一张大图,搞清楚这三者各自站在什么位置:

🔐 对称加密 Same key for lock & unlock 同一把钥匙 密钥 K 明文 密文 Hello x7K!@ AES · SM4 · ChaCha20 快如闪电,密钥需共享 🔑 非对称加密 Public key locks, Private key unlocks 公钥加密,私钥解密 公钥 📢 (人人可见) 私钥 🔒 (绝密) Hello #A1b RSA · ECC · SM2 安全便捷,但慢1000倍 🧬 哈希算法 One-way, fixed-size output 单向不可逆,定长输出 Hello World a591a6d40bf4204... 输入任意长度→输出固定长度 改一个字,结果全变 SHA-256 · SM3 · MD5 不可逆,指纹验证专用

好,有了这张图打底,我们一个一个来。

一、对称加密——同一把钥匙开门锁门

对称加密的思路简单到像你的家门钥匙:加锁和解锁用同一把钥匙。

流程就是:

  1. 你和我要通信
  2. 我们事先商量好一个密钥,比如「abc123」
  3. 你发「Hello」之前,拿这个密钥把「Hello」加密成乱七八糟的密文「x7K!@」
  4. 我收到「x7K!@」,用同样的密钥解密,还原成「Hello」
  5. 中间如果有人截获了「x7K!@」,他没有密钥,只能看到乱码

这就是整个对称加密的核心逻辑。下面这张图展示了数据是怎么「走」的:

👤 小明 持有密钥 K 🔑 abc123 👤 小红 持有密钥 K 🔑 abc123 AES 加密 Hello → x7K!@pQ AES 解密 x7K!@pQ → Hello

截获到 x7K!@pQ

👁 黑客:看不懂!

⚠ 但问题来了:密钥怎么安全地传给对方?

常见对称加密算法:

算法 密钥长度 特点 使用场景
AES 128/192/256位 全球标准,硬件加速 HTTPS、文件加密、WiFi
SM4 128位 中国国家标准,自主可控 政务、金融、关键基础设施
ChaCha20 256位 移动设备友好,快 TLS 1.3、Google HTTPS
DES/3DES 56/168位 已破解,别用了 历史遗留系统

优点:快。快得离谱。AES-256在普通CPU上每秒能处理几百MB的数据。所有高清视频流、HTTPS数据,底层都是对称加密在干活。

致命弱点:密钥分发问题。你和小红要通信,你俩怎么事先安全地交换那个密钥?你总不能把密钥写在明信片上寄过去。这个问题的解法,就是接下来要讲的非对称加密。

二、非对称加密——两把不同的钥匙

非对称加密的思路完全不同:锁和钥匙不是同一把。

每个人有两把钥匙:

  • 公钥:可以给任何人,谁都看得见。用来「上锁」(加密)。
  • 私钥:绝对保密,只有自己知道。用来「开锁」(解密)。
👤 小明 📢 公钥:abc... (公开) 🔒 私钥:xyz... (保密) ← 把公钥发给小红 👤 小红 拿到小明的公钥 用公钥加密消息 → 发给小明

📢 公钥可以公开传输,截获了也没用

密文只有小明的私钥能解

关键魔法:公钥只能加密,不能解密。 小红用公钥加密的消息,公钥自己解不开——因为数学上,「乘大质数」容易,「分解大质数」几乎不可能。这就是RSA背后的「单向函数」思想。

常见非对称加密算法:

算法 安全基础 密钥长度 特点
RSA 大整数分解 2048/4096位 最老牌,最广泛,但慢
ECC (ECDSA) 椭圆曲线离散对数 256位 RSA同等安全,快且省
SM2 椭圆曲线(国密曲线) 256位 中国标准,SM2 ≈ ECC

优点:解决了密钥分发问题。公钥到处扔都行,私钥死守就好。

缺点:慢。比对称加密慢大约1000倍。所以实际使用中没人拿RSA去加密大文件——都用它做「密钥交换」,建立起安全通道后切换到对称加密干活。

三、哈希算法——只进不出的单向门

哈希算法跟前两个完全不同,它自己就是一类。

核心特性:

  1. 输入任意长度,输出固定长度。一句话和一部电影,输出都是256位(SHA-256)
  2. 单向不可逆。给你哈希值,你算不出原始输入
  3. 雪崩效应。输入改一个bit,输出面目全非
"Hello World" 11 字节 "Hello World!" 12 字节 (加了个!) SHA-256 输入任意→输出256位 a591a6d40bf4204 04a011733cfb7b1 90d62c65bf0bcda 7f83b1657ff1fc5 3b8dc8b3d451d7b 9d51db72c40cbbc

⚠ 只多了一个"!",结果完全不同

实际用途 🔐 密码存储 📄 文件完整性校验 ⛓ 区块链工作量证明 破解难度 逆向破解 SHA-256: ≈ 暴力试 2²⁵⁶ 次 宇宙年龄都试不完

常见哈希算法:

算法 输出长度 安全性 用途
SHA-256 256位 安全 比特币、HTTPS证书、Git提交
SHA-3 可变 安全 新一代标准
SM3 256位 安全 中国标准,≈ SHA-256
MD5 128位 已破解,别用 历史上遗留

密码存储是哈希最典型的应用。网站不存你的密码明文,只存hash(密码+盐)。登录时把你输入的密码hash一下跟数据库比对,hash一致就放行。

四、三种算法怎么协同工作——以HTTPS为例

现实中这三种算法不打架,它们配合得天衣无缝。你每天访问HTTPS网站时,背后是这样的:

HTTPS 握手流程

① 非对称加密:密钥交换 服务器发公钥→浏览器生成临时密钥→公钥加密传给服务器 RSA / ECDHE / SM2 耗时:0.1秒 ② 对称加密:数据传输 双方都用这把临时密钥,AES加密所有后续通信 AES-256-GCM / SM4 全速传输 ③ 哈希:完整性校验 每个数据包附带HMAC哈希值,收方验算→确认数据未被篡改 SHA-256 / SM3 每个数据包都验 一句话总结

🔑 非对称:安全地传钥匙
慢但安全,只握手时用一次

🔐 对称:用钥匙加密数据
快如闪电,握手后全用它

🧬 哈希:验证数据没被改
单向指纹,改一bit就露馅

三种各取所长,缺一不可 非对称建通道 → 对称跑数据 → 哈希保完整

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 非对称加密 ✅ 解决密钥分发 ✅ 支持数字签名 ✅ 公钥可公开 ❌ 比对称慢1000倍 ❌ 密钥很长(RSA 2048位+) ❌ 量子计算可破RSA 代表:RSA, ECC, SM2 哈希算法 ✅ 单向不可逆 ✅ 定长输出 ✅ 雪崩效应 ❌ 不能加密/解密 ❌ MD5/SHA-1已破解 ❌ 彩虹表攻击(不加盐) 代表:SHA-256, SM3

一句话选择指南:

  • 要加密大文件/数据流? → 对称加密(AES / SM4)
  • 要安全地交换密钥或数字签名? → 非对称加密(ECDSA / SM2)
  • 要存储密码或校验文件完整性? → 哈希(SHA-256 / SM3)
  • 现实中? → 三个一起用,HTTPS就是标准答案

记住一个核心原则:没有哪个算法是万能的。它们各有各的短板,组合起来才无懈可击。

一名痴迷于计算机技术的学生~