国密SM9算法C++实现之一:算法简介

SM9算法C++实现系列目录:

国密SM9算法C++实现之一:算法简介

SM9标识密码算法是由国密局发布的一种IBE(Identity-Based Encryption)算法。IBE算法以用户的身份标识作为公钥,不依赖于数字证书。国密SM9算法标准包括5个文档,分别为:
《GMT 0044-2016 SM9标识密码算法:第1部分 总则》
《GMT 0044-2016 SM9标识密码算法:第2部分 数字签名算法》
《GMT 0044-2016 SM9标识密码算法:第3部分 密钥交换协议》
《GMT 0044-2016 SM9标识密码算法:第4部分 密钥封装机制和公钥加密算法》
《GMT 0044-2016 SM9标识密码算法:第5部分 参数定义》

曲线参数

SM9是基于256位的BN椭圆曲线的,使用素域 F p Fp Fp 和有限域 F p 2 Fp^2 Fp2,双线性对使用R-ate。曲线参数主要包括:

  • 椭圆曲线方程 y 2 = x 3 + b y^2 = x^3 + b y2=x3+b
  • 方程参数b:05
  • 参数t
    60000000 0058F98A
  • 基域特征q
    B6400000 02A3A6F1 D603AB4F F58EC745 21F2934B 1A7AEEDB E56F9B27 E351457D
  • 群的阶N
    B6400000 02A3A6F1 D603AB4F F58EC744 49F2934B 18EA8BEE E56EE19C D69ECF25
  • 余因子cf:1
  • 群1 的生成元P1 = (xp1 , yp1)
    坐标xp1:
    93DE051D 62BF718F F5ED0704 487D01D6 E1E40869 09DC3280 E8C4E481 7C66DDDD
    坐标yp1:
    21FE8DDA 4F21E607 63106512 5C395BBC 1C1C00CB FA602435 0C464CD7 0A3EA616
  • 群2 的生成元P2 = (xp2, yp2)
    坐标xp2:
    (85AEF3D0 78640C98 597B6027 B441A01F F1DD2C19 0F5E93C4 54806C11 D8806141 ,
    37227552 92130B08 D2AAB97F D34EC120 EE265948 D19C17AB F9B7213B AF82D65B )
    坐标yp2:
    (17509B09 2E845C12 66BA0D26 2CBEE6ED 0736A96F A347C8BD 856DC76B 84EBEB96 ,
    A7CF28D5 19BE3DA6 5F317015 3D278FF2 47EFBA98 A71A0811 6215BBA5 C999A7C7 )

详细参数可参考国密局SM9文档。

SM9算法主要包括密钥部分部分和算法部分。

  • 密钥部分:包括主密钥对(公钥和私钥)和用户私钥
  • 算法部分:包括签名验签算法、密钥封装解封算法、加密解密算法和密钥交换算法

密钥部分

SM9算法的密钥由KGC(密钥生成中心)产生,主要包括KGC的主密钥对和用户的私钥。
主密钥对分为签名主密钥对加密主密钥对

  • 签名主密钥对:其私钥是一个在[1,N-1]范围内的随机数;公钥是G2群的基点P2的倍点,倍数为私钥。
  • 加密主密钥对:其私钥是一个在[1,N-1]范围内的随机数;公钥是G1群的基点P1的倍点,倍数为私钥。

主密钥对的公私钥用在不同场景,其中主私钥仅用于计算用户私钥;主公钥则由KGC公开并用在其他部分。同时,签名主公钥仅用于签名和验签算法;加密主公钥则用于密钥封装、加密和密钥交换中。

用户私钥由KGC产生,包括签名私钥和加密私钥。

  • 签名私钥:是G1群的基点P1的倍点。签名私钥仅用于签名中
  • 加密私钥:是G2群的基点P2的倍点。加密私钥用于密钥解封、解密和密钥交换中私钥

KGC使用主私钥和用户身份标识(以下简称ID)生成用户的私钥。

算法部分

SM9算法包括签名验签、密钥封装解封、加密解密和密钥交换四大部分。

  • 签名算法:使用签名主公钥和签名者的签名私钥给数据签名
  • 验签算法:使用签名主公钥和签名者ID验证签名
  • 密钥封装算法:使用加密主公钥和密钥解封者(使用对称密钥的另一方)ID封装一个对称密钥
  • 密钥解封算法:使用加密主公钥和密钥解封者ID解出封装了的对称密钥
  • 加密算法:使用加密主公钥和解密者ID加密数据
  • 解密算法:使用解密者的加密私钥和解密者ID解密数据
  • 密钥交换算法:密钥交换双方使用加密主公钥、自己的加密私钥和双方的ID协商出一个共享密钥

