From ffd19acbfccbdb316efe28894bdbd24e54554da3 Mon Sep 17 00:00:00 2001
From: yihzhou <468340218@qq.com>
Date: Mon, 13 Nov 2023 15:31:29 +0800
Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E5=90=88=E7=BD=91=E8=81=94=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
DProto/GN.xml | 66 +++++
.../java/racal/sunyard/main/SydApi4j.java | 93 +++++++
src/test/java/sample/Test4Nongxin.java | 3 +-
src/test/java/sample/Test4WL.java | 237 ++++++++++++++++++
4 files changed, 398 insertions(+), 1 deletion(-)
create mode 100644 DProto/GN.xml
create mode 100644 src/test/java/sample/Test4WL.java
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));
+ }
+
+
+
+
+
+
+}
+