加密引擎基础:对称加密、非对称加密与哈希算法
各位同学,今天我们来啃一块硬骨头——加密引擎的核心算法。说实话,我刚入行那会儿,看到AES、RSA、SHA这些缩写就头大。后来在工业安全芯片项目里踩了无数坑,才慢慢摸清它们的脾气。今天我就把这几年的实战心得,掰开了揉碎了讲给你们听。
一、对称加密:AES与SM4
对称加密,说白了就是加密和解密用同一把钥匙。就像你家的门锁,用钥匙锁上,再用同一把钥匙打开。工业场景里,最常用的就是AES和SM4。
AES(高级加密标准)
AES是目前全球应用最广的对称加密算法。我最早接触它是在一个物联网网关项目里,当时需要加密传感器数据。AES支持128、192、256位密钥,工业上128位就够用,但安全等级要求高的场合,我建议直接用256位。
核心参数:
- 分组长度:128位(固定)
- 密钥长度:128/192/256位
- 轮数:10/12/14轮(对应不同密钥长度)
- 工作模式:ECB、CBC、CTR、GCM等
这里有个坑,我必须要说。ECB模式虽然简单,但千万别用在工业场景里。为什么?因为同样的明文块会生成同样的密文块,攻击者能看出数据模式。我曾经在一个老项目里看到过这种用法,后来被安全审计直接打了回来。
// AES-128 CBC模式加密示例(伪代码)
void aes_cbc_encrypt(uint8_t *plaintext, uint8_t *key, uint8_t *iv) {
uint8_t block[16];
// 初始化向量与第一块明文异或
xor_blocks(block, plaintext, iv);
// 执行AES加密
aes_encrypt_block(block, key);
// 输出密文,同时作为下一轮的IV
memcpy(output, block, 16);
memcpy(iv, block, 16);
}
SM4(国密算法)
SM4是中国的国家标准对称加密算法。说实话,它的结构和AES不太一样,但安全强度相当。我在做电力行业项目时,客户明确要求必须用SM4。它的分组长度也是128位,密钥长度128位,轮数32轮。
| 特性 | AES | SM4 |
|---|---|---|
| 分组长度 | 128位 | 128位 |
| 密钥长度 | 128/192/256位 | 128位 |
| 轮数 | 10/12/14 | 32 |
| S盒规模 | 8×8 | 8×8 |
| 硬件实现 | 成熟,面积小 | 稍大,但可控 |
我个人习惯在芯片设计时,把AES和SM4的硬件引擎都做进去。这样既能兼容国际标准,又能满足国内合规要求。嗯,这里要注意,SM4的S盒实现和AES不同,不能复用,得单独设计。
二、非对称加密:RSA与SM2
非对称加密,就是公钥加密、私钥解密。你想想看,这解决了什么问题?密钥分发!对称加密最大的痛点就是怎么安全地把密钥传给对方,非对称加密直接把这个难题绕过去了。
RSA算法
RSA基于大整数分解难题。我记得第一次在芯片上实现RSA时,被那个模幂运算折磨得够呛。1024位的RSA已经不安全了,现在工业上至少用2048位,我建议直接上4096位。
避坑指南:
我曾经在某个项目中,为了追求性能,用了小公钥指数(e=3)。结果被攻击者利用Coppersmith攻击破解了部分密文。从那以后,我坚持用65537作为公钥指数,虽然慢一点,但安全多了。
// RSA密钥生成核心步骤
1. 选择两个大素数 p, q
2. 计算 n = p × q
3. 计算 φ(n) = (p-1)(q-1)
4. 选择 e,满足 1 < e < φ(n),且 gcd(e, φ(n)) = 1
5. 计算 d ≡ e⁻¹ mod φ(n)
6. 公钥:(n, e),私钥:(n, d)
SM2(国密椭圆曲线)
SM2基于椭圆曲线密码学,比RSA效率高得多。同样安全强度下,SM2的密钥长度只有256位,而RSA需要3072位。我在做车载安全芯片时,就用的SM2,因为芯片资源有限,RSA太占地方了。
说白了,SM2就是中国版的ECC。它的曲线参数是国密局指定的,不能随便改。我建议你们在做国密合规项目时,直接用硬件IP核,别自己写软件实现,容易出问题。
| 对比项 | RSA-2048 | SM2 |
|---|---|---|
| 密钥长度 | 2048位 | 256位 |
| 签名速度 | 慢 | 快 |
| 加密速度 | 慢 | 中等 |
| 硬件面积 | 大 | 小 |
| 安全强度 | 112位 | 128位 |
三、哈希算法:SHA与SM3
哈希算法,就是把任意长度的数据,压缩成固定长度的摘要。它不可逆,主要用于完整性校验和数字签名。我经常跟团队说,哈希算法是加密引擎的「指纹仪」。
SHA系列
SHA-1已经不安全了,别用。现在工业上主流是SHA-256和SHA-3。SHA-256输出256位摘要,SHA-3是新一代标准,结构完全不同。我个人更倾向SHA-256,因为硬件实现成熟,而且大多数安全芯片都原生支持。
实战技巧:
在做固件升级校验时,我习惯先用SHA-256计算固件哈希,再用SM2签名。这样既保证了完整性,又验证了来源。千万别只用哈希,攻击者可以替换固件和哈希值一起伪造。
SM3(国密哈希)
SM3输出256位摘要,和SHA-256安全强度相当。它的结构基于Merkle-Damgård,但压缩函数不同。我在做金融安全芯片时,SM3是必选项。说实话,SM3的硬件实现比SHA-256稍微复杂一点,但差距不大。
// SM3压缩函数核心(简化版)
void sm3_compress(uint32_t *w, uint32_t *v) {
uint32_t ss1, ss2, tt1, tt2;
for (int j = 0; j < 64; j++) {
ss1 = ROTL_LEFT((ROTL_LEFT(v[0], 12) + v[4] + ROTL_LEFT(Tj(j), j)), 7);
ss2 = ss1 ^ ROTL_LEFT(v[0], 12);
tt1 = FFj(j, v[0], v[1], v[2]) + v[3] + ss2 + w[j];
tt2 = GGj(j, v[4], v[5], v[6]) + v[7] + ss1 + w[j];
// 更新寄存器
...
}
}
四、三种加密算法的对比总结
好了,三种算法都讲完了。我画了一张图,帮你们理清它们之间的关系和适用场景。
最后,我给你们一个实战建议。在工业安全芯片里,别只依赖一种算法。我设计的芯片通常包含:AES-256 + SM4(对称)、RSA-4096 + SM2(非对称)、SHA-256 + SM3(哈希)。这样无论客户要求国际标准还是国密标准,都能直接支持。
嗯,加密引擎这块内容不少,但核心就三点:对称加密管数据加密,非对称加密管密钥分发,哈希算法管完整性校验。把这三点吃透了,后面做安全协议就轻松多了。