SM2 算法介绍

发布于:2024-12-21 ⋅ 阅读:(44) ⋅ 点赞:(0)

SM2算法 是中国国家密码管理局(OSCCA)基于椭圆曲线密码学(ECC, Elliptic Curve Cryptography)设计的 公钥密码算法。它于 2010 年成为中国国家标准,主要用于数字签名、加密和密钥交换。SM2算法被广泛应用于密码学领域,尤其是在金融、政务和安全通信等场景中。


SM2算法简介

SM2 是一种 基于椭圆曲线的公钥密码算法,提供以下核心功能:

  1. 数字签名:用于验证消息的来源和完整性。
  2. 公钥加密:实现安全数据传输。
  3. 密钥交换:用于双方安全协商共享密钥。

与其他椭圆曲线密码算法(如 ECDSA、ECDH)相比,SM2 在算法设计上针对某些攻击场景做了优化,并且增加了一些额外的安全性检查。


SM2算法的关键特点

  1. 安全性高

    • 基于椭圆曲线离散对数问题(ECDLP),其难度等价于 RSA 的整数分解问题,但密钥长度更短,安全性更高。
    • 提供对抗特定攻击(如选择密文攻击)的机制。
  2. 效率高

    • 与 RSA 相比,SM2 的密钥更短,运算速度更快,适合资源受限的设备(如智能卡和嵌入式设备)。
  3. 符合国家标准

    • 是中国的国家标准,标准号为 GB/T 32918-2016
  4. 支持多功能

    • 支持数字签名、公钥加密和密钥交换,功能全面。

SM2算法的数学基础

SM2基于椭圆曲线密码学,其核心依赖于以下数学概念:

  1. 椭圆曲线方程

    • SM2使用的椭圆曲线为:
      [
      y^2 = x^3 + ax + b , \pmod{p}
      ]
      其中,( p ) 是素数,( a ) 和 ( b ) 是曲线参数,必须满足 ( 4a^3 + 27b^2 \neq 0 )(确保曲线是非奇异的)。
  2. 椭圆曲线点运算

    • 点加法和点乘法是椭圆曲线密码学的基础操作:
      • 点加法:给定曲线上的两点 ( P ) 和 ( Q ),计算 ( P + Q )。
      • 点乘法:给定曲线上的点 ( P ) 和整数 ( k ),计算 ( k \cdot P )。
  3. 椭圆曲线离散对数问题(ECDLP)

    • 给定曲线上的点 ( P ) 和 ( Q = k \cdot P ),找到整数 ( k ) 是一个计算上非常困难的问题。
    • SM2 的安全性依赖于此问题的难解性。

SM2算法的三大功能

1. 数字签名

SM2的数字签名用于验证消息的完整性和来源,过程分为两个部分:签名生成签名验证

签名生成
  1. 输入私钥 ( d )、消息 ( M ) 和随机数 ( k )。
  2. 计算消息哈希 ( e = H(Z || M) ),其中:
    • ( Z ) 是用户标识符的杂凑值(结合了用户公钥等信息)。
    • ( H ) 是 SM3 哈希函数。
  3. 计算椭圆曲线点 ( k \cdot G = (x_1, y_1) ),取 ( r = (e + x_1) \mod n )。
  4. 计算 ( s = ((1 + d)^{-1} \cdot (k - r \cdot d)) \mod n )。
  5. 签名为 ( (r, s) )。
签名验证
  1. 输入公钥 ( P )、消息 ( M ) 和签名 ( (r, s) )。
  2. 计算消息哈希 ( e = H(Z || M) )。
  3. 计算椭圆曲线点:
    [
    t = (r + s) \mod n, \quad (x_2, y_2) = s \cdot G + t \cdot P
    ]
  4. 验证:
    [
    r \stackrel{?}{=} (e + x_2) \mod n
    ]
    如果相等,则签名有效。

2. 公钥加密

SM2公钥加密用于安全传输数据,过程分为:加密解密

加密过程
  1. 输入消息 ( M )、接收方公钥 ( P ) 和随机数 ( k )。
  2. 计算椭圆曲线点 ( k \cdot G = (x_1, y_1) ) 和 ( k \cdot P = (x_2, y_2) )。
  3. 使用 ( x_2, y_2 ) 作为密钥生成种子,计算共享密钥 ( t = KDF(x_2 || y_2, klen) )。
  4. 计算密文:
    [
    C = (x_1, y_1, C_2 = M \oplus t, C_3 = H(x_2 || M || y_2))
    ]
解密过程
  1. 输入密文 ( C = (x_1, y_1, C_2, C_3) ) 和私钥 ( d )。
  2. 计算椭圆曲线点 ( d \cdot (x_1, y_1) = (x_2, y_2) )。
  3. 使用 ( x_2, y_2 ) 计算共享密钥 ( t = KDF(x_2 || y_2, klen) )。
  4. 解密消息:
    [
    M = C_2 \oplus t
    ]
  5. 验证 ( C_3 \stackrel{?}{=} H(x_2 || M || y_2) )。

3. 密钥交换

SM2密钥交换允许两方协商一个共享的会话密钥,过程分为两轮通信。

第一轮
  1. 双方生成各自的临时私钥 ( r_A, r_B ) 和临时公钥 ( R_A, R_B )。
  2. 双方交换临时公钥。
第二轮
  1. 双方计算共享密钥:
    • ( U_A = r_A \cdot R_B + r_A \cdot P_B )。
    • ( U_B = r_B \cdot R_A + r_B \cdot P_A )。
  2. 使用 ( U_A ) 或 ( U_B ) 生成会话密钥。

与其他公钥算法对比

特性 SM2 RSA ECDSA
安全性 高,基于椭圆曲线难题 高,基于大整数分解 高,基于椭圆曲线难题
密钥长度 较短(256 位曲线) 长(2048 位或更长) 较短(256 位曲线)
效率 较低
用途 国密应用、签名、加密 广泛用于签名、加密 主要用于签名

应用场景

  1. 金融行业
    • 数字证书、在线支付、电子签章等。
  2. 政府系统
    • 政务系统中的身份认证与安全通信。
  3. 物联网
    • 嵌入式设备中的安全数据传输。
  4. 区块链
    • 数字签名与交易验证。

SM2 验签功能 C语言移植参考

https://github.com/chenpei97/sm2-stm32

验签网址参考

https://const.net.cn/tool/sm2/verify/

使用代码中的数据进行验签示例
在这里插入图片描述

总结

SM2 是中国国家标准的公钥密码算法,基于椭圆曲线密码学,具有高安全性、高效率和多功能的特点。它在数字签名、公钥加密和密钥交换方面表现优异,并被广泛应用于金融、政务和物联网等高安全性场景中。


网站公告

今日签到

点亮在社区的每一天
去签到