加密算法选型:AES、SM4、国密与国际算法的对比

加密算法选型这件事,看着像技术选择,实际上是个博弈题。你在性能、安全、合规之间找平衡点,一步选错后面全是坑。我参与过好几个金融项目,选型阶段吵得最凶的就是用 AES 还是 SM4。今天咱们把这个话题彻底聊透。

国际算法:AES

AES 是目前全球应用最广的对称加密算法。说白了,它就是加密界的通用语言。金融行业里大量海外系统、跨境数据传输都依赖它。

我建议你先理解它的两个核心参数:密钥长度和工作模式。

  • 密钥长度:128、192、256 位。金融场景通常选 256 位,安全余量够大。
  • 工作模式:ECB、CBC、GCM。ECB 不安全,别用。CBC 通用但需要填充。GCM 带认证,我项目里首选。

GCM 模式自带认证标签,能防篡改。审计日志场景特别适合——既要加密,又要保证完整性。

# 用 PyCryptodome 实现 AES-GCM 加密
from Crypto.Cipher import AES
import os

key = os.urandom(32)  # 256 位密钥
nonce = os.urandom(12)
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
plaintext = b"这是一个加密的审计日志条目"
ciphertext, tag = cipher.encrypt_and_digest(plaintext)

print(f"密文: {ciphertext.hex()}")
print(f"认证标签: {tag.hex()}")

国密算法:SM4

SM4 是中国的国家密码标准,对标 AES。国内金融系统,尤其银行核心业务,现在几乎都要用 SM4。

我记得有个项目,客户明确要求“全栈国密”。开始团队还想着混用 AES 省点事,结果合规审查直接驳回。后来全部切到 SM4,反而顺畅了。

SM4 的特点很明确:

  • 密钥长度固定 128 位,分组长度 128 位。
  • 算法结构公开透明,安全性经过多年验证。
  • 国内硬件支持逐渐成熟,专用 SM4 芯片越来越多。

我曾经遇到一个大坑:SM4 在软件实现上比 AES 慢约 30%。如果系统 QPS 很高,一定要提前做压测。别等上线才发现 CPU 扛不住。

# 使用 gmssl 库实现 SM4-CBC 加密
from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT

key = b'\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10'
iv = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'

crypt_sm4 = CryptSM4()
crypt_sm4.set_key(key, SM4_ENCRYPT)
plaintext = b"审计日志敏感数据"
ciphertext = crypt_sm4.crypt_cbc(iv, plaintext)

print(f"SM4 密文: {ciphertext.hex()}")

选型对比:你该选哪个?

直接给结论:国内金融场景,优先 SM4。跨境业务或对接海外系统,才考虑 AES。当然,现实没那么。我做过一个折中方案——加密层抽象接口,底层实现同时支持 AES 和 SM4,通过配置文件切换。

维度 AES SM4
密钥长度 128/192/256 128
算法公开度 全球通用 国标 GB/T 32907
国内金融合规 部分场景受限 完全合规
硬件加速支持 广泛(AES-NI) 逐渐普及
软件性能 高 中等
生态成熟度 极高 国内较成熟

实战选型策略

我总结了一套实际的优先级判断逻辑,你想想看:

  1. 合规先行:先查监管要求。银行、证券行业通常强制 SM4。项目一开始就锁定合规红线。
  2. 性能底线:加密对数据库审计日志的影响不能超过 5%。硬件加速支持要作为硬指标。
  3. 密钥管理:AES 和 SM4 的密钥方案差异很大。SM4 的密钥长度固定,派生逻辑更简单,少出错。
  4. 改造成本:存量系统如果全是 AES,贸然全量迁移 SM4 风险太高。我通常建议分期灰度替换。

我的最终建议:新项目直接上 SM4,别给自己留隐患。老系统改造时,加密层加适配器模式,今天改 SM4,明天换 AES,都不影响业务。

下面这张图概括了选型时的核心决策路径:

加密算法选型决策流程 业务需求与合规要求 是否强制国密? SM4 优先 AES 可行(需评估) 跨境场景可混合部署 国内金融监管建议 SM4

看到这个流程没?合规是第一步。国内银行客户,直接走左分支。有海外数据同步需求的,右分支做兼容方案。其实说白了,选哪个不重要,重要的是你有一套完整的评估框架。

我再强调一次:不要试图用同一个密钥同时加密国际和国密算法。密钥是敏感资产,混用容易造成泄露。密钥管理系统最好独立设计。