sm2学习

        SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法,在我们国家商用密码体系中被用来替换RSA算法。
        国产SM2算法,是基于ECC的,但二者在签名验签、加密解密过程中或许有些许区别。

普通的软密钥,在签名验签、加密解密时,使用的0009规范;
如果是硬密钥,例如密码钥匙是0016规范(SKF),密码设备是0018规范(SDF);
SM2基于椭圆曲线,公钥是曲线上的一点(x,y),即公钥由x和y分量组成

SM2
推荐的椭圆曲线、参数
椭圆曲线方程:y2 = x3 + ax + b
p= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b= 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n= FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
Gx= 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
Gy= BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0

测试数据:
private_key_str:
16c96638efcde957f612ed51b743512ce28d2b87b0b8263c3a7113e8d8ff7030
public_key_bytes:
afdd188ac76ba7fa13f64744f7901501a39f92eb22ca38ce21940061b29a316efbdcb9b2cda6126976f8dda063023014f21b9b50c346b498e8de23e82d2c3501
public_key_x_bytes:
afdd188ac76ba7fa13f64744f7901501a39f92eb22ca38ce21940061b29a316e
public_key_y_bytes:
fbdcb9b2cda6126976f8dda063023014f21b9b50c346b498e8de23e82d2c3501
ID:
b’ALICE123@YAHOO.COM’
ENTL:
b’\x00\x90’
a_str:
fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc
b_str:
28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93
p_str:
fffffffeffffffffffffffffffffffffffffffff00000000ffffffffffffffff
n_str:
fffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123
g_x_str:
32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7
g_y_str:
bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0

在进行hash运算前需要组成以下格式:
ENTL + ID + a + b + x_g + y_g + x_a + y_a:
0090414c494345313233405941484f4f2e434f4dfffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e9332c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0afdd188ac76ba7fa13f64744f7901501a39f92eb22ca38ce21940061b29a316efbdcb9b2cda6126976f8dda063023014f21b9b50c346b498e8de23e82d2c3501

经过hash运算后的结果:
digst_ZA_str:
82b1d4908140c211320b552dc9daaec5325413fc2b3a96bcd94a2be4d447ab37

对原数据进行签名:
SM2签名结果 r||s
长度应该是(r:32字节)+(s:32字节)64字节,就算加个04头字节,也是65个字节。
r:随机数
s:签名值

digst_M_str:
07c1bb190619fad10d8fe0e4bfcda1ba43519a0d2239ad14fe0ca14caf95cab9

s_sign_r: 3bcebff61314d7337b85184bb332c1ecef5d2cde82e14f85a80ccd20b7cf22e5
s_sign_s: d1cedd5f3897a372cb486f87019cbb3d4a773d561bc19f2c5be9d1e832ce2dae


网上测试工具:(测试是可以的)
SM2加解密

私钥
16c96638efcde957f612ed51b743512ce28d2b87b0b8263c3a7113e8d8ff7030
公钥x:
afdd188ac76ba7fa13f64744f7901501a39f92eb22ca38ce21940061b29a316e
公钥y:
fbdcb9b2cda6126976f8dda063023014f21b9b50c346b498e8de23e82d2c3501

ID:414c494345313233405941484f4f2e434f4d

