SM2算法加密与解密过程

本文详细介绍了SM2加密算法的工作原理,包括椭圆曲线定义、密钥结构、加密和解密过程。SM2是中国国家密码局提出的基于椭圆曲线的非对称算法,具有密钥短、速度快、安全性高等优点。加密过程中,通过随机数与公钥计算c1、c2和c3,解密时利用私钥校验并还原数据。SM3摘要在加密和解密过程中用于校验数据的完整性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SM2 加密与解密过程概述

1.SM2算法简介

SM2算法是中国国家密码局推出的国产化算法,是基于椭圆曲线的非对称算法,相对于RSA算法,SM2具有密钥更小,运算速度更快,相同密钥长度下具有更高安全性等优势。

1.1SM2 椭圆曲线定义

SM2算法定义了两条椭圆曲线,一条基于F§上的素域曲线,一条基于F(2^m)上的拓域曲线,目前使用最多的曲线为素域曲线,本文介绍的算法基于素域曲线上的运算,素域曲线方程定义如下:
y 2 − x 3 + a x + b y^2-x^3+ax+b y2x3+ax+b

1.2 SM2 曲线参数定义

SM2算法定义了5个默认参数,即有限域F§的规模p,椭圆曲线参数a,b,椭圆曲线的基点G(x,y),与G的阶n。

国密算法标准中给出了对应的默认值,默认值如下:

p:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
n:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
a:FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b:28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
Gx:32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
Gy:BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

牢记上面四个默认参数与一个基础点,在后面运算过程中会用到上面的所有参数。

1.2SM2 密钥结构定义

SM2作为非对称算法拥有公钥与私钥,对于SM2中公私钥的结构如下:

私钥:d 符合要求的32byte(256bit)随机数
公钥:(x,y),实际一个坐标点,依据私钥d计算所得

依据私钥计算公钥的逻辑不在本文介绍范围。

2.SM2 加密数据

SM2加密数据使用公钥(x,y)进行加密,加密结果为c1c3c2部分算法中定义为c1c2c3,下面介绍密文中各个结构实际含义:

c1: 随机数K与G(x,y)的多倍点运算结果,结果也是一个点,记录为(kx,ky)
c2: 实际密文值
c3:使用SM3对于 kx||data||ky的hash值,在解密时校验解密结果是否正确

2.1c1计算逻辑

在实际算法实现中,c1的运算逻辑如下:

c1 = k·G(x,y)

k是一个随机数,随机数的生成逻辑如下:

选取一个随机数k,使得随机的k的取值范围为[1,n-1],这块的n是1.2章节中提到的默认值

2.2c2计算逻辑

c2是真正的数据密文,计算逻辑如下:

c2 = 密钥流 (异或)data

密钥流的计算逻辑如下:

1. 复用计算c1时产生的随机数k
2. 计算 kpk(x,y),得到kpx,kpy
3. 根据data的长度与kpx,kpy生成与data等长的密钥流,用于c2的最终计算

整体密钥流计算采用KDF方法计算,KDF可以理解成根据输入的因子,产生期望长度的数据流,目前直流的KDF计算采用HASH方法。SM2中的KDF使用的是SM3摘要。

2.3 c3计算逻辑

c3是一个SM3的摘要值,作用是用于解密时校验解密出的原文数据的正确性,c3的计算逻辑如下:

c3 = HASH(kpx,data,kpy)

在解密时需要在解密出原文后计算HASH值做最后确认,确认一致后认定解密成功,不一致则解密失败。

3. SM2 解密数据

SM2的解密流程实际是根据c1计算出加密时使用的密钥流,使用密文数据与密钥流进行异或得到数据明文,后续在确认计算出的摘要值与密文中c3是否一致。

3.1 密钥流计算逻辑

1. 从密文中分离出 c1(x,y)
2. 使用私钥d与c1进行多倍点运算,得到计算结果 (cx,cy),d·c1(cx,cy)
3. 根据c2长度计算密钥流,KDF(cipherlen,cx,cy)

这里为什么私钥d与c1的运算结果等于k与G(x,y)运算结果,请参网上的其他帖子或数学证明过程,不在本文的讨论范围。

3.2 解密运算

上面我们得到了密钥流的中间结果,我们根据密钥流来计算明文:

原文 = 密钥流 (异或) 密文

3.3 解密校验

接下来我们计算解密后的摘要值与c3是否相等,计算流程如下:

1. 基于以上的运算结果的cx,cy与得到的原文
2. SM3(cx,计算得到的明文,cy)
3. 对比计算结果与c1,一致解密成功,不一致则解密失败
SM2公钥加密算法是一种基于椭圆曲线密码的公钥加密算法,由国密局发布。KDF(Key Derivation Function)是密钥派生函数,用于从明文或其他输入数据中生成密钥。在SM2算法中,KDF使用的是PBKDF2(Password-Based Key Derivation Function 2)算法SM2公钥加密算法的工作流程如下: 1. 选择一条椭圆曲线和基点G(一个大素数)。 2. 计算私钥d(一对大素数)。 3. 计算公钥Q = d * G。 4. 使用KDF(如PBKDF2)从密码和其他输入数据(如盐值salt)中派生出一个密钥。 5. 使用派生的密钥对消息进行加密。 以下是使用Python的cryptography库实现SM2公钥加密算法的示例代码: ```python from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC from cryptography.hazmat.backends import default_backend import os # 生成SM2密钥对 private_key = ec.generate_private_key(ec.SECP256R1(), default_backend()) public_key = private_key.public_key() # 定义密码和盐值 password = b"my_password" salt = os.urandom(16) # 使用PBKDF2派生密钥 kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=salt, iterations=100000, backend=default_backend() ) derived_key = kdf.derive(password) # 使用派生的密钥加密消息 message = b"Hello, SM2!" ciphertext = public_key.encrypt(message, derived_key, None) ``` 注意:在实际应用中,为了安全起见,建议使用硬件安全模块(HSM)或可信的第三方服务来生成和存储密钥。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值