对称加密和非对称加密该用哪个?AES、RSA 与摩斯密码

2026-10-15约 9 分钟加密解密涉及 6 个工具

选错加密方式不会报错,只会让数据悄悄变得不安全。AES 是对称加密、RSA 是非对称加密,两者性能差几个数量级,实际系统里它们配合使用,而不是二选一。

核心要点
  • AES 是对称加密,加解密用同一把密钥,速度比 RSA 快几个数量级,适合加密任意长度的数据
  • RSA 是非对称加密,公钥加密只能用私钥解密;密钥长度决定单次可加密的数据量,2048 位密钥上限约 190 字节
  • 实际系统用 RSA 加密 AES 密钥、用 AES 加密正文,这就是混合加密,HTTPS 的 TLS 握手是同一个思路
  • 密钥和 IV 都不能重复使用:相同密钥加相同 IV 会让相同明文产生相同密文,直接暴露数据的规律
  • DES 的有效密钥只有 56 位,新系统不应再用;它的正确用途是解析历史遗留数据
  • 摩斯密码是公开的编码规则,任何人都能查表还原,它只提供可读性转换,不提供任何机密性

#对称加密和非对称加密的区别只有一句话

对称加密加解密用同一把密钥,非对称加密用一对密钥:公钥加密、私钥解密。 这个差别决定了它们的速度、可加密长度和适用场景。

对比项对称加密(AES)非对称加密(RSA)
密钥一把,双方共享一对,公钥公开、私钥保密
速度快,适合大数据量慢,通常慢数千倍
可加密长度任意长度受密钥长度限制
主要用途加密数据本身传递密钥、数字签名
代表算法AES-128/256、DESRSA-2048/4096

用 AES / DES 加解密 处理一段长文本几乎瞬间完成,而同样的内容交给 RSA 会明显变慢且很快触到长度上限 —— 这就是两者必须分工的原因。

#AES 该选哪种模式

新数据一律用 AES-GCM,它在加密的同时校验完整性;只有需要兼容旧接口时才用 CBC。

AES / DES 加解密 支持下面这几种组合:

模式自带完整性校验什么时候用
AES-128-CBC否兼容旧接口,需要另做一次校验
AES-256-CBC否同上,密钥更长
AES-GCM是推荐,篡改会让解密直接失败
DES-CBC否只用于解析历史数据

CBC 有一个已知弱点:攻击者翻转密文里的某个字节,可以让解密出的明文对应位置发生可预测的变化。GCM 会对密文算出认证标签,数据被动过就校验不通过。

注意

DES 的有效密钥长度只有 56 位,也就是约 7.2×10^16 种组合,专用硬件可以在数天内穷举完。「能解开」不等于「安全」,看到 DES 只应该出现在解析历史数据的场景里。

#密钥和 IV 为什么不能复用

因为相同的密钥加相同的 IV 加相同的明文,会产生完全相同的密文 —— 攻击者不需要解密就能看出两条记录内容一致。

IV 复用的后果在格式固定的数据上最明显:

  • 每天加密一份结构相同的报表时,相同字段会输出相同的密文块
  • 取值分布、重复记录条数这些信息会直接泄露
  • 若明文的取值可枚举(例如只有几个状态值),攻击者可以直接构造对照表

所以正确做法是每次加密都换一个 IV,并把 IV 与密文一起保存。IV 不需要保密,只需要唯一,CBC 模式额外要求不可预测:

存储格式:[ IV(16 字节)][ 密文 ]
加密:生成随机 IV -> 用 IV + 密钥加密 -> 保存 IV 与密文
解密:读出前 16 字节作为 IV -> 用 IV + 密钥解密
要点

CBC 的 IV 必须是不可预测的随机值,GCM 的 IV 必须每次唯一。 GCM 下重复使用同一个 IV 会直接泄露认证密钥,后果比 CBC 更严重。这也是 AES / DES 加解密 在 IV 留空时自动生成随机值的原因 —— 手填一个固定的「1234567890123456」是常见的错误用法。

#RSA 只能加密比密钥短的数据

RSA 单次能加密的数据量由密钥长度决定:2048 位密钥上限约 190 字节,4096 位上限约 446 字节,超一个字节就会报错。

密钥长度单次加密上限(OAEP + SHA-256)说明
2048 位190 字节目前可接受的最低强度
3072 位318 字节安全边际更高
4096 位446 字节生成与计算更慢

