| src/main/java/com/dji/sample/territory/utils/SM3.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/territory/utils/jym/SM2Factory.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/territory/utils/jym/SM2Result.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/territory/utils/jym/SM2SignVO.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/territory/utils/jym/SM2SignVerUtils.java | ●●●●● patch | view | raw | blame | history | |
| src/main/java/com/dji/sample/territory/utils/jym/Util.java | ●●●●● patch | view | raw | blame | history |
src/main/java/com/dji/sample/territory/utils/SM3.java
New file @@ -0,0 +1,59 @@ package com.dji.sample.territory.utils; import com.dji.sample.territory.utils.jym.SM2SignVO; import com.dji.sample.territory.utils.jym.SM2SignVerUtils; import com.dji.sample.territory.utils.jym.Util; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.util.encoders.Hex; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class SM3 { public static String sm3(byte[] data) { byte[] md = new byte[32]; SM3Digest sm3 = new SM3Digest(); sm3.update(data, 0, data.length); sm3.doFinal(md, 0); String s = new String(Hex.encode(md)); return s.toUpperCase(); } public static void main(String[] args) throws Exception { File file = new File("src/main/resources/FJ_11.jpeg"); byte[] bytesArray = Files.readAllBytes(file.toPath()); String sm=sm3(bytesArray); StringBuffer buffer=addStringBuffer("0561C8D116010B96128A7470436CDEF2DA1F2BCBD21CA228E427D27AFDA5BF10", "2024-06-11 09:29:44",115.8652884,28.6252874,-83,295,0,"中图智绘无人机", "23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D"); System.out.println(addJym(buffer)); } public static String addJym(StringBuffer buffer) throws Exception { String hash = SM3.sm3(buffer.toString().getBytes()); String privateKey = "23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D"; SM2SignVO sm2signv0 = SM2SignVerUtils.Sign2SM2(Util.hexStringToBytes(privateKey), hash.getBytes(StandardCharsets.UTF_8)); return sm2signv0.getSm2_signForHard().toUpperCase(); } public static StringBuffer addStringBuffer(String FJHXZ, String PSSJ, Double Longitude, Double Latitude, double PSFYJ, double PSJD, int PSHGJ, String PSRY, String ZSDM) { StringBuffer buffer = new StringBuffer(); // 添加参数到 StringBuffer buffer.append(FJHXZ).append(",") .append(PSSJ).append(",") .append(Longitude).append(",") .append(Latitude).append(",") .append(PSFYJ).append(",") .append(PSJD).append(",") .append(PSHGJ).append(",") .append(PSRY).append(",") .append(ZSDM); return buffer; } } src/main/java/com/dji/sample/territory/utils/jym/SM2Factory.java
New file @@ -0,0 +1,114 @@ package com.dji.sample.territory.utils.jym; import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.crypto.generators.ECKeyPairGenerator; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECKeyGenerationParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; import org.bouncycastle.math.ec.ECFieldElement.Fp; import org.bouncycastle.math.ec.ECPoint; import java.math.BigInteger; import java.security.SecureRandom; public class SM2Factory { private static final BigInteger a = new BigInteger("fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc", 16); private static final BigInteger b = new BigInteger("28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93", 16); private static final BigInteger gx = new BigInteger("32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7", 16); private static final BigInteger gy = new BigInteger("bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0", 16); private static final BigInteger n = new BigInteger("fffffffeffffffffffffffffffffffff7203df6b21c6052b53bbf40939d54123", 16); private static final BigInteger p = new BigInteger("fffffffeffffffffffffffffffffffffffffffff00000000ffffffffffffffff", 16); private static final int h = 1; public final ECFieldElement ecc_gx_fieldelement; public final ECFieldElement ecc_gy_fieldelement; public final ECCurve ecc_curve; public final ECPoint ecc_point_g; public final ECDomainParameters ecc_bc_spec; public final ECKeyPairGenerator ecc_key_pair_generator; public static SM2Factory getInstance() { return new SM2Factory(); } public SM2Factory() { this.ecc_gx_fieldelement = new Fp(p, gx); this.ecc_gy_fieldelement = new Fp(p, gy); this.ecc_curve = new ECCurve.Fp(p, a, b); this.ecc_point_g = new ECPoint.Fp(this.ecc_curve, this.ecc_gx_fieldelement, this.ecc_gy_fieldelement, false); this.ecc_bc_spec = new ECDomainParameters(this.ecc_curve, this.ecc_point_g, n); ECKeyGenerationParameters ecc_ecgenparam = new ECKeyGenerationParameters(this.ecc_bc_spec, new SecureRandom()); this.ecc_key_pair_generator = new ECKeyPairGenerator(); this.ecc_key_pair_generator.init(ecc_ecgenparam); } public byte[] sm2GetZ(byte[] userId, ECPoint userKey) { SM3Digest sm3 = new SM3Digest(); int len = userId.length * 8; sm3.update((byte)(len >> 8 & 255)); sm3.update((byte)(len & 255)); sm3.update(userId, 0, userId.length); byte[] p = Util.byteConvert32Bytes(a); sm3.update(p, 0, p.length); p = Util.byteConvert32Bytes(b); sm3.update(p, 0, p.length); p = Util.byteConvert32Bytes(gx); sm3.update(p, 0, p.length); p = Util.byteConvert32Bytes(gy); sm3.update(p, 0, p.length); p = Util.byteConvert32Bytes(userKey.normalize().getXCoord().toBigInteger()); sm3.update(p, 0, p.length); p = Util.byteConvert32Bytes(userKey.normalize().getYCoord().toBigInteger()); sm3.update(p, 0, p.length); byte[] md = new byte[sm3.getDigestSize()]; sm3.doFinal(md, 0); return md; } public void sm2Sign(byte[] md, BigInteger userD, ECPoint userKey,SM2Result sm2Result) { BigInteger e = new BigInteger(1, md); BigInteger k = null; ECPoint kp = null; BigInteger r = null; BigInteger s = null; while(true) { do { AsymmetricCipherKeyPair keypair = this.ecc_key_pair_generator.generateKeyPair(); ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)keypair.getPrivate(); ECPublicKeyParameters ecpub = (ECPublicKeyParameters)keypair.getPublic(); k = ecpriv.getD(); kp = ecpub.getQ(); r = e.add(kp.getXCoord().toBigInteger()); r = r.mod(n); } while(r.equals(BigInteger.ZERO)); if (!r.add(k).equals(n) && r.toString(16).length() == 64) { BigInteger da_1 = userD.add(BigInteger.ONE); da_1 = da_1.modInverse(n); s = r.multiply(userD); s = k.subtract(s).mod(n); s = da_1.multiply(s).mod(n); if (!s.equals(BigInteger.ZERO) && s.toString(16).length() == 64) { sm2Result.r = r; sm2Result.s = s; return; } } } } public void sm2Verify(byte[] md, ECPoint userKey, BigInteger r, BigInteger s, SM2Result sm2Result) { sm2Result.R = null; BigInteger e = new BigInteger(1, md); BigInteger t = r.add(s).mod(n); if (!t.equals(BigInteger.ZERO)) { ECPoint x1y1 = this.ecc_point_g.multiply(sm2Result.s); x1y1 = x1y1.add(userKey.multiply(t)); sm2Result.R = e.add(x1y1.normalize().getXCoord().toBigInteger()).mod(n); } } } src/main/java/com/dji/sample/territory/utils/jym/SM2Result.java
New file @@ -0,0 +1,20 @@ package com.dji.sample.territory.utils.jym; import org.bouncycastle.math.ec.ECPoint; import java.math.BigInteger; public class SM2Result { public BigInteger r; public BigInteger s; public BigInteger R; public byte[] sa; public byte[] sb; public byte[] s1; public byte[] s2; public ECPoint keyra; public ECPoint keyrb; public SM2Result() { } } src/main/java/com/dji/sample/territory/utils/jym/SM2SignVO.java
New file @@ -0,0 +1,128 @@ package com.dji.sample.territory.utils.jym; public class SM2SignVO { public String sm2_userd; public String x_coord; public String y_coord; public String sm3_z; public String sign_express; public String sm3_digest; public String sign_r; public String sign_s; public String verify_r; public String verify_s; public String sm2_sign; public String sm2_type; public boolean isVerify; public SM2SignVO() { } public String getX_coord() { return this.x_coord; } public void setX_coord(String x_coord) { this.x_coord = x_coord; } public String getY_coord() { return this.y_coord; } public void setY_coord(String y_coord) { this.y_coord = y_coord; } public String getSm3_z() { return this.sm3_z; } public void setSm3_z(String sm3_z) { this.sm3_z = sm3_z; } public String getSm3_digest() { return this.sm3_digest; } public void setSm3_digest(String sm3_digest) { this.sm3_digest = sm3_digest; } public String getSm2_signForSoft() { return this.sm2_sign; } public String getSm2_signForHard() { return this.getSign_r() + this.getSign_s(); } public void setSm2_sign(String sm2_sign) { this.sm2_sign = sm2_sign; } public String getSign_express() { return this.sign_express; } public void setSign_express(String sign_express) { this.sign_express = sign_express; } public String getSm2_userd() { return this.sm2_userd; } public void setSm2_userd(String sm2_userd) { this.sm2_userd = sm2_userd; } public String getSm2_type() { return this.sm2_type; } public void setSm2_type(String sm2_type) { this.sm2_type = sm2_type; } public boolean isVerify() { return this.isVerify; } public void setVerify(boolean isVerify) { this.isVerify = isVerify; } public String getSign_r() { return this.sign_r; } public void setSign_r(String sign_r) { this.sign_r = sign_r; } public String getSign_s() { return this.sign_s; } public void setSign_s(String sign_s) { this.sign_s = sign_s; } public String getVerify_r() { return this.verify_r; } public void setVerify_r(String verify_r) { this.verify_r = verify_r; } public String getVerify_s() { return this.verify_s; } public void setVerify_s(String verify_s) { this.verify_s = verify_s; } } src/main/java/com/dji/sample/territory/utils/jym/SM2SignVerUtils.java
New file @@ -0,0 +1,104 @@ 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; } } } src/main/java/com/dji/sample/territory/utils/jym/Util.java
New file @@ -0,0 +1,476 @@ package com.dji.sample.territory.utils.jym; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.ASN1Integer; import org.bouncycastle.asn1.DERSequence; import java.io.IOException; import java.math.BigInteger; public class Util { private static final char[] DIGITS_LOWER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; private static final char[] DIGITS_UPPER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; public Util() { } public static byte[] intToBytes(int num) { byte[] bytes = new byte[]{(byte)(255 & num >> 0), (byte)(255 & num >> 8), (byte)(255 & num >> 16), (byte)(255 & num >> 24)}; return bytes; } // public static int byteToInt(byte[] bytes) { // int num = 0; // int temp = (255 & bytes[0]) << 0; // int num = num | temp; // temp = (255 & bytes[1]) << 8; // num |= temp; // temp = (255 & bytes[2]) << 16; // num |= temp; // temp = (255 & bytes[3]) << 24; // num |= temp; // return num; // } public static byte[] longToBytes(long num) { byte[] bytes = new byte[8]; for(int i = 0; i < 8; ++i) { bytes[i] = (byte)((int)(255L & num >> i * 8)); } return bytes; } public static byte[] byteConvert32Bytes(BigInteger n) { byte[] tmpd = (byte[])null; if (n == null) { return null; } else { if (n.toByteArray().length == 33) { tmpd = new byte[32]; System.arraycopy(n.toByteArray(), 1, tmpd, 0, 32); } else if (n.toByteArray().length == 32) { tmpd = n.toByteArray(); } else { tmpd = new byte[32]; for(int i = 0; i < 32 - n.toByteArray().length; ++i) { tmpd[i] = 0; } System.arraycopy(n.toByteArray(), 0, tmpd, 32 - n.toByteArray().length, n.toByteArray().length); } return tmpd; } } public static BigInteger byteConvertInteger(byte[] b) { if (b[0] < 0) { byte[] temp = new byte[b.length + 1]; temp[0] = 0; System.arraycopy(b, 0, temp, 1, b.length); return new BigInteger(temp); } else { return new BigInteger(b); } } public static String getHexString(byte[] bytes) { return getHexString(bytes, true); } public static String getHexString(byte[] bytes, boolean upperCase) { String ret = ""; for(int i = 0; i < bytes.length; ++i) { ret = ret + Integer.toString((bytes[i] & 255) + 256, 16).substring(1); } return upperCase ? ret.toUpperCase() : ret; } public static void printHexString(byte[] bytes) { for(int i = 0; i < bytes.length; ++i) { String hex = Integer.toHexString(bytes[i] & 255); if (hex.length() == 1) { hex = '0' + hex; } System.out.print("0x" + hex.toUpperCase() + ","); } System.out.println(""); } public static byte[] hexStringToBytes(String hexString) { if (hexString != null && !hexString.equals("")) { hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for(int i = 0; i < length; ++i) { int pos = i * 2; d[i] = (byte)(charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } else { return null; } } public static byte charToByte(char c) { return (byte)"0123456789ABCDEF".indexOf(c); } public static char[] encodeHex(byte[] data) { return encodeHex(data, true); } public static char[] encodeHex(byte[] data, boolean toLowerCase) { return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } protected static char[] encodeHex(byte[] data, char[] toDigits) { int l = data.length; char[] out = new char[l << 1]; int i = 0; for(int var5 = 0; i < l; ++i) { out[var5++] = toDigits[(240 & data[i]) >>> 4]; out[var5++] = toDigits[15 & data[i]]; } return out; } public static String encodeHexString(byte[] data) { return encodeHexString(data, true); } public static String encodeHexString(byte[] data, boolean toLowerCase) { return encodeHexString(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } protected static String encodeHexString(byte[] data, char[] toDigits) { return new String(encodeHex(data, toDigits)); } public static byte[] decodeHex(char[] data) { int len = data.length; if ((len & 1) != 0) { throw new RuntimeException("Odd number of characters."); } else { byte[] out = new byte[len >> 1]; int i = 0; for(int j = 0; j < len; ++i) { int f = toDigit(data[j], j) << 4; ++j; f |= toDigit(data[j], j); ++j; out[i] = (byte)(f & 255); } return out; } } protected static int toDigit(char ch, int index) { int digit = Character.digit(ch, 16); if (digit == -1) { throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index); } else { return digit; } } public static String StringToAsciiString(String content) { String result = ""; int max = content.length(); for(int i = 0; i < max; ++i) { char c = content.charAt(i); String b = Integer.toHexString(c); result = result + b; } return result; } public static String hexStringToString(String hexString, int encodeType) { String result = ""; int max = hexString.length() / encodeType; for(int i = 0; i < max; ++i) { char c = (char)hexStringToAlgorism(hexString.substring(i * encodeType, (i + 1) * encodeType)); result = result + c; } return result; } public static int hexStringToAlgorism(String hex) { hex = hex.toUpperCase(); int max = hex.length(); int result = 0; for(int i = max; i > 0; --i) { char c = hex.charAt(i - 1); int algorism; if (c >= '0' && c <= '9') { algorism = c - 48; } else { algorism = c - 55; } result = (int)((double)result + Math.pow(16.0D, (double)(max - i)) * (double)algorism); } return result; } public static String hexStringToBinary(String hex) { hex = hex.toUpperCase(); String result = ""; int max = hex.length(); for(int i = 0; i < max; ++i) { char c = hex.charAt(i); switch(c) { case '0': result = result + "0000"; break; case '1': result = result + "0001"; break; case '2': result = result + "0010"; break; case '3': result = result + "0011"; break; case '4': result = result + "0100"; break; case '5': result = result + "0101"; break; case '6': result = result + "0110"; break; case '7': result = result + "0111"; break; case '8': result = result + "1000"; break; case '9': result = result + "1001"; case ':': case ';': case '<': case '=': case '>': case '?': case '@': default: break; case 'A': result = result + "1010"; break; case 'B': result = result + "1011"; break; case 'C': result = result + "1100"; break; case 'D': result = result + "1101"; break; case 'E': result = result + "1110"; break; case 'F': result = result + "1111"; } } return result; } public static String AsciiStringToString(String content) { String result = ""; int length = content.length() / 2; for(int i = 0; i < length; ++i) { String c = content.substring(i * 2, i * 2 + 2); int a = hexStringToAlgorism(c); char b = (char)a; String d = String.valueOf(b); result = result + d; } return result; } public static String algorismToHexString(int algorism, int maxLength) { String result = ""; result = Integer.toHexString(algorism); if (result.length() % 2 == 1) { result = "0" + result; } return patchHexString(result.toUpperCase(), maxLength); } public static String byteToString(byte[] bytearray) { String result = ""; int length = bytearray.length; for(int i = 0; i < length; ++i) { char temp = (char)bytearray[i]; result = result + temp; } return result; } public static int binaryToAlgorism(String binary) { int max = binary.length(); int result = 0; for(int i = max; i > 0; --i) { char c = binary.charAt(i - 1); int algorism = c - 48; result = (int)((double)result + Math.pow(2.0D, (double)(max - i)) * (double)algorism); } return result; } public static String algorismToHEXString(int algorism) { String result = ""; result = Integer.toHexString(algorism); if (result.length() % 2 == 1) { result = "0" + result; } result = result.toUpperCase(); return result; } public static String patchHexString(String str, int maxLength) { String temp = ""; for(int i = 0; i < maxLength - str.length(); ++i) { temp = "0" + temp; } str = (temp + str).substring(0, maxLength); return str; } public static int parseToInt(String s, int defaultInt, int radix) { boolean var3 = false; int i; try { i = Integer.parseInt(s, radix); } catch (NumberFormatException var5) { i = defaultInt; } return i; } public static int parseToInt(String s, int defaultInt) { boolean var2 = false; int i; try { i = Integer.parseInt(s); } catch (NumberFormatException var4) { i = defaultInt; } return i; } public static byte[] hexToByte(String hex) throws IllegalArgumentException { if (hex.length() % 2 != 0) { throw new IllegalArgumentException(); } else { char[] arr = hex.toCharArray(); byte[] b = new byte[hex.length() / 2]; int i = 0; int j = 0; for(int l = hex.length(); i < l; ++j) { String swap = "" + arr[i++] + arr[i]; int byteint = Integer.parseInt(swap, 16) & 255; b[j] = (new Integer(byteint)).byteValue(); ++i; } return b; } } public static String byteToHex(byte[] b) { if (b == null) { throw new IllegalArgumentException("Argument b ( byte array ) is null! "); } else { String hs = ""; String stmp = ""; for(int n = 0; n < b.length; ++n) { stmp = Integer.toHexString(b[n] & 255); if (stmp.length() == 1) { hs = hs + "0" + stmp; } else { hs = hs + stmp; } } return hs.toUpperCase(); } } public static byte[] subByte(byte[] input, int startIndex, int length) { byte[] bt = new byte[length]; for(int i = 0; i < length; ++i) { bt[i] = input[i + startIndex]; } return bt; } public static String SM2SignHardToSoft(String hardSign) { byte[] bytes = hexToByte(hardSign); byte[] r = new byte[bytes.length / 2]; byte[] s = new byte[bytes.length / 2]; System.arraycopy(bytes, 0, r, 0, bytes.length / 2); System.arraycopy(bytes, bytes.length / 2, s, 0, bytes.length / 2); ASN1Integer d_r = new ASN1Integer(byteConvertInteger(r)); ASN1Integer d_s = new ASN1Integer(byteConvertInteger(s)); ASN1EncodableVector v2 = new ASN1EncodableVector(); v2.add(d_r); v2.add(d_s); DERSequence sign = new DERSequence(v2); String result = null; try { result = byteToHex(sign.getEncoded()); return result; } catch (IOException var10) { var10.printStackTrace(); throw new RuntimeException(var10); } } }