diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index 0aecde6..9dacad5 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java index cff7982..99faa58 100644 --- a/src/main/java/com/sunyard/inf/SydCryptionApi.java +++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java @@ -94,6 +94,15 @@ interface SydASYMApi { byte[] pOrgData ); + /** + * 用指定的 SM2 公钥对指定的密文数据进行加密。 + * + * @param publicKey 公钥钥串,DER 编码,HEX 格式。 + * @param pOrgData 加密的数据。 + * @return 加密的数据 der 编码。 + */ + byte[] SYD_SM2_Encrypt(byte[] publicKey, byte[] pOrgData); + /** * 用指定的 SM2 公钥对指定的密文数据进行加密。 @@ -117,11 +126,19 @@ interface SydASYMApi { /** * 使用外部私钥解密 * @param sk LMK下加密的私钥 - * @param enData 密文数据(DER 编码) - * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT) + * @param enData 密文数据(base64 编码) + * @return 解密结果 */ byte[] SM2Decrypt(byte[] sk, String enData); + /** + * 使用外部私钥解密 + * @param sk LMK下加密的私钥 + * @param enData 密文数据(DER 编码) + * @return 解密结果 + */ + byte[] SYD_SM2_Decrypt(byte[] sk, byte[] enData); + /** * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。 * 输入的sm2密文结构为C1C2C3格式 diff --git a/src/main/java/com/sunyard/inf/SydSVApi.java b/src/main/java/com/sunyard/inf/SydSVApi.java index 3aaa93c..f4677c2 100644 --- a/src/main/java/com/sunyard/inf/SydSVApi.java +++ b/src/main/java/com/sunyard/inf/SydSVApi.java @@ -128,8 +128,8 @@ interface SydAttachedSVApi { /** * 采用 SM2 算法,用指定的公钥对指定的原始数据进行数字签名验证。 - * @param certNo 哈希标识 指示用于哈希证书数据的哈希算法的标识。0: SHA1 1: SHA256 2: MD5 - * @param nOrgDataType 签名方式 + * @param certNo id 用于计算SM3-HASH + * @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据,用1.2.3章节限定符亦可 * @param publicKey 公钥 * @param orgData 原始数据 * @param sign base64 格式的签名 diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index bace115..8883658 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -4065,6 +4065,41 @@ public class SydApi4j implements SydApi { return SYMUtil.derEnData2Base64EnData(((PacketSection) ret.get("cipherData")).getBytes()); } + @Override + public byte[] SYD_SM2_Encrypt(byte[] publicKey, byte[] pOrgData) { + Proto77 proto = new Proto77(); + + // 填充数据 + HashMap packet = new HashMap(); + HashMap data = new HashMap(); + packet.put("data", data); + PacketSN sn = PacketSN.gen(); + packet.put("header", sn.getSn().array()); + data.put("AlgorithmKey$option", 1); + data.put("publicKey", publicKey); + data.put("infoData", pOrgData); + // 渲染发送 + ByteBuffer bb = proto.rend(packet); + synchronized (this) { + // 响应解析 + bb = syncRead(syncSend(bb)); + } + //ProtocolParser parser = pset.getProtocolResParse(); + Packet p = proto.parse(bb); + Map ret = p.toMap(); + if ( + !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) + ) { + throw new SydApiException("包序号不匹配", -4); + } + ret = (Map) ret.get("data"); + PacketSection error = (PacketSection) ret.get("error"); + if (!"00".equals(error.getString())) { + throw new SydApiException(error.getInfo(), error.autoInt()); + } + + return ((PacketSection) ret.get("cipherData")).getBytes(); + } @Override public byte[] SM2Decrypt(byte[] sk, String enData) { @@ -4106,6 +4141,43 @@ public class SydApi4j implements SydApi { return ((PacketSection) ret.get("data")).getBytes(); } + @Override + public byte[] SYD_SM2_Decrypt(byte[] sk, byte[] enData) { + Proto78 proto = new Proto78(); + + // 填充数据 + HashMap packet = new HashMap(); + HashMap data = new HashMap(); + packet.put("data", data); + PacketSN sn = PacketSN.gen(); + packet.put("header", sn.getSn().array()); + data.put("AlgorithmKey$option", 1); + data.put("infoData", enData); + data.put("privateKeyTag", "999999999999999999999999999"); + data.put("privateKey", sk); + // 渲染发送 + ByteBuffer bb = proto.rend(packet); + synchronized (this) { + // 响应解析 + bb = syncRead(syncSend(bb)); + } + //ProtocolParser parser = pset.getProtocolResParse(); + Packet p = proto.parse(bb); + Map ret = p.toMap(); + if ( + !Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes()) + ) { + throw new SydApiException("包序号不匹配", -4); + } + ret = (Map) ret.get("data"); + PacketSection error = (PacketSection) ret.get("error"); + if (!"00".equals(error.getString())) { + throw new SydApiException(error.getInfo(), error.autoInt()); + } + + return ((PacketSection) ret.get("data")).getBytes(); + } + @Override public byte[] SM2DecryptC(String userId, String enData) { @@ -5600,7 +5672,7 @@ public class SydApi4j implements SydApi { /** * 8.1生成一个MAC(=) * - * @param TAK + * @param TAK tak类型的密钥 * @param infoData MAC数据,数据长度应该为8的整数倍,如果不是8的整数倍,系统默认在数据后面填充0x00组成8的整数倍。 * @param IV IV * @return 所计算出的MAC hex 格式 diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 71183b3..8f4e22e 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -2,6 +2,7 @@ package com.sunyard.sydapi.test; import com.sunyard.RetWrap; import com.sunyard.SydApi; +import com.sunyard.SydApiException; import com.sunyard.cert.X509; import com.sunyard.proto.Util; import com.sunyard.util.CoderUtil; @@ -12,6 +13,11 @@ import org.junit.Test; import racal.sunyard.main.SydApi4j; import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.Base64; import static com.sunyard.sydapi.util.PrintUtil.printByteArray; @@ -30,7 +36,8 @@ public class TestAllMethods { public void before() { // 通过设置debug的属性开启debug,如果不设置则默认不打开 System.setProperty("com.sunyard.sydapi4j.debug", "true"); - api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); +// api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("192.168.0.99", 8889, null, 1000); @@ -161,6 +168,66 @@ public class TestAllMethods { return data; } + /** + * 自己发送及接收 + * @throws IOException + */ + @Test + public void testSendData() throws IOException { + String msg = "000D00000000000000005938303136"; + + String ip = "172.16.18.59"; + int port = 8889; + int timeout = 1000; + + // 连接socket + Socket socket = new Socket(); + SocketAddress address = new InetSocketAddress(ip, port); + + try { + socket.connect(address, timeout); + socket.setSoTimeout(timeout); + } catch (IOException e) { + e.printStackTrace(); + } + + InputStream is = null; + try { + // 发送数据 + socket.getOutputStream().write(Util.hexString2Bytes(msg)); + // 接收数据 + is = socket.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + + // 处理数据 + int d; + int high = is.read(); + int low = is.read(); + // 计算数据总长度 + int len = (high << 8) + low; + + len += 2; + + // 创建ByteBuffer + ByteBuffer bb = ByteBuffer.allocate(len); + bb.put((byte) (high & 0xFF)); + + bb.put((byte) (low & 0xFF)); + + // 将数据放入ByteBuffer中 + while ((d = is.read()) != -1) { + + bb.put((byte) (d & 0xFF)); + if (bb.position() == len) { + break; + } + } + + System.out.println("返回的hex: " + Util.bytes2HexString(bb.array())); + } + // A0 1.1.1 对称密钥产生, // 测试通过 @@ -670,7 +737,7 @@ public class TestAllMethods { @Test public void testSM4EncryptFileDataCBC() { String key = "X6CEE744329499B426CEE744329499B42"; - String inFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in1.txt"; + String inFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in.txt"; String outFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in2.txt"; boolean b = api.SM4EncryptFileDataCBC(0, key, 0, 0, inFilePath, outFilePath); System.out.println(b); @@ -1259,7 +1326,8 @@ public class TestAllMethods { // 6B @Test public void testDecryptDE2() { - String sn = "1004282452"; +// String sn = "1004282452"; + String sn = "1FD9F2049860FD072F0CC71B072EBF9952E2784E"; RetWrap retWrap = api.generateDE(sn, SydApi.ALG_SM4); String CipherKey = (String) retWrap.get("CipherKey"); printRetWrap(retWrap); @@ -1270,6 +1338,7 @@ public class TestAllMethods { printRetWrap(retWrap1); } + @Test public void testDecryptDE3() { String sn = "1004282452"; @@ -1311,6 +1380,9 @@ public class TestAllMethods { String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY); printRetWrap(retWrap); + byte[] decode = Base64.getDecoder().decode(CipherKey); + System.out.println("解base64: " + Util.bytes2HexString(decode)); + RetWrap retWrap1 = api.decryptDE(sn, CipherKey); printRetWrap(retWrap1); } @@ -1527,7 +1599,7 @@ public class TestAllMethods { "-----END CERTIFICATE-----"; String jgh = "00000000"; - System.out.println(api.importCert(Util.getSafeBytes(cert), jgh.getBytes())); + System.out.println(api.importCert(Util.getSafeBytes(cert), null)); } @Test @@ -1659,6 +1731,36 @@ public class TestAllMethods { System.out.println(b); } + @Test + public void testaaba() throws UnsupportedEncodingException { + String orgData = "30111020220210200002|+|12.35|+|1|+|301|+||+||+||+||-|85873323882200000022|+|1|+|310000|+|310069037013006623257|+|RMB|+|物料池预备数据测试十|+|310000|+|310069037013006522872|+|RMB|+|大批量加密测试二十|+|交通银行上海奉贤支行|+|301290050471|+|12.35|+|0|+|0|+||+|1|+|2022[0002]00021|+|20220210|+||+|1|+||+||+||+||+||+||+||+||+||+|0.00|+||+|0|+||-|"; + String pk = "03420004AE179895745EDF2C7822BA15487F9B2FCC978597780A4EF228EC5B70AC7073174B8F457505BE4611809932170730EA0D325A12971C6699B0E51943369E1802D2"; + String sign = "MEUCICCTC1KiPkaftcCRfvMRrrxG1cc21zPWqgDbQHUV7NCKAiEAjO+Kdixwp2mJu5OTdBbwqCOzWslmkZ3QVdxlTcUqKEo="; + + System.out.println("解密: " + Util.bytes2HexString(Base64.getDecoder().decode(sign))); + + boolean b = api.SM2Verify( Util .hexString2Bytes(pk), orgData.getBytes("gbk"), sign); + System.out.println(b); + } + + + // 75 + @Test + public void testaabac() throws UnsupportedEncodingException { + String orgData = "30111020220210200002|+|12.35|+|1|+|301|+||+||+||+||-|85873323882200000022|+|1|+|310000|+|310069037013006623257|+|RMB|+|物料池预备数据测试十|+|310000|+|310069037013006522872|+|RMB|+|大批量加密测试二十|+|交通银行上海奉贤支行|+|301290050471|+|12.35|+|0|+|0|+||+|1|+|2022[0002]00021|+|20220210|+||+|1|+||+||+||+||+||+||+||+||+||+|0.00|+||+|0|+||-|"; + + String pk = "03420004AE179895745EDF2C7822BA15487F9B2FCC978597780A4EF228EC5B70AC7073174B8F457505BE4611809932170730EA0D325A12971C6699B0E51943369E1802D2"; + String sign = "MEUCICCTC1KiPkaftcCRfvMRrrxG1cc21zPWqgDbQHUV7NCKAiEAjO+Kdixwp2mJu5OTdBbwqCOzWslmkZ3QVdxlTcUqKEo="; + + // 这里,不管是签名还是验签,都需要在外部做一次hash。 + byte[] hash = api.SM3Hash(pk, orgData.getBytes("gbk")); + + System.out.println("hash: " + Util.bytes2HexString(hash)); + + boolean b = api.SM2Verify(SydApi.DATA_HASH, Util.hexString2Bytes(pk), hash, sign); + System.out.println("验签结果: " + b); + } + // 测试通过 // 75 @Test @@ -1669,6 +1771,7 @@ public class TestAllMethods { String s = api.SM2SignC(1, "111111111111115100100000001", Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes()); + // gVIu3Ng+/pysU8uwRKBgouhqqA5fA9Qtr6OpgL3KD8+M+m4XzKQcAydr+87XFeGzxiow0CEagbcffRgEtewR9w== System.out.println(s); System.out.println("DecBase64:" + Util.bytes2HexString(Base64.getDecoder().decode(s))); boolean b = api.SM2Verify( Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes(), s); @@ -1729,6 +1832,7 @@ public class TestAllMethods { String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); System.out.println("加密后的数据: " + s); + System.out.println("解base64格式之后: " + Util.bytes2HexString(Base64.getDecoder().decode(s))); byte[] pOrgData = SYMUtil.base64EnData2DerEnData(s); System.out.println("加密后的数据解base64-2: " + Util.bytes2HexString(pOrgData)); @@ -1737,16 +1841,35 @@ public class TestAllMethods { System.out.println("decData:" + new String(bytes)); } + // 测试通过 + // 78 + @Test + public void testSYD_SM2_Encrypt() { + + String sk="00010000C5AA43F372B01220C25406046EECBDAFEBD2206A6E4C8401DB6C54FE35DD4D520000000000000000000000000000000000000000000000000000000000000000"; + String publicKey = "03420004C0D1A2FB87B51F22D490EA88301EB210BD6C9A6C21DA4D4BFF1ED2E70622909F58A6A3A55308D1CE46CF9A58090E6BA3BC34A6625D1765D87F9A0557CCFBC244"; + String orgData = "FFFFFFFFFFF1111111111FFFFF"; + + byte[] encData = api.SYD_SM2_Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); + System.out.println("加密后的数据: " + Util.bytes2HexString(encData)); + + byte[] bytes = api.SYD_SM2_Decrypt(Util.hexString2Bytes(sk), encData); + System.out.println("decData:" + new String(bytes)); + } + // 测试通过 // 78 @Test public void testSM2DecryptOrder() { String certId = "1111111111111151"; String publicKey = "034200048043AF118B45629857DB693105849B2617FED249D59DFD29BE9A891ADEE7441A2D8C62020953DAEF038184E0244310CF2123C507F26F5380FFECC8D53E79B24E"; - String orgData = "FfffffffffffffFfffffffffffffffff"; + String orgData = "FFFFFFFFFFF1111111111FFFFF"; String s = api.SM2EncryptOrder(Util.hexString2Bytes(publicKey), orgData.getBytes()); System.out.println("加密后的数据: " + s); + System.out.println("解base64格式之后: " + Util.bytes2HexString(Base64.getDecoder().decode(s))); + byte[] pOrgData = SYMUtil.base64EnData2DerEnDataC1C2C3(s); + System.out.println("加密后的数据解base64-2: " + Util.bytes2HexString(pOrgData)); byte[] bytes = api.SM2DecryptOrder(certId, s, SydApi.FOR_ENCRYPT); @@ -1764,9 +1887,11 @@ public class TestAllMethods { // E0 @Test public void testSYMEncryptData() { + String sm4Key = "XF356BCBA3204F6E6F356BCBA3204F6E6"; - byte[] bytes = api.SYMEncryptData(SydApi.NALG_SM4,"XF356BCBA3204F6E6F356BCBA3204F6E6", "1111111111111111".getBytes()); - byte[] bytes1 = api.SYMDecryptData(3, "XF356BCBA3204F6E6F356BCBA3204F6E6", bytes); + byte[] bytes = api.SYMEncryptData(SydApi.NALG_SM4,sm4Key, "1111111111111111".getBytes()); + System.out.println("密文:" + Util.bytes2HexString(bytes)); + byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sm4Key, bytes); System.out.println(new String(bytes1)); } @@ -1864,6 +1989,8 @@ public class TestAllMethods { "CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" + "qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0"; + + X509 x509 = api.SYD_Get_X509_CertInfo_HA(orgData.getBytes(), sign); System.out.println(Util.bytes2HexString(x509.getPubKey())); } @@ -1887,10 +2014,49 @@ public class TestAllMethods { "uY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUypxjmN7VBcoruhBRWmmFNv9yG1IwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYIKoEcz1UBg3UFAANJADBGAiEA1IQTRQf5aaDJzzVxWLRml1ZSqQd9FPFeKZJnbzGQIQMCIQD/gY5+H1nytcVAx8hGtUPssklmI+9+vTdOF5LaKMR+jzGB3T" + "CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" + "qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0"; - String s = CoderUtil.certAddHT(pCert1); + + String pCert2 = "MIIDATCCAqWgAwIBAgIUKGNCcRdvF5KJOxRb401NHRTCSogwDAYIKoEcz1UBg3UFADCBjTFHMEUGA1UEAww+U2hlbiBaaGVuIGlUcnVzQ2hpbmEgQ2xhc3MgRW50ZXJwcmlzZSBTdWJzY3JpYmVyIENBIFNNMiAtIFRlc3QxGDAWBgNVBAsMD+a1i+ivlemDqOivleeUqDEbMBkGA1UECgwS5aSp6K+a5a6J5L+h6K+V55SoMQswCQYDVQQGEwJDTjAeFw0yMjAyMTUwMzA1MzVaFw0yMzAyMTUwMzA1MzVaMIGNMTAwLgYDVQQGDCfkv6Hpm4Xovr7ns7vnu5/lt6XnqIvogqHku73mnInpmZDlhazlj7gxMDAuBgNVBAoMJ+S/oembhei+vuezu+e7n+W3peeoi+iCoeS7veaciemZkOWFrOWPuDEVMBMGA1UECwwM5rWL6K+V6YOo6ZeoMRAwDgYDVQQDDAdzdW55YXJkMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEcKKvHjHE9Y2exfJfYZOeWffq2A5k6RRUbBhMsjCKK3eciz1WkDGIdjAgW/VI++MMITimKMXq0bwnnmo2PTNvfqOB3jCB2zAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFIDBqBgNVHR8EYzBhMF+gXaBbhllodHRwOi8vc3p0b3BjYS5zeml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9NzMzNUExQUYzNzRBMUU4QjQwM0FCMUFDMkQwNjVDQUU3NUNBQjIzNjAfBgNVHSMEGDAWgBQrRjpP0Z4sztQfhsLWPZq/Jyhk9zAdBgNVHQ4EFgQUG6xZRL5VQ+DonJX4crqkUphJIA4wFQYHYIEcAQYKAgQKDAhJVFJVU0tNQzAMBggqgRzPVQGDdQUAA0gAMEUCIQCdLHm9pjihzyR9A5uXrTo4UC+Rpcm5vPGh4Do58bqRKgIgLpryVWqLVb8GqL91KdmXd7E7RrG7DjqiworD9TEmnLY="; + String s = CoderUtil.certAddHT(pCert2); System.out.println(s); X509 x509 = api.GetX509CertInfo(s); - System.out.println(x509); + System.out.println("公钥" + Util.bytes2HexString(x509.getPubKey())); + System.out.println("sn:" + x509.getSerialNumber()); + System.out.println("dn:" + x509.getSubject()); + System.out.println("getCert:" + x509.getCert()); + System.out.println("getIssuer:" + x509.getIssuer()); + System.out.println("getNotAfter:" + x509.getNotAfter()); + System.out.println("getNotBefore:" + x509.getNotBefore()); + } + + + @Test + public void testGetX509CertInfo2() { + + String pCert = "-----BEGIN CERTIFICATE-----\\r\\nMIIC0DCCAnSgAwIBAgIFEEBzAUEwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJD\\r\\nTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y\\r\\naXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjAxMTAzMDk1NTU4\\r\\nWhcNMjUxMTAzMDk1NTU4WjB1MQswCQYDVQQGEwJDTjEQMA4GA1UECgwHT0NBMVNN\\r\\nMjENMAsGA1UECwwEdGVzdDEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMjEqMCgG\\r\\nA1UEAwwhMDUxQGNoaW5hdW5pb25wYXlAWjkwNTI5MDAwMDAwOEAyMFkwEwYHKoZI\\r\\nzj0CAQYIKoEcz1UBgi0DQgAEkw27RvY8mAx6h7vnSW/+X3b++a1E6LzQTPWMOiKP\\r\\nAfZTqJMKeRnQNEKt+N7EA98YHVheOCT9TlZ3fkgtNZcH86OCAQYwggECMB8GA1Ud\\r\\nIwQYMBaAFGv+GNqPQjqmuG2zLoiDOjSiwTDhMAwGA1UdEwEB/wQCMAAwSAYDVR0g\\r\\nBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2Eu\\r\\nY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNy\\r\\nbC5jZmNhLmNvbS5jbi9TTTIvY3JsMTM3MzYuY3JsMA4GA1UdDwEB/wQEAwIGwDAd\\r\\nBgNVHQ4EFgQUn9wz++O90r2Bc7qlzqeIhIVivD4wHQYDVR0lBBYwFAYIKwYBBQUH\\r\\nAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIgNXTJts3vqvCbbhUKwnkI\\r\\nrv+HeDeyTwU4JJpBTWCR6TACIQCtQShpYt9jgxw6VSHpKEXnnWH9u4vYhXDoH42w\\r\\nWVaX6A==\\r\\n-----END CERTIFICATE-----"; + + String pCert2 = "-----BEGIN CERTIFICATE-----\n" + + "MIIDUjCCAjoCCQDEXN6JVLqjQzANBgkqhkiG9w0BAQsFADBrMQswCQYDVQQGEwJj\n" + + "bjELMAkGA1UECAwCemoxCzAJBgNVBAcMAmh6MQwwCgYDVQQKDAN4eWQxDTALBgNV\n" + + "BAsMBGFxeXkxCzAJBgNVBAMMAnpiMRgwFgYJKoZIhvcNAQkBFgkyMkBxcS5jb20w\n" + + "HhcNMjExMTE5MDc1NDM1WhcNMjExMjE5MDc1NDM1WjBrMQswCQYDVQQGEwJjbjEL\n" + + "MAkGA1UECAwCemoxCzAJBgNVBAcMAmh6MQwwCgYDVQQKDAN4eWQxDTALBgNVBAsM\n" + + "BGFxeXkxCzAJBgNVBAMMAnpiMRgwFgYJKoZIhvcNAQkBFgkyMkBxcS5jb20wggEi\n" + + "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrOL1rh39AzMJYD6bPmumW0aUi\n" + + "JW1U9SgGYF4FBFoN7DnfgSe9dDg6FIiT81kfqz+ydeACsFCkfdjXhsrI/SEvtkK6\n" + + "/Y3PMzMys01xKFoZywaOf4s9jSQXhDQxs82HgPkHAVGmIOdIzGV0MGaPyGKaUyLQ\n" + + "s3bYBO656rLFEuNGM6Hr0r6PtEEBvBoveK3CcYVZL9KzeOEQAXJlYMD1T7xetgZu\n" + + "obl/cbC2fmNA4xRqNA+qxherzF91zC2G0WMYdPubGkAaXFfiVUwuazCpQ60AECIy\n" + + "sYnR2m8+hbCEujTYrd2Na+a0e4T/HSzsN5lZ5dl8UMJ7pMsc/hH176fy+39LAgMB\n" + + "AAEwDQYJKoZIhvcNAQELBQADggEBACNyTOW6Glb6/jWBLJRmob09b/DA0xGSyRAM\n" + + "Qwij6ch1GInO3LKfkIiuty8EGHADRraZk6igUAthAMPInPy6P+CNvGx5U3qRk0nT\n" + + "hChQ23AkkBpzvr+7LmLFid3mmgnGwPUBJtor6ylCZbG2lIpUBrWQhHqRqWYiv3N1\n" + + "nnOQRe1pWdk/Jw3m7mlXO1xKb0XeFQ8bLZG15b6qgkWeyTnGju5+NPMNV3U3w9WE\n" + + "tHW9v9xxFj/++3+U0pMaYwhKz8PA7qVfiPiEIsU1SAiQRPwUUODZG+YYAz2lSOHS\n" + + "TN36nYmVbVuWMguNPKKXY2b2mosnU6t0xtXWHxMhVCF4Slity9s=\n" + + "-----END CERTIFICATE-----"; + + X509 x509 = api.GetX509CertInfo(pCert2); + System.out.println(Util.bytes2HexString(x509.getPubKey())); } // 测试通过