添加78指令所对应的sm2加解密接口SYD_SM2_Encrypt和SYD_SM2_Decrypt,返回的加密后的数据为der编码的数据

This commit is contained in:
zhoubin 2022-03-02 14:59:52 +08:00
parent 2a8436afca
commit 85edd173ae
5 changed files with 269 additions and 14 deletions

Binary file not shown.

View File

@ -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格式

View File

@ -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 格式的签名

View File

@ -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<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
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<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) 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<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
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<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) 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 格式

View File

@ -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()));
}
// 测试通过