配合网联接口

This commit is contained in:
yihzhou 2023-11-13 15:31:29 +08:00
parent 62598e0c89
commit ffd19acbfc
4 changed files with 398 additions and 1 deletions

66
DProto/GN.xml Normal file
View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" ?>
<packet extend="base">
<req>
<command>
<hex>GN</hex>
</command>
<data extend="data">
<Esign len="1" cn="E值">
<text>1</text>
</Esign>
<keyLen len="4" cn="密钥长度">
<text>2048</text>
</keyLen>
<sk len="27" cn="私钥索引"></sk>
<startTime len="8" cn="启用时间"></startTime>
<endTime len="8" cn="到期时间"></endTime>
</data>
</req>
<res>
<command>
<hex>QO</hex>
</command>
<data>
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
<options>
<option cn="无错误">
<hex>00</hex>
</option>
<option cn="无效的哈希标识">
<hex>05</hex>
</option>
<option cn="输入数据错">
<hex>15</hex>
</option>
<option cn="DSP 错误">
DSP 错误;报告给管理员。
<hex>47</hex>
</option>
<option cn="输入数据长度错误">
<hex>80</hex>
</option>
</options>
</error>
<pk len="270" cn="公钥"></pk>
<sk len="2824" cn="私钥"></sk>
</data>
</res>
<script> </script>
</packet>

View File

