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<ASN1Integer> 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;
|
}
|
}
|
}
|