用户身份标识符:ID

总结上述描述,可见在SM9算法中的用户身份标识ID主要用于用于私钥生成、验签、密钥封装解封、加密解密封和密钥交换。各部分的ID描述如下:

  • 私钥生成:ID是私钥属主的ID
  • 验签:ID是签名者的ID
  • 密钥封装解封:ID是解封者的ID
  • 加密解密:ID是解密者的ID
  • 密钥交换:发起方和响应方都需要自己的ID和对方的ID

SM9算法的简介就介绍到这里,具体的算法描述和数学理论课参考SM9算法标准,以及后续文章。

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
要用Java实现国密SM9算法,可以使用Bouncy Castle密码库,该库已经提供了SM9算法实现。以下是一个简单的示例代码: ```java import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.engines.SM4Engine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.crypto.signers.SM2SignerUsingSM3; import org.bouncycastle.crypto.signers.SM2SignerUsingSM3WithID; import org.bouncycastle.crypto.signers.SM2SignerUsingSM3WithRecovery; import org.bouncycastle.crypto.signers.SM2SignerUsingSM3WithRecoveryAndID; import org.bouncycastle.crypto.signers.SM2VerifierUsingSM3; import org.bouncycastle.crypto.signers.SM2VerifierUsingSM3WithID; import org.bouncycastle.crypto.signers.SM2VerifierUsingSM3WithRecovery; import org.bouncycastle.crypto.signers.SM2VerifierUsingSM3WithRecoveryAndID; import org.bouncycastle.crypto.signers.SM3Signer; import org.bouncycastle.crypto.signers.SM3SignerUsingSM2; import org.bouncycastle.crypto.signers.SM3SignerUsingSM2WithID; import org.bouncycastle.crypto.signers.SM3SignerUsingSM2WithRecovery; import org.bouncycastle.crypto.signers.SM3SignerUsingSM2WithRecoveryAndID; import org.bouncycastle.crypto.signers.SM3VerifierUsingSM2; import org.bouncycastle.crypto.signers.SM3VerifierUsingSM2WithID; import org.bouncycastle.crypto.signers.SM3VerifierUsingSM2WithRecovery; import org.bouncycastle.crypto.signers.SM3VerifierUsingSM2WithRecoveryAndID; import org.bouncycastle.crypto.signers.SM4Signer; import org.bouncycastle.crypto.signers.SM4SignerUsingSM2; import org.bouncycastle.crypto.signers.SM4SignerUsingSM2WithID; import org.bouncycastle.crypto.signers.SM4SignerUsingSM2WithRecovery; import org.bouncycastle.crypto.signers.SM4SignerUsingSM2WithRecoveryAndID; import org.bouncycastle.crypto.signers.SM4VerifierUsingSM2; import org.bouncycastle.crypto.signers.SM4VerifierUsingSM2WithID; import org.bouncycastle.crypto.signers.SM4VerifierUsingSM2WithRecovery; import org.bouncycastle.crypto.signers.SM4VerifierUsingSM2WithRecoveryAndID; import org.bouncycastle.crypto.sm9.*; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.PublicKeyFactory; import org.bouncycastle.util.encoders.Hex; import java.io.IOException; import java.math.BigInteger; import java.security.SecureRandom; public class SM9Demo { public static void main(String[] args) throws Exception { // 生成SM9算法的参数 SM9CurveParameters curveParams = SM9Curve.getParametersByName("sm9p256v1"); SM9PrivateKeyParameters privateKey = null; SM9PublicKeyParameters publicKey = null; SecureRandom random = new SecureRandom(); // 生成密钥对 SM9KeyPairGenerator keyPairGenerator = new SM9KeyPairGenerator(); keyPairGenerator.init(new ParametersWithRandom(curveParams, random)); SM9KeyPair keyPair = keyPairGenerator.generateKeyPair(); privateKey = (SM9PrivateKeyParameters) keyPair.getPrivate(); publicKey = (SM9PublicKeyParameters) keyPair.getPublic(); // SM9签名 SM9Signer signer = new SM9Signer(); signer.init(true, new SM9SignParameters(privateKey.getUid())); byte[] message = "Hello, world!".getBytes(); signer.update(message, 0, message.length); byte[] signature = signer.generateSignature(); // SM9验签 signer.init(false, new SM9SignParameters(publicKey.getUid())); signer.update(message, 0, message.length); boolean result = signer.verifySignature(signature); System.out.println("SM9 signature verification result: " + result); } } ``` 在上面的代码中,我们使用Bouncy Castle密码库生成SM9参数、密钥对,进行SM9签名和验签。注意,在进行SM9签名和验签时,需要使用正确的参数和密钥。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值