SM2:公钥加密

国家标准全文公开系统:http://openstd.samr.gov.cn/

本文参考:http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=370AF152CB5CA4A377EB4D1B21DECAE0

系统参数

  • F q F_q Fq的描述
  • 椭圆曲线的两个定义元 a , b ∈ F q a,b \in F_q a,bFq
  • E ( F q ) E(F_q) E(Fq)的基点 G = ( x G , y G ) ≠ O G=(x_G,y_G) \not = O G=(xG,yG)=O,其中 x G , y G ∈ F q x_G,y_G \in F_q xG,yGFq
  • G G G的阶 n n n [ n ] G = O [n]G=O [n]G=O
  • 其他可选项,如 n n n的余因子 h : = # E ( F q ) n h:=\dfrac{\#E(F_q)}{n} h:=n#E(Fq)
  • 用户 B B B的密钥对:私钥 d B d_B dB,公钥 P B = [ d B ] G P_B = [d_B]G PB=[dB]G
  • 用户 A A A可以获得 P B P_B PB以及其他系统参数

辅助函数

  • 密码学杂凑函数,如 S M 3 SM3 SM3

  • 密钥派生算法:确定性算法,要用到密码学杂凑函数,从一个共享的秘密比特串中派生出密钥数据。在密钥协商过程中,密钥派生函数作用在密钥交换所获共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥数据。

    K D F ( Z , l e n ) KDF(Z,len) KDF(Z,len)

    输入:比特串 Z Z Z,整数 l e n len len

    输出: l e n len len比特的密钥数据

    • 初始化32比特计数器 c t = 0 x 00000001 ct=0x00000001 ct=0x00000001
    • 对于 i ∈ [ 1 , 2 , ⋯   , ⌈ l e n v ⌉ ] i \in [1,2,\cdots,\lceil \dfrac{len}{v} \rceil] i[1,2,,vlen]执行
      • K i = H ( Z ∥ c t ) K_i = H(Z \| ct) Ki=H(Zct),这里 H H H是输出 v v v比特的哈希函数
      • c t = c t + 1 ct=ct+1 ct=ct+1,计数器自增
    • K ˉ = K 1 ∥ K 2 ∥ ⋯ ∥ K ⌈ l e n v ⌉ \bar K = K_1 \| K_2 \| \cdots \| K_{\lceil \frac{len}{v} \rceil} Kˉ=K1K2Kvlen
    • 截取 K ˉ \bar K Kˉ最左边的 l e n len len比特作为 K K K
  • 伪随机数生成器 P R G PRG PRG

公钥加密算法

  • 加密 E n c p k ( M ) Enc_{pk}(M) Encpk(M),其中明文 M M M l e n len len长的比特串

    B 1 B_1 B1:计算椭圆曲线点 S = [ h ] P B S = [h]P_B S=[h]PB,若 S = O S=O S=O则报错退出
    B 2 B_2 B2:使用 P R G PRG PRG得到 k ∈ [ 1 , n ) ∩ Z k \in [1,n) \cap Z k[1,n)Z
    B 3 B_3 B3:计算椭圆曲线点 C 1 = [ k ] G = ( x 1 , y 1 ) C_1 = [k]G = (x_1,y_1) C1=[k]G=(x1,y1),转化为比特串
    B 4 B_4 B4:计算椭圆曲线点 C 2 = [ k ] P B = ( x 2 , y 2 ) C_2 = [k]P_B = (x_2,y_2) C2=[k]PB=(x2,y2),转化为比特串
    B 5 B_5 B5:计算 t = K D F ( x 2 ∥ y 2 , l e n ) t=KDF(x_2 \| y_2,len) t=KDF(x2y2,len),若 t = 0 t=0 t=0则重新生成 k k k
    B 6 B_6 B6:计算差分 C 3 = M ⊕ t C_3 = M \oplus t C3=Mt
    B 7 B_7 B7:计算摘要 C 4 = H ( x 2 ∥ M ∥ y 2 ) C_4 = H(x_2 \| M \| y_2) C4=H(x2My2)
    B 8 B_8 B8:输出密文 C = C 1 ∥ C 4 ∥ C 3 = ( x 1 , y 1 ) ∥ H ( x 2 ∥ M ∥ y 2 ) ∥ M ⊕ t C = C_1 \| C_4 \| C_3 = (x_1,y_1) \| H(x_2 \| M \| y_2) \| M \oplus t C=C1C4C3=(x1,y1)H(x2My2)Mt

  • 解密 D e c s k ( C ) Dec_{sk}(C) Decsk(C),其中 C = C 1 ∥ C 4 ∥ C 3 C = C_1 \| C_4 \| C_3 C=C1C4C3 C 3 C_3 C3 l e n len len长比特串

    A 1 A_1 A1:取出点 C 1 C_1 C1,验证是否满足椭圆曲线方程,不满足则报错退出
    A 2 A_2 A2:计算椭圆曲线点 [ d B ] C 1 = ( x 2 , y 2 ) [d_B]C_1 = (x_2,y_2) [dB]C1=(x2,y2),转化为比特串
    A 3 A_3 A3:计算 t = K D F ( x 2 ∥ y 2 , l e n ) t=KDF(x_2 \| y_2,len) t=KDF(x2y2,len),若 t = 0 t=0 t=0则报错退出
    A 4 A_4 A4:计算差分 M ′ = C 3 ⊕ t M'=C_3 \oplus t M=C3t
    A 5 A_5 A5:计算摘要 C 4 ′ = H ( x 2 ∥ M ′ ∥ y 2 ) C_4' = H(x_2 \| M' \| y_2) C4=H(x2My2)
    A 6 A_6 A6:验证是否满足 C 4 ′ = C 4 C_4' = C_4 C4=C4,不满足则报错退出
    A 7 A_7 A7:输出 l e n len len长比特串 M ′ M' M

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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)或可信的第三方服务来生成和存储密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值