上限来自公式:密钥字节数 − 2 × 哈希长度 − 2。2048 位密钥是 256 字节,SHA-256 的哈希长度是 32 字节,256 − 64 − 2 = 190。

正因为如此,实际用法不是「用 RSA 加密数据」,而是「用 RSA 加密一把 AES 密钥,再用 AES 加密数据」。一把 AES-256 密钥只有 32 字节,RSA 处理它绰绰有余。

#公钥和私钥的方向不能搞反

记住两个方向就够了:公钥加密、私钥解密;私钥签名、公钥验签。

反过来的「私钥加密、公钥解密」在数学上可以做,但公钥是公开的,任何人都能解开,所以它不提供机密性,只在数字签名场景里使用。

你想做什么用哪把密钥
让别人给你发加密数据对方用你的公钥加密
解开收到的数据你用私钥解密
证明一条消息确实来自你你用私钥签名
验证签名的真实性其他任何人用你的公钥验签

用 RSA 公私钥加密 可以生成 2048/3072/4096 位的密钥对,也能粘贴外部 PEM 格式的公钥或私钥导入,长文本会自动分段处理。

需要长期使用的密钥建议在本地生成:

Shell
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
注意

在线工具只适合验证流程和调试。生产环境的私钥不应该经过任何网站,包括本站。

#摩斯密码不是加密

摩斯密码是一套完全公开的编码规则,任何人都能查表还原,它不提供任何机密性。

判断标准只有一条:需要密钥才能还原的是加密,不需要密钥的是编码。 对照一下就清楚了:

方式需要密钥性质
AES / RSA是加密
摩斯密码否编码
Base64否编码
哈希否(且不可逆)单向摘要

用 摩斯密码 转换文本与摩斯码,单词之间用 / 分隔:

SOS    -> ... --- ...
HELLO  -> .... . .-.. .-.. ---
说明

哈希也不属于加密。MD5 加密 和 SHA 系列哈希 都是单向的,无法从摘要还原原文,用途是校验完整性而不是保密;其中 MD5 已经不适合用于安全场景。

#什么时候该用哪个工具

你想做的事用哪个说明
加密一段文本或文件AES / DES 加解密AES-128/256-CBC、AES-GCM、DES-CBC
生成密钥对、加密少量数据RSA 公私钥加密2048/3072/4096 位,支持 PEM 导入导出
校验文件有没有被改动SHA 系列哈希单向、不可逆
生成短摘要或做简单校验MD5 加密已不适合用于安全场景
把二进制转成文本再传输Base64 编码解码编码不是加密,任何人都能解开
转换摩斯码摩斯密码编码练习与趣味转换

#常见问题

#已经有 AES 了,为什么还需要 RSA?

因为 AES 需要双方共享同一把密钥,而「怎么把密钥安全地交给对方」本身就是难题。RSA 解决了这一步:公钥可以公开传输,私钥不离开本机,对方用公钥加密的 AES 密钥只有你能解开。两者是配合关系,不是替代关系。

#AES 和 RSA 哪个更安全?

在正确使用的前提下两者都足够安全,差别在适用场景。AES-256 的密钥空间是 2^256,目前没有可行的穷举方法;RSA-2048 的安全性建立在大整数分解难题上。真正导致泄露的几乎都是用法错误,比如 IV 重复使用、密钥硬编码在代码里、或者用了不带完整性校验的模式。

#密钥和 IV 有什么区别?

密钥必须保密,IV 不需要保密但必须每次唯一,CBC 还额外要求它不可预测。IV 的作用是让同一把密钥加密同样的明文时产生不同的密文。存储时通常把 IV 明文放在密文前面,解密时先取出 IV 再解数据。

#为什么 RSA 加密长文本会失败?

RSA-OAEP 单次能加密的长度是「密钥字节数 − 2 × 哈希长度 − 2」。2048 位密钥配 SHA-256 时只有 190 字节,多一个字节就报错。RSA 公私钥加密 会自动把长文本分段处理,但更正确的做法是用 RSA 加密一个 AES 密钥,正文交给 AES。

#摩斯密码能用来加密吗?

不能。摩斯码的对照表完全公开,在线查一下就能还原,它和 Base64、URL 编码属于同一类:只改变表示形式,不提供机密性。需要密钥才能还原的是加密,不需要密钥的是编码,这条判断标准对所有编码方式都适用。

本文提到的工具

相关文章