4、签名算法入门:对称加密与非对称加密、RSA算法原理、ECC算法简介、数字签名概念

好,咱们进入第四讲。这一章是理论课,但我会尽量讲得接地气一些。

做OTA升级,签名是核心中的核心。你想想看,如果升级包没有签名,那跟在大街上随便捡个U盘就往电脑里插有什么区别?我早年做物联网设备时,就见过有人直接把固件明文扔到服务器上,结果被中间人篡改,设备批量变砖。嗯,从那以后,我对签名这件事就特别较真。

4.1 对称加密 vs 非对称加密

先聊加密。加密这事儿,说白了就是给数据上锁。

对称加密,就像你用一把钥匙锁门,也用同一把钥匙开门。加密和解密用的是同一个密钥。典型算法有AES、DES、SM4。

  • 优点:速度快,适合加密大量数据。
  • 缺点:密钥怎么安全地传给对方?这是个死穴。

我在项目中遇到过一个问题:设备端和服务器都用AES加密通信,但密钥是硬编码在固件里的。结果有人反编译固件,直接把密钥扒出来了。你说这加密还有啥意义?

非对称加密,则是一对钥匙——公钥和私钥。公钥可以公开,私钥自己藏好。用公钥加密的数据,只有私钥能解开;反过来,用私钥签名的数据,公钥可以验证。

  • 优点:解决了密钥分发问题。
  • 缺点:慢,比对称加密慢几百倍。

所以实际工程中,往往是混合使用:用非对称加密来传递对称密钥,再用对称密钥加密实际数据。这叫"混合加密",我建议你在设计OTA方案时也这么干。

核心区别一句话总结:

对称加密——一把钥匙开一把锁。

非对称加密——一把锁配两把钥匙,一把公开,一把私藏。

4.2 RSA算法原理

RSA是目前最经典的非对称加密算法。名字来自三位发明者:Rivest、Shamir、Adleman。

它的数学原理其实不复杂,核心就一句话:大数分解很难

具体流程是这样的:

  1. 选两个大质数 p 和 q,计算 n = p × q。
  2. 计算欧拉函数 φ(n) = (p-1)(q-1)。
  3. 选一个公钥指数 e,通常取 65537。
  4. 计算私钥 d,满足 e × d ≡ 1 (mod φ(n))。

公钥就是 (n, e),私钥就是 (n, d)。

加密时:c = m^e mod n(m是明文,c是密文)

解密时:m = c^d mod n

你可能会问:为什么公钥加密后只有私钥能解?因为要算出 d,你得知道 φ(n),而 φ(n) 需要知道 p 和 q。但 n 公开了,想从 n 反推出 p 和 q,就是大数分解问题。目前1024位以下的RSA已经被认为不安全了,我建议你用2048位或4096位。

避坑指南:

我曾经见过有人直接用OpenSSL生成RSA密钥对,但没注意随机数种子质量。结果生成的密钥有规律可循,被攻击者猜出来了。记住:随机数一定要用硬件真随机数发生器,别用伪随机。

4.3 ECC算法简介

ECC(椭圆曲线密码学)是RSA的替代方案。它用更短的密钥长度,提供同等级别的安全强度。

举个例子:

  • RSA 2048位 ≈ ECC 224位
  • RSA 3072位 ≈ ECC 256位
  • RSA 15360位 ≈ ECC 512位

你看,ECC的密钥长度短得多。这对嵌入式设备来说太重要了——存储空间和计算资源都有限。

ECC的数学原理基于椭圆曲线上的离散对数问题。具体来说,就是给定椭圆曲线上的两个点 G 和 Q,很难找到整数 k 使得 Q = kG。这就是ECC的安全基础。

我个人的习惯是:在资源受限的MCU上,优先用ECC。比如STM32系列,硬件加速ECC运算,签名验证速度比RSA快很多。

注意:

ECC虽然好,但曲线选择要谨慎。不要自己随便定义曲线参数,直接用标准曲线,比如secp256r1(也叫P-256)或SM2国密曲线。我见过有人自己造曲线,结果有安全漏洞,被攻破了。

4.4 数字签名概念

好了,前面铺垫了这么多,终于到正题了——数字签名。

数字签名不是加密,它的目的是防篡改防抵赖

流程是这样的:

  1. 发送方对原始数据做哈希运算,得到摘要。
  2. 用私钥对摘要加密,得到签名。
  3. 把原始数据和签名一起发给接收方。
  4. 接收方用公钥解密签名,得到摘要A。
  5. 接收方对原始数据做同样的哈希运算,得到摘要B。
  6. 比较A和B,如果一致,说明数据没被篡改,且确实是发送方签的。

你想想看,为什么先哈希再签名?因为非对称加密慢啊。哈希一下,把任意长度的数据变成固定长度的摘要(比如256位),再对摘要签名,效率高得多。

在OTA升级中,签名流程是这样的:

# 生成签名(在服务器端)
openssl dgst -sha256 -sign private.pem -out firmware.sig firmware.bin

# 验证签名(在设备端)
openssl dgst -sha256 -verify public.pem -signature firmware.sig firmware.bin

设备端验证通过后,才允许升级。否则直接拒绝。

关键点:

公钥一定要安全地存储在设备中。我建议把公钥烧录在一次性可编程存储器(OTP)里,或者用安全芯片保护。如果公钥被篡改,那签名验证就形同虚设了。

最后说一句:数字签名不是万能的。它只能保证数据在传输过程中没被改,但保证不了原始数据本身是安全的。比如你签了一个有后门的固件,签名验证通过了,设备照样会中招。所以,代码审查和供应链安全同样重要。

这一章的内容就到这里。下一章我们实战——用OpenSSL生成密钥对,并制作第一个签名升级包。