密码学基础回顾:对称加密与非对称加密、哈希函数与数字签名、PKI与数字证书、随机数生成原理

各位同学,咱们今天聊点基础但极其重要的东西。密码学基础,说白了就是国密算法的“内功心法”。你招式练得再花哨,内功不行,一上战场就露馅。我在做安全架构评审时,见过太多“算法用对了,但配套机制全错”的案例。所以这一章,咱们把地基夯实。

一、对称加密 vs 非对称加密:一把钥匙和两把钥匙的区别

加密这事儿,核心就两个流派:对称加密和非对称加密。名字听着玄乎,其实道理很简单。

对称加密,就是加密和解密用同一把钥匙。你想想看,就像你家大门,一把钥匙既能锁也能开。优点是快,特别快。SM4、AES 都属于这类。缺点是钥匙怎么安全地交给对方?这是个千古难题。

核心要点:对称加密适合加密大量数据,但密钥分发是最大的安全短板。

非对称加密,则是一对钥匙:公钥和私钥。公钥公开,私钥自己藏好。你用我的公钥加密,只有我的私钥能解开。SM2、RSA 都是这个路子。优点是解决了密钥分发问题,缺点是慢,比对称加密慢好几个数量级。

我在项目中遇到过一位刚入行的同事,非要用 SM2 加密一个 100MB 的视频文件。结果呢?加密跑了快两分钟,直接被业务方投诉了。嗯,这里要注意:实际工程中,都是“混合加密”——用非对称加密协商一个临时对称密钥,再用对称密钥加密业务数据。HTTPS 就是这么干的。

特性 对称加密 非对称加密
密钥数量 1 个(共享密钥) 2 个(公钥 + 私钥)
速度 快(硬件加速可达 Gbps) 慢(通常为 Kbps 级别)
密钥分发 困难,需要安全通道 容易,公钥可公开
典型算法 SM4, AES, DES SM2, RSA, ECC
主要用途 数据加密 密钥交换、数字签名

二、哈希函数与数字签名:完整性 + 不可否认性

哈希函数,江湖人称“摘要算法”。它能把任意长度的数据,压缩成一个固定长度的“指纹”。SM3、SHA-256 都是这个路子。特点就三个:定长、单向、防碰撞。

什么叫单向?就是你从指纹反推出原文,理论上不可能。我见过有人问“SM3 能不能解密”,这问题就像问“绞肉机能不能把肉馅变回整块肉”——方向就错了。

个人习惯:我在做数据完整性校验时,一定会在哈希计算前加一个“盐值”(salt),防止彩虹表攻击。国密算法里虽然没有强制要求,但工程上这是基本素养。

数字签名,则是哈希函数和非对称加密的“联姻”。流程很简单:

  1. 发送方对原文做哈希,得到摘要。
  2. 用自己的私钥加密这个摘要,生成签名。
  3. 接收方用发送方的公钥解密签名,得到摘要 A。
  4. 接收方自己对原文做哈希,得到摘要 B。
  5. 对比 A 和 B,一致则签名有效。

为什么能防抵赖?因为只有发送方有自己的私钥。他签了名,就赖不掉。我曾经帮一家金融机构做电子合同系统,对方坚持只用哈希校验。我说:“哈希只能保证数据没被改,但保证不了是谁发的。万一对方事后不认账,你拿什么举证?”后来他们老老实实上了 SM2 数字签名。

避坑指南:我曾经见过一个项目,签名时直接把原文拼在签名后面一起发,接收方也没验证签名和原文的对应关系。结果被中间人篡改了原文,签名校验居然还过了。记住:签名必须覆盖原文的哈希,而不是原文本身。

三、公钥基础设施(PKI)与数字证书:信任的传递

好,现在你有了公钥,但你怎么确定这个公钥真的是对方的?万一中间人给你一个假公钥呢?这就是 PKI 要解决的问题。

PKI 的核心是数字证书。证书是什么?说白了,就是一个由权威机构(CA)签名的“身份证”。里面包含了:

  • 持有者的身份信息(姓名、组织、域名等)
  • 持有者的公钥
  • 证书的有效期
  • CA 的数字签名

你拿到一张证书,用 CA 的公钥验证一下签名,就知道这个证书是不是真的。CA 的公钥哪里来?从更上层的 CA 证书里来。这就形成了一条证书链,一直追溯到根证书。根证书是自签名的,也就是“我证明我自己”。

我个人习惯,在国密改造项目中,一定要求客户部署双证书体系:一张签名证书(用于身份认证和签名),一张加密证书(用于密钥协商和数据加密)。这两张证书的密钥对必须分开,不能复用。为什么?因为签名私钥理论上永远不出设备,而加密私钥可能需要备份——万一加密证书丢了,你还能恢复数据。但签名证书丢了,你只能重新签发,历史签名全部作废。

核心要点:PKI 解决的是“公钥属于谁”的信任问题。没有 PKI,非对称加密就是空中楼阁。

四、随机数生成原理:密码学的“熵”之源

最后聊一个容易被忽视但极其重要的东西——随机数。你想想看,密钥生成、初始化向量、签名时的随机数 k,哪个环节离得开随机数?如果随机数能被预测,整个密码系统就形同虚设。

随机数分两种:

  • 伪随机数生成器(PRNG):用算法生成的,看起来随机,但本质是确定的。给定相同的种子,输出完全相同。适合做模拟、测试,但绝对不能用于密码学。
  • 真随机数生成器(TRNG):基于物理熵源(如热噪声、量子效应、鼠标移动、磁盘寻道时间等)。这才是密码学要的。

国密标准里,SM2 签名算法对随机数 k 的要求极高。如果 k 有规律或者被重复使用,私钥可以直接被算出来。这不是理论攻击,是真实发生过的事。2010 年索尼 PS3 的 ECDSA 签名被破解,就是因为索尼用了固定的 k 值。

避坑指南:我曾经审计过一个嵌入式设备,它的随机数生成器直接用了 C 语言的 rand() 函数。结果每次重启设备,生成的密钥对都一样。攻击者只要拿到一台设备,就能预测所有设备的密钥。嗯,这个漏洞评级直接给了“严重”。

工程上,我建议的做法是:

  1. 优先使用硬件 TRNG(如 Intel 的 RDRAND 指令、国密密码芯片的物理噪声源)。
  2. 如果没有硬件支持,用操作系统提供的 /dev/urandom(Linux)或 CryptGenRandom(Windows)。
  3. 绝对不要自己写随机数算法,绝对不要用 time() 做种子。

知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作密码学基础的“地图”。

密码学基础核心逻辑图 密码学基础核心逻辑图 密码学基础 对称加密 非对称加密 哈希函数 随机数生成 密钥:1个 速度:快 典型:SM4, AES 密钥:2个(公/私) 速度:慢 典型:SM2, RSA 定长、单向 防碰撞 典型:SM3, SHA-256 TRNG vs PRNG 物理熵源 不可预测 数字签名 = 哈希 + 非对称加密 PKI + 数字证书(信任链) 国密算法工程落地

这张图从密码学基础出发,分支出四大支柱,再组合成数字签名,最终通过 PKI 构建信任体系,落到国密工程。你每次做设计时,都可以拿这张图来对照:我的方案里,这四个支柱都覆盖了吗?信任链完整吗?随机数可靠吗?

好了,这一章的内容就到这里。基础打牢了,后面讲 SM2、SM3、SM4 的具体实现时,你才能理解为什么这么设计,以及工程上要注意什么。