diff --git a/DProto/GN.xml b/DProto/GN.xml new file mode 100644 index 0000000..1a9f184 --- /dev/null +++ b/DProto/GN.xml @@ -0,0 +1,66 @@ + + + + + + GN + + + + + 1 + + + + 2048 + + + + + + + + + + + + + + + + + + QO + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index d93e030..dd2458c 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -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 packet = new HashMap(); + HashMap 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 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 packet = new HashMap(); + HashMap 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 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, diff --git a/src/test/java/sample/Test4Nongxin.java b/src/test/java/sample/Test4Nongxin.java index 4251a75..f30ccb5 100644 --- a/src/test/java/sample/Test4Nongxin.java +++ b/src/test/java/sample/Test4Nongxin.java @@ -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(); diff --git a/src/test/java/sample/Test4WL.java b/src/test/java/sample/Test4WL.java new file mode 100644 index 0000000..95a172c --- /dev/null +++ b/src/test/java/sample/Test4WL.java @@ -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; + +/** + * @Author:Cheney + * @Date:2023/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)); + } + + + + + + +} +