SM2 算法介绍
SM2算法 是中国国家密码管理局(OSCCA)基于椭圆曲线密码学(ECC, Elliptic Curve Cryptography)设计的 公钥密码算法。它于 2010 年成为中国国家标准,主要用于数字签名、加密和密钥交换。SM2算法被广泛应用于密码学领域,尤其是在金融、政务和安全通信等场景中。
SM2算法简介
SM2 是一种 基于椭圆曲线的公钥密码算法,提供以下核心功能:
- 数字签名:用于验证消息的来源和完整性。
- 公钥加密:实现安全数据传输。
- 密钥交换:用于双方安全协商共享密钥。
与其他椭圆曲线密码算法(如 ECDSA、ECDH)相比,SM2 在算法设计上针对某些攻击场景做了优化,并且增加了一些额外的安全性检查。
SM2算法的关键特点
-
安全性高:
- 基于椭圆曲线离散对数问题(ECDLP),其难度等价于 RSA 的整数分解问题,但密钥长度更短,安全性更高。
- 提供对抗特定攻击(如选择密文攻击)的机制。
-
效率高:
- 与 RSA 相比,SM2 的密钥更短,运算速度更快,适合资源受限的设备(如智能卡和嵌入式设备)。
-
符合国家标准:
- 是中国的国家标准,标准号为 GB/T 32918-2016。
-
支持多功能:
- 支持数字签名、公钥加密和密钥交换,功能全面。
SM2算法的数学基础
SM2基于椭圆曲线密码学,其核心依赖于以下数学概念:
-
椭圆曲线方程:
- SM2使用的椭圆曲线为:
[
y^2 = x^3 + ax + b , \pmod{p}
]
其中,( p ) 是素数,( a ) 和 ( b ) 是曲线参数,必须满足 ( 4a^3 + 27b^2 \neq 0 )(确保曲线是非奇异的)。
- SM2使用的椭圆曲线为:
-
椭圆曲线点运算:
- 点加法和点乘法是椭圆曲线密码学的基础操作:
- 点加法:给定曲线上的两点 ( P ) 和 ( Q ),计算 ( P + Q )。
- 点乘法:给定曲线上的点 ( P ) 和整数 ( k ),计算 ( k \cdot P )。
- 点加法和点乘法是椭圆曲线密码学的基础操作:
-
椭圆曲线离散对数问题(ECDLP):
- 给定曲线上的点 ( P ) 和 ( Q = k \cdot P ),找到整数 ( k ) 是一个计算上非常困难的问题。
- SM2 的安全性依赖于此问题的难解性。
SM2算法的三大功能
1. 数字签名
SM2的数字签名用于验证消息的完整性和来源,过程分为两个部分:签名生成 和 签名验证。
签名生成:
- 输入私钥 ( d )、消息 ( M ) 和随机数 ( k )。
- 计算消息哈希 ( e = H(Z || M) ),其中:
- ( Z ) 是用户标识符的杂凑值(结合了用户公钥等信息)。
- ( H ) 是 SM3 哈希函数。
- 计算椭圆曲线点 ( k \cdot G = (x_1, y_1) ),取 ( r = (e + x_1) \mod n )。
- 计算 ( s = ((1 + d)^{-1} \cdot (k - r \cdot d)) \mod n )。
- 签名为 ( (r, s) )。
签名验证:
- 输入公钥 ( P )、消息 ( M ) 和签名 ( (r, s) )。
- 计算消息哈希 ( e = H(Z || M) )。
- 计算椭圆曲线点:
[
t = (r + s) \mod n, \quad (x_2, y_2) = s \cdot G + t \cdot P
] - 验证:
[
r \stackrel{?}{=} (e + x_2) \mod n
]
如果相等,则签名有效。
2. 公钥加密
SM2公钥加密用于安全传输数据,过程分为:加密 和 解密。
加密过程:
- 输入消息 ( M )、接收方公钥 ( P ) 和随机数 ( k )。
- 计算椭圆曲线点 ( k \cdot G = (x_1, y_1) ) 和 ( k \cdot P = (x_2, y_2) )。
- 使用 ( x_2, y_2 ) 作为密钥生成种子,计算共享密钥 ( t = KDF(x_2 || y_2, klen) )。
- 计算密文:
[
C = (x_1, y_1, C_2 = M \oplus t, C_3 = H(x_2 || M || y_2))
]
解密过程:
- 输入密文 ( C = (x_1, y_1, C_2, C_3) ) 和私钥 ( d )。
- 计算椭圆曲线点 ( d \cdot (x_1, y_1) = (x_2, y_2) )。
- 使用 ( x_2, y_2 ) 计算共享密钥 ( t = KDF(x_2 || y_2, klen) )。
- 解密消息:
[
M = C_2 \oplus t
] - 验证 ( C_3 \stackrel{?}{=} H(x_2 || M || y_2) )。
3. 密钥交换
SM2密钥交换允许两方协商一个共享的会话密钥,过程分为两轮通信。
第一轮:
- 双方生成各自的临时私钥 ( r_A, r_B ) 和临时公钥 ( R_A, R_B )。
- 双方交换临时公钥。
第二轮:
- 双方计算共享密钥:
- ( U_A = r_A \cdot R_B + r_A \cdot P_B )。
- ( U_B = r_B \cdot R_A + r_B \cdot P_A )。
- 使用 ( U_A ) 或 ( U_B ) 生成会话密钥。
与其他公钥算法对比
特性 | SM2 | RSA | ECDSA |
---|---|---|---|
安全性 | 高,基于椭圆曲线难题 | 高,基于大整数分解 | 高,基于椭圆曲线难题 |
密钥长度 | 较短(256 位曲线) | 长(2048 位或更长) | 较短(256 位曲线) |
效率 | 高 | 较低 | 高 |
用途 | 国密应用、签名、加密 | 广泛用于签名、加密 | 主要用于签名 |
应用场景
- 金融行业:
- 数字证书、在线支付、电子签章等。
- 政府系统:
- 政务系统中的身份认证与安全通信。
- 物联网:
- 嵌入式设备中的安全数据传输。
- 区块链:
- 数字签名与交易验证。
SM2 验签功能 C语言移植参考
https://github.com/chenpei97/sm2-stm32
验签网址参考
https://const.net.cn/tool/sm2/verify/
使用代码中的数据进行验签示例
总结
SM2 是中国国家标准的公钥密码算法,基于椭圆曲线密码学,具有高安全性、高效率和多功能的特点。它在数字签名、公钥加密和密钥交换方面表现优异,并被广泛应用于金融、政务和物联网等高安全性场景中。