一、算法体系概述
SM算法(Commercial Cryptography SM Algorithms)是由中国国家密码管理局制定并推广的商用密码标准体系,包含非对称加密(SM2)、哈希算法(SM3)、对称加密(SM4)三大核心组件,构成完整的密码学解决方案。该体系采用自主可控的密码学设计,满足GB/T 32905-2016等国家标准,在金融、政务、物联网等领域具有强制合规要求。
二、SM2椭圆曲线公钥算法
2.1 数学基础
采用256位素域椭圆曲线,标准曲线参数为:
python
p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
Gx = 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
Gy = 0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
2.2 密钥生成
python
import secrets
from sm2 import *
private_key = secrets.randbelow(n) # 生成区间[1, n-1]的随机整数
public_key = point_mult(private_key, G) # 计算公钥Q = d * G
2.3 加密/签名流程
- 加密采用C1C3C2结构:C1(曲线点坐标) || C3(SM3哈希) || C2(密文)
- 签名使用改进的ECDSA方案,防止随机数重用攻击
三、SM3密码杂凑算法
3.1 算法结构
- 输入分组:512位
- 输出长度:256位
- 迭代结构:Merkle-Damgård
- 压缩函数:64轮非线性处理
3.2 处理流程
c
void sm3_compress(uint32_t state[8], const uint8_t block[64]) {
uint32_t W[68], W1[64];
// 消息扩展
for(int j=0; j<16; j++)
W[j] = load_big_endian(block + j*4);
for(int j=16; j<68; j++)
W[j] = P1(W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j-13],7) ^ W[j-6];
// 压缩函数迭代
for(int j=0; j<64; j++) {
SS1 = ROTL((ROTL(A,12) + E + ROTL(T_j,j)),7);
SS2 = SS1 ^ ROTL(A,12);
TT1 = FF_j(A,B,C) + D + SS2 + W1[j];
TT2 = GG_j(E,F,G) + H + SS1 + W[j];
D = C; C = ROTL(B,9); B = A; A = TT1;
H = G; G = ROTL(F,19); F = E; E = P0(TT2);
}
}
四、SM4分组密码算法
4.1 算法参数
- 分组长度:128位
- 密钥长度:128位
- 轮数:32轮非平衡Feistel结构
- 非线性变换:8-bit S盒(固定置换表)
4.2 轮函数设计
python
def round_function(X, rk):
tau_input = X[1] ^ X[2] ^ X[3] ^ rk
tau_output = sbox(tau_input)
linear = (tau_output ^ (tau_output << 2) ^ (tau_output << 10) ^
(tau_output << 18) ^ (tau_output << 24)) & 0xFFFFFFFF
return X[0] ^ linear
# 密钥扩展算法采用递归结构
def key_expansion(MK):
FK = [0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc]
CK = generate_constant() # 32个固定常量
K = [MK[0]^FK[0], MK[1]^FK[1], MK[2]^FK[2], MK[3]^FK[3]]
for i in range(32):
rk = K[i+1] ^ K[i+2] ^ K[i+3] ^ CK[i]
rk = sbox(rk) ^ (sbox(rk) << 13) ^ (sbox(rk) << 23)
K.append(rk ^ K[i])
return K[4:36]
五、工程实现要点
5.1 安全实践
- 随机数质量:SM2签名需确保k值的密码学安全随机性
- 时序安全:实现抗侧信道攻击的等幂运算
c
// 固定时间椭圆曲线点乘算法
void point_mult_constant_time(Point *result, const BIGNUM *scalar, const Point *P) {
Point R = point_at_infinity();
for (int i = 254; i >= 0; i--) {
R = point_double(R);
Point T = point_add(R, P);
int bit = BN_is_bit_set(scalar, i);
R = point_select(bit, T, R);
}
*result = R;
}
5.2 性能优化
- SM4使用查表法加速轮函数
- SM3采用SIMD指令并行处理多个消息块
- SM2预计算加速签名验证
六、合规性要求
- 必须使用认证密码模块(如:SJK1926 PCI-E密码卡)
- 密钥管理系统需符合《GM/T 0054-2018》标准
- TLS协议需切换至国密套件(ECC_SM4_SM3)
七、典型应用架构
diff
+---------------------+
| 应用系统 |
+--------+------------+
| API调用
+--------v------------+
| 国密中间件 |
| - SM2证书管理 |
| - SM4数据加解密 |
| - SM3数字摘要 |
+--------+------------+
| 硬件调用
+--------v------------+
| 密码设备接口 |
| - 物理随机数生成 |
| - 密钥安全存储 |
+---------------------+
本技术指南应结合具体业务场景进行安全方案设计,在实现密码功能时需严格遵循国家密码管理局的相关规范要求,并通过指定机构的合规性检测。