私钥签名
算法: SM2私钥签名
数据 长度2048(0x800)字节
0C 00 88 03 8C 01 02 04 2C 00 00 14 80 01 02 04 0C 38 80 03 8C C1 03 04 0C C0 3F 14 8C 01 8A 03 8D 01 C0 28 AD 01 84 03 8D 01 80 29 0C 02 00 14 8C 01 08 04 0C 38 80 03 0D 54 81 03 EE 01 00 14 CE 01 BC 03 CE B5 14 00 AE 09 00 58 0C 28 80 03 8C C1 03 04 8C D7 8E 14 8C FD 8F 03 8C 8E 08 17 8C 41 02 03 2C C4 03 04 0C 00 60 14 8C 01 88 03 0D 00 60 14 AD 0D 88 03 AC 01 02 04 2C 6E 00 14 8C BD 81 03 2C 0C 02 04 0C C0 3F 14 8C 01 8A 03 8D 01 C0 28 AD 0D 87 03 8D 01 C0 29 0C 04 80 03 8C 01 20 03 2C 00 06 04 0C 44 80 03 8C 01 24 03 2C 04 06 04 0C 80 00 04 8D 1D 40 03 0E E0 BF 02 CE FD 47 03 CE B1 14 00 C0 1D 01 44 05 00 15 00 AD 14 01 5C A5 88 40 00 0D 3C 80 03 A5 15 17 00 04 C0 3F 14 84 40 87 03 85 00 80 29 0F 02 00 14 8D BC 10 00 A0 01 80 29 11 04 80 03 10 04 80 03 11 1A 00 58 0E B2 41 00 8E 38 15 00 C0 01 80 29 10 06 C0 02 11 F2 FF 63 04 C0 3F 14 84 00 94 03 84 00 20 03 85 30 80 28 06 80 80 03 A5 18 15 00 A5 98 15 00 85 20 80 29 85 00 80 28 A5 18 15 00 A5 98 15 00 85 00 80 29 85 10 80 28 A5 18 15 00 A5 98 15 00 85 10 80 29 0C C0 3F 14 8C 01 94 03 8C 01 20 03 8D 31 80 28 0E 40 81 03 AD 39 15 00 8D 21 80 29 8D 01 80 28 AD 39 15 00 AD B9 15 00 8D 01 80 29 8D 11 80 28 AD 39 15 00 AD B9 15 00 8D 11 80 29 04 C0 3F 14 84 00 94 03 84 00 20 03 85 30 80 28 46 00 00 14 A5 18 15 00 A5 98 15 00 85 20 80 29 85 00 80 28 A5 18 15 00 A5 98 15 00 85 00 80 29 85 10 80 28 A5 18 15 00 A5 98 15 00 85 10 80 29 0C C0 3F 14 8C C1 87 03 0D 9C 80 03 8D 11 00 29 0C 0E 00 14 80 11 00 04 2C 00 38 14 2C 30 00 04 2C 00 38 14 2C 20 02 04 0C 10 80 03 80 01 00 04 03 06 00 1C 63 30 C0 28 02 06 00 1C 42 50 FF 28 0D 00 24 03 00 04 00 54 2C 30 C0 02 AC 31 15 00 80 01 00 4C 0C C0 82 03 2C 00 00 04 17 06 00 1C F7 E2 C0 28 04 00 38 14 84 00 20 03 F7 92 11 00 04 FE FF 15 04 00 00 16 F7 92 14 00 03 06 00 1C 63 00 FF 28 02 06 00 1C 42 20 FE 28 0C 80 00 04 8C FD 47 03 8D 0D 40 03 8E F1 47 03 CE 35 10 00 0D 04 80 03 AD B9 18 00 EF 01 00 14 EF 01 BC 03 EF B5 14 00 E0 11 00 44 0E 00 15 00 8E 0D 15 5C 00 0C 00 50 00 80 48 06 FF FF FF 53 04 C0 3F 14 84 80 87 03 84 00 20 03 00 74 18 54 04 06 00 1C 84 C0 F5 28 00 C0 18 54 04 06 00 1C 84 B0 F5 28 00 B4 18 54 0C C0 3F 14 8C 01 20 03 8E 01 D0 28 4D 00 00 14 CE 35 15 00 8E 01 D0 29 00 04 0F 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0C C0 3F 14 8C 01 20 03 8D 01 86 28 0E BC B7 02 AD B9 14 00 0F 80 90 03 AD 3D 15 00 8D 01 86 29 00 00 72 38 0C C0 3F 14 8C 01 90 03 8C 01 20 03 8D 11 80 28 0E 00 82 03 AD B9 16 00 8D 11 80 29 00 00 72 38 0C E0 1F 14 0C 80 00 16 8C 01 20 03 2D 00 00 14 AD 21 8C 03 8D 35 0C 38 0E FC 83 03 AD 39 15 00 2E 00 00 14 CE 21 8C 03 8D 39 1C 38 00 00 72 38 0C E0 1F 14 0C A0 00 16 8C 01 20 03 2D 00 00 14 AD 21 8C 03 8D 35 0C 38 0E FC 83 03 AD 39 15 00 2E 00 00 14 CE 21 8C 03 8D 39 1C 38 00 00 72 38 8C 00 00 14 8C FD BF 02 9F FD FF 47 0C 1A 20 14 0C C0 01 16 8C 01 20 03 8D B1 80 28 EF 01 00 14 EF 01 B4 03 AD 3D 15 00 8D B1 80 29 8D A1 80 28 EF 01 00 14 EF FD BF 03 8F A1 80 29 8D 31 80 28 EF 01 00 14 EF FD BF 03 8F 31 80 29 8D 11 80 28 0F 00 82 03 AD 3D 15 00 8D 11 80 29 8D 11 80 28 4F 00 00 14 EF 01 A0 03 AD 3D 15 00 CF 01 00 14 EF FD BF 03 AD BD 14 00 8D 11 80 29 04 4C 81 03 00 34 15 54 04 CC 80 03 00 2C 15 54 6F 00 00 14 EF 01 90 03 8F 51 80 29 0C 08 00 14 8C FD BF 02 9F FD FF 47 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ID:18(0x12)字节
41 4C 49 43 45 31 32 33 40 59 41 48 4F 4F 2E 43 4F 4D
HASH:32(0x20)字节
07 C1 BB 19 06 19 FA D1 0D 8F E0 E4 BF CD A1 BA 43 51 9A 0D 22 39 AD 14 FE 0C A1 4C AF 95 CA B9
结果 长度64(0x40)字节
97 4F A8 A7 A0 DE 7A EF 7F 52 97 FF A3 D4 68 BE 32 B8 BC 1F 9A E3 5B 6A DA 27 C9 8A 64 4E 1F A5 3C 2B 78 45 DB DE 1E 9C 96 17 E9 88 2B C7 95 9A BE 11 25 11 AD 02 BB 20 EB D6 7E D3 9B 03 E9 3E

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java中实现SM2加密解密,您可以使用bcprov库。在使用之前,您需要确保已经导入了bcprov-ext-jdk15on-151.jar和bcprov-jdk15on-151.jar这两个包。 首先,您需要生成SM2的密钥对。可以使用以下代码生成密钥对: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; public class SM2Example { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("SM2", "BC"); KeyPair keyPair = keyPairGenerator.generateKeyPair(); byte[] publicKey = keyPair.getPublic().getEncoded(); byte[] privateKey = keyPair.getPrivate().getEncoded(); System.out.println("公钥: " + Hex.toHexString(publicKey)); System.out.println("私钥: " + Hex.toHexString(privateKey)); } } ``` 然后,您可以使用以下代码进行SM2加密和解密: ```java import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.engines.SM2Engine; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.util.PrivateKeyInfoFactory; import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class SM2Example { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 加载公钥和私钥 byte[] publicKeyBytes = Hex.decode("公钥"); byte[] privateKeyBytes = Hex.decode("私钥"); KeyFactory keyFactory = KeyFactory.getInstance("SM2", "BC"); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); // 加密 SM2Engine engine = new SM2Engine(); engine.init(true, new ECPublicKeyParameters((ECPublicKey) publicKey, SM2Util.DOMAIN_PARAMETERS)); byte[] plaintext = "要加密的数据".getBytes(); byte[] encrypted = engine.processBlock(plaintext, 0, plaintext.length); System.out.println("加密结果: " + Hex.toHexString(encrypted)); // 解密 engine.init(false, new ECPrivateKeyParameters((ECPrivateKey) privateKey, SM2Util.DOMAIN_PARAMETERS)); byte[] decrypted = engine.processBlock(encrypted, 0, encrypted.length); System.out.println("解密结果: " + new String(decrypted)); } } ``` 请注意,这只是一个基础的示例,您可能需要根据您的具体需求进行修改和完善。另外,您还可以通过了解更多关于bcprov库的文档和示例来深入学习和使用SM2加密解密。<span class="em">1</span> #### 引用[.reference_title] - *1* [SM2加密解密JAVA版本.zip](https://download.csdn.net/download/kill_bugs/13500151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值