@ -170,6 +170,99 @@ public class SydApi4j implements SydApi {
return r;
}
public RetWrap SYD_SM2GenKeyPair(String userId, int nKeyType) {
ProtoQN proto = new ProtoQN();
String sk = "999999999999999999999999999";
if (userId != null) {
sk = SYMUtil.genPrivateKeyMark(userId, nKeyType == 0 ? "000" : "001", "00000001");
}
HashMap<String, Object> packet = new HashMap();
HashMap<String, Object> data = new HashMap();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("sk", sk);
// data.put("startTime", "20220101");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date dt = new Date();
String startTime = sdf.format(dt);
data.put("startTime", startTime);
data.put("endTime", "20990101");
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
bb = this.syncRead(this.syncSend(bb));
}
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);
} else {
ret = (Map) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if ((be[0] ^ be[1]) != 0) {
throw new SydApiException(error.getInfo(), error.autoInt());
} else {
String pkv = ((PacketSection) ret.get("pk")).getString();
String skv = ((PacketSection) ret.get("sk")).getString();
RetWrap r = new RetWrap();
r.put("publicKey", "03420004" + pkv);
r.put("privateKey", skv);
return r;
}
}
}
public RetWrap SYD_RSAGenKeyPair(String userId, int nKeyType) {
ProtoGN proto = new ProtoGN();
String sk = "999999999999999999999999999";
if (userId != null) {
sk = SYMUtil.genPrivateKeyMark(userId, nKeyType == 0 ? "000" : "001", "00000001");
}
HashMap<String, Object> packet = new HashMap();
HashMap<String, Object> data = new HashMap();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("sk", sk);
// data.put("startTime", "20220101");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date dt = new Date();
String startTime = sdf.format(dt);
data.put("startTime", startTime);
data.put("endTime", "20990101");
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
bb = this.syncRead(this.syncSend(bb));
}
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);
} else {
ret = (Map) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if ((be[0] ^ be[1]) != 0) {
throw new SydApiException(error.getInfo(), error.autoInt());
} else {
//String pkv = ((PacketSection) ret.get("pk")).getString();
byte[] pkv = ((PacketSection) ret.get("pk")).getBytes();
String skv = ((PacketSection) ret.get("sk")).getString();
RetWrap r = new RetWrap();
// r.put("publicKey", "03420004" + pkv);
r.put("publicKey", Util.bytes2HexString(pkv));
r.put("privateKey", skv);
return r;
}
}
}
@Override
public String SYD_SM2_Get_Id_PublicKey_HA(
String pUserID,

View File

@ -21,7 +21,8 @@ public class Test4Nongxin {
private static final byte[] orgData = new byte[ 2*1024 ];
private static final byte[] orgDataBig = new byte[ 10*1024 ];
public static void main(String[] args) {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
System.setProperty("com.sunyard.sydapi4j.debug", "true");
System.setProperty("com.sunyard.dnsort", "true");
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build();

View File

@ -0,0 +1,237 @@
package sample;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
/**
* @AuthorCheney
* @Date2023/8/19 16:24
*/
public class Test4WL {
private SydApi4j api;
final String SM2dn = "C=CN,O=1,OU=1,CN=1";
final String RSAdn = "C=CN,O=2,OU=2,CN=2";
byte[] orgData = new byte[100];
@Before
public void before() {
// 通过设置debug的属性开启debug如果不设置则默认不打开
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("172.16.18.91", 8889, null, 1000);
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
//sm2算法
public void sm2sign(){
/**
* 正常证书 SM2 P1 裸签签名
* @param orgData 原始数据
* @param sm2Dn 签名者证书 DN
* @param hash 摘要hash
* @return 裸签签名数据
*/
byte[] nakedSign = api.SYD_NakedSign(SM2dn, orgData, (byte[]) null);
boolean b = api.SYD_NakedVerify(SM2dn, nakedSign, orgData, (byte[]) null);
}
@Test
//sm2算法
public void sm2signhash(){
byte[] sm3Hash = api.SM3Hash(orgData);
byte[] nakedSign = api.SYD_NakedSign(SM2dn, null, sm3Hash);
boolean b = api.SYD_NakedVerify(SM2dn, nakedSign, null, sm3Hash);
}
@Test
//rsa算法
public void rsasign(){
/**
* 正常证书 SM2 P1 裸签签名
* @param orgData 原始数据
* @param sm2Dn 签名者证书 DN
* @param hash 摘要hash
* @param rFlag 摘要算法标识
* @return 裸签签名数据
*/
byte[] nakedSign = api.SYD_NakedSign(2, RSAdn,orgData,(byte[])null);
boolean b = api.SYD_NakedVerify(2, RSAdn, nakedSign, orgData, (byte[]) null);
}
@Test
//rsa算法
public void rsasignhash(){
byte[] hash = api.itHash(2, orgData);
byte[] nakedSign = api.SYD_NakedSign(2, RSAdn,null,hash);
boolean b = api.SYD_NakedVerify(2, RSAdn, nakedSign, null, hash);
}
@Test
//sm2数字信封加密解密
public void sm2gen(){
/**
* SM2数字信封生成
* @param sm2Dn 证书DN
* @param orgData 原始数据
* @return 加密后的数据
*/
RetWrap genByDn = api.generateDEByDn(SM2dn, orgData);
byte[] cipherKey = (byte[]) genByDn.get(SydApi.RET_CIPHER_KEY);
System.out.println("SM2数字信封: " + new String(cipherKey));
/**
* SM2数字信封解密
* @param sm2Dn 证书DN
* @param cipherKey 数字信封加密数据
* @return 解密后的数据
*/
RetWrap denSM2 = api.decryptDEByDN( SM2dn, cipherKey);
byte[] oData = (byte[]) denSM2.get("oData");
System.out.println("SM2信封解密"+ Util.bytes2HexString(oData));
}
@Test
//rsa 数字信封解密
public void rsagen(){
/**
* RSA数字信封生成
* @param alg 默认为4 RSA数字信封格式
* @param rsaDn 证书DN
* @return 加密后的数据
*/
RetWrap genByDnRSA = api.generateDEByDnRSA(5,RSAdn, orgData);
byte[] cipherKeyRSA = (byte[]) genByDnRSA.get(SydApi.RET_CIPHER_KEY);
System.out.println("RSA数字信封: " + new String(cipherKeyRSA));
/**
* RSA数字信封解密
* @param alg 默认为4 RSA数字信封格式
* @param rsaDn 证书DN
* @param cipherKeyRSA 数字信封加密数据
* @return 解密后的数据
*/
RetWrap denRSA = api.decryptDEByDNRSA(5, RSAdn,cipherKeyRSA);
byte[] oData = (byte[]) denRSA.get("oData");
System.out.println("RSA信封解密"+Util.bytes2HexString(oData));
}
@Test
//非对称加密解密
public void sm2genKey(){
/**
* 生成非对称密钥
* @param userId 密钥索引
* @param nKeyType 密钥用途 0签名 1加密 默认为0
* @return 公私钥对
*/
RetWrap ret1 = api.SYD_SM2GenKeyPair("3334", 0);
String pk = (String) ret1.get("publicKey");
System.out.println("公钥:"+pk);
String sk = (String) ret1.get("privateKey");
System.out.println("私钥:"+sk);
}
@Test
public void sm2ende(){
String PublicKey ="0342000465CF1C97434A84B1AD48C61687C29FD7E19CD97D4AA7C5729AE6A734216A9E9CF6922E5BB575286ADA1BF284954F927BC4C0963BCA9923EB5EF77D733047AD5D";
String PrivateKey="1E7E958B645C5B662EC73D91EEF2116AEC46B7165A26D3C5A30602BBE100DBBA";
/**
* 非对称密钥加密
* @param publicKey 公钥钥串DER 编码HEX 格式
* @param orgData 原始数据
* @return 加密的数据 base64 编码
*/
String sm2Encrypt = api.SM2Encrypt(Util.hexString2Bytes(PublicKey), orgData);
System.out.println("SM2加密"+sm2Encrypt);
/**
* 非对称密钥解密
* @param sk 私钥DER 编码HEX 格式
* @param sm2Encrypt 待解密的数据
* @param userId 密钥索引
* @return 解密后的数据
*/
byte[] sm2Decrypt = api.SM2Decrypt(Util.hexString2Bytes(PrivateKey), sm2Encrypt);
System.out.println("SM2解密"+Util.bytes2HexString(sm2Decrypt));
}
@Test
public void rsagenKey(){
/**
* 生成非对称密钥
* @param userId 密钥索引
* @param nKeyType 密钥用途 0签名 1加密 默认为0
* @return 公私钥对
*/
RetWrap ret1 = api.SYD_RSAGenKeyPair("2244", 0);
String pk = (String) ret1.get("publicKey");
System.out.println("公钥:"+pk);
String sk = (String) ret1.get("privateKey");
System.out.println("私钥:"+sk);
}
@Test
public void rsaende(){
String PublicKey ="3082010A0282010100BB7A3E7738AD388FFC70384F94B0D28E371F085A9FAAF294757540ED042E22C5DBE8F724F2BBB0C096E39AB6FAA53DB565470AC9111B38794E535613E6A029964C961DB9FD6C6C4B4D67C6D03CD00C0A23CE7D87FF57EFD0D2DFB55D540090607788FE133B7278868D9E2C2C4096714AC7262A24840CBFB153C1B4B9065513297BB45145B4271427D1388F47A81EBA10DABE5D6C204C425B599B052334B3BA62225E744F0779F094EA762386358BA2048CE954877789C9E3ED8309A6BFE74DC465B50DC3E8DA4D3C2DAF1CC60368D897F50CCE75454B1F8079AD05438A6B8674578D2E933DFF4A8BA62E14D600FBECC4AC0B87F87BE908F1EE8C424C6963A4650203010001";
String PrivateKey="0008000029F1A527C90D0218CE7DDBB1AF9AF62DA63C8367D11282882823FA078DB80C0023EF7798498D1F28DF24586E58CB238B74A40D3500114D94712789580EFF7DC37DF8A5D8603F7A7AE5C3E428A0A6B8152492B5BCE7402DB910D331B3E8C107C2367D93454FD772838C4620E5AD89670025006B335B0908ED6472950A1CBD56C482B8AA1C59051A2A4B79680B8A4405C0A61AB91BF6D55E902154221A100EA35A599FA76A5565E21F9DDF02EDA99C352C8239620E4577246DE2016CBAC91411C376250BA2C93ACFEA76CF71BC2E3D45786060FEC0CFC262320FEC64C0B2FB2B8F2434C5E31595D0372EF101EE190CA08990DB15BE986284BDF917C0267BE389C326406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD526406EB1FF655BD507DB20DEBFFDD441665A886120DC74C762DD83A122CA4BE25535C1DE3D1AE57E5CE157E90F0A1BF82CD8356B33B17C7021C3BB46055AB094B6DD2BCD75AF0E6AA0F0FD9C235940B4C999726C2636399938BF3ACD0DD8001DF706AA6EB919168B46D20D5856A7217CD397512FF0697FA61FAE015BC3A204ACF670C9372289468137B2D9782E28CE95A74195228CAD601AA571DCFF5F2AABE5378688F0D4685DFDFEBC0C82FAC2645A62510ACDD8BD59C9712BC0408F11ABFD7B39FD3DBFE4FBA1357406BFCCAD4C3B035050603EA7DF322142DBBBAA9EEA6BBF02DD6B7D940648B6F9947530AA0F1A34BAA1BDC5AD5D30BBBD5E17F75CC2D418A63773383D1C83A10BD7C5011CF340BAA36CDEF541B9CE87CB0C80D0232D6F02D4F9CEAC7A470187CB5ABDC3BB97FD5A6804FE2FDF8018478C7F6B89371D7BFE7708B528A29314860280D9361731BC9C1436675D63C59FB3C9D09094D24F5FA201352B12225A0809811B3EA335ABEF8C2F6BAA2CBEF3F7FFC2E7417927229FCF11F8ACEC3D04F916CA9C348894987BF3EAEDD73542E394101BD5E974771C6FA2AB7E853BDF7058F6EC85A35B87124B574642BF2754747DA13A607037F748E8440BA474C04B575FB494C30BD19239BCDBF1C6A75B97BC6B4746D360A5C5E61C672D35E784A8195D55A2F05744CFAFC2DC987ACC1DE00950B326A66F00CE8E443B27FF0DFD596B33A43F66062C08B5C7A6D008DE8AC457E758FACA6586712E4535F389F29383E6A07FC60023C6627EB01EAEA4F4E55749237910B363D16DBCFC5E9524A4DE1B08AC6ECEB50DBA8176F0E864CB28F74E018B654B2BD8568E97B4C87BB024BE2582FA3FC01BBC2E1CC8993EA9842194AF3A4761E0B316DC2698746E3AF6253589BCDBC7F8818CD4BBC563C740A680FEB5589213E075D206B8498031FC874B565948FAED3D8381674E8013E2B3DB9AA153B6C087B041F3CA565DB3287B6ED16D3431D1F241449287A98DFFF59A505D41F41993DA2FB2189B056A58F261AAD46CAA683C0D3E6F631D426517769F9D53D9712F65B4F1B5125FBE9F60AE3B4910B9E1B39C49143E01F4ED744DE14A2A416DE125BC0137B8A967406B4122E26392537B6208DA4271BD34EED535DDEB2CA281145FC8E13DA2CF1F026858D86DA5EDE13BA577173158B0E4DBF57164A4E443210054B0CE41706CED0E3E08A86C4D286EFA47E51934F65B871E923B0F607DB6211E4EF12671F9FA93B0F476527D788A7CC47DB46F527B877E7CE87A";
/**
* 非对称密钥加密
* @param publicKey 公钥钥串DER 编码HEX 格式
* @param orgData 原始数据
* @return 加密的数据 base64 编码
*/
String RSAEncrypt = api.RSAEncrypt(PublicKey, orgData);
System.out.println("RSA加密"+RSAEncrypt);
/**
* 非对称密钥解密
* @param sk 私钥DER 编码HEX 格式
* @param RSAEncrypt 待解密的数据
* @param userId 密钥索引
* @return 解密后的数据
*/
byte[] RSADecrypt = api.RSADecrypt(PrivateKey, RSAEncrypt);
System.out.println("RSA解密"+Util.bytes2HexString(RSADecrypt));
}
}