package com.dji.sample.territory.utils.jym; import com.dji.sample.territory.utils.HashUtil; import com.dji.sample.territory.utils.SM3; import org.bouncycastle.asn1.*; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.math.ec.ECPoint; import java.io.ByteArrayInputStream; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.Enumeration; public class SM2SignVerUtils { public static void main(String[] args) throws Exception { String data = "0561C8D116010B96128A7470436CDEF2DA1F2BCBD21CA228E427D27AFDA5BF10,2024-06-11 09:29:44,115.8652884,28.6252874,-83,295,0,中图智绘无人机,23C8CCC61E3042FBA6A658F319337B1A"; // 替换为需要哈希的数据 String HXZ=SM3.sm3(data.getBytes()); SM2SignVO sm2signv0 = SM2SignVerUtils.Sign2SM2(Util.hexStringToBytes("23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D"), HXZ.getBytes(StandardCharsets.UTF_8)); String jym= sm2signv0.getSm2_signForHard().toUpperCase(); System.out.println(jym); } public static String USER_ID = "1234567812345678"; public SM2SignVerUtils() { } public static SM2SignVO Sign2SM2(byte[] privatekey, byte[] sourceData) throws Exception { SM2SignVO sm2SignVO = new SM2SignVO(); sm2SignVO.setSm2_type("sign"); SM2Factory factory = SM2Factory.getInstance(); BigInteger userD = new BigInteger(1, privatekey); sm2SignVO.setSm2_userd(userD.toString(16)); ECPoint userKey = factory.ecc_point_g.multiply(userD); SM3Digest sm3Digest = new SM3Digest(); byte[] z = factory.sm2GetZ(USER_ID.getBytes(), userKey); sm2SignVO.setSm3_z(Util.getHexString(z)); sm2SignVO.setSign_express(Util.getHexString(sourceData)); sm3Digest.update(z, 0, z.length); sm3Digest.update(sourceData, 0, sourceData.length); byte[] md = new byte[32]; sm3Digest.doFinal(md, 0); sm2SignVO.setSm3_digest(Util.getHexString(md)); SM2Result sm2Result = new SM2Result(); factory.sm2Sign(md, userD, userKey, sm2Result); sm2SignVO.setSign_r(sm2Result.r.toString(16)); sm2SignVO.setSign_s(sm2Result.s.toString(16)); ASN1Integer d_r = new ASN1Integer(sm2Result.r); ASN1Integer d_s = new ASN1Integer(sm2Result.s); ASN1EncodableVector v2 = new ASN1EncodableVector(); v2.add(d_r); v2.add(d_s); DERSequence sign = new DERSequence(v2); String result = Util.byteToHex(sign.getEncoded()); sm2SignVO.setSm2_sign(result); return sm2SignVO; } public static SM2SignVO VerifySignSM2(byte[] publicKey, byte[] sourceData, byte[] signData) { try { SM2SignVO verifyVo = new SM2SignVO(); verifyVo.setSm2_type("verify"); byte[] formatedPubKey; if (publicKey.length == 64) { formatedPubKey = new byte[65]; formatedPubKey[0] = 4; System.arraycopy(publicKey, 0, formatedPubKey, 1, publicKey.length); } else { formatedPubKey = publicKey; } SM2Factory factory = SM2Factory.getInstance(); ECPoint userKey = factory.ecc_curve.decodePoint(formatedPubKey); SM3Digest sm3Digest = new SM3Digest(); byte[] z = factory.sm2GetZ(USER_ID.getBytes(), userKey); verifyVo.setSm3_z(Util.getHexString(z)); sm3Digest.update(z, 0, z.length); sm3Digest.update(sourceData, 0, sourceData.length); byte[] md = new byte[32]; sm3Digest.doFinal(md, 0); verifyVo.setSm3_digest(Util.getHexString(md)); ByteArrayInputStream bis = new ByteArrayInputStream(signData); ASN1InputStream dis = new ASN1InputStream(bis); SM2Result sm2Result = null; ASN1Primitive derObj = dis.readObject(); Enumeration e = ((ASN1Sequence)derObj).getObjects(); BigInteger r = ((ASN1Integer)e.nextElement()).getValue(); BigInteger s = ((ASN1Integer)e.nextElement()).getValue(); sm2Result = new SM2Result(); sm2Result.r = r; sm2Result.s = s; verifyVo.setVerify_r(sm2Result.r.toString(16)); verifyVo.setVerify_s(sm2Result.s.toString(16)); factory.sm2Verify(md, userKey, sm2Result.r, sm2Result.s, sm2Result); boolean verifyFlag = sm2Result.r.equals(sm2Result.R); verifyVo.setVerify(verifyFlag); return verifyVo; } catch (IllegalArgumentException var18) { return null; } catch (Exception var19) { var19.printStackTrace(); return null; } } }