diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index dfffa30..abe8fc7 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/src/main/java/com/sunyard/inf/SydGenApi.java b/src/main/java/com/sunyard/inf/SydGenApi.java index bc1fe66..55cbd76 100644 --- a/src/main/java/com/sunyard/inf/SydGenApi.java +++ b/src/main/java/com/sunyard/inf/SydGenApi.java @@ -44,7 +44,7 @@ public interface SydGenApi { /** * 生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥) - * @param mode 是否产生ZMK加密下的密钥 + * @param mode 是否产生ZMK加密下的密钥,0-产生密钥。1-产生密钥并在ZMK下加密 * @param keyType 密钥类型 * @param solution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。 * @param zmk zmk diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index c223fd4..bd0ecce 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -9258,6 +9258,119 @@ public class SydApi4j implements SydApi { */ @Override public RetWrap exportKeyAndCalc(String protectedKeyIndex, int algFlag, byte[] iv, int protectedKeyDivNum, List protectedKeyDivData, int[] protectedKeyDivAlgFlag, List protectedKeyDivIv, int exportKeyNum, List structList) { + // 填充数据 + PacketSN sn = PacketSN.gen(); + + ByteBuffer bb = ByteBuffer.allocate(2048); + + byte[] ret = new byte[2]; + bb.put(ret); + bb.put(sn.getSn().array()); + bb.put("S9".getBytes()); + + // 保护密钥索引 + String gId = "00000000" + protectedKeyIndex; + gId = gId.substring(gId.length() - 8); + bb.put(("0000000000000000000" + gId).getBytes()); + + // 保护密钥算法 + int algorithmKey = MyUtil.transAlg(algFlag); + bb.put(String.format("%02d", algorithmKey).getBytes()); + + if (6==algorithmKey || 8==algorithmKey || 2==algorithmKey || 4==algorithmKey || 10==algorithmKey) { + // IV 数据域 + bb.put(iv); + } + + // 保护密钥分散级数 + bb.put(( String.valueOf( protectedKeyDivNum ) ).getBytes()); + + if (protectedKeyDivNum != 0) { + // 分散因子 + for (int i = 0; i < protectedKeyDivData.size(); i++) { + bb.put(protectedKeyDivData.get(i)); + } + + // 分散算法标识 + for (int i = 0; i < protectedKeyDivAlgFlag.length; i++) { + bb.put(String.format("%02d", MyUtil.transAlg(protectedKeyDivAlgFlag[i])).getBytes()); + } + + // 分散算法的初始向量 + for (int i = 0; i < protectedKeyDivIv.size(); i++) { + bb.put(protectedKeyDivIv.get(i)); + } + } + + // 导出的密钥索引个数 + bb.put(String.format("%02d", exportKeyNum).getBytes()); + + //导出的密钥结构体 + byte[] b = new byte[ 144 * exportKeyNum ]; + int destPos=0; + for(Struct struct:structList){ + System.arraycopy(struct.getByte(),0,b,destPos,struct.getByte().length); + destPos+=struct.getByte().length; + } + bb.put(b); + + int len = bb.position() - 2; + + bb.put(0, (byte) (0xFF & (len / 256))); + bb.put(1, (byte) (0xFF & (len % 256))); + + synchronized (this) { + bb = syncRead(syncSend(bb)); + } + + bb.flip(); + + // 00240000000000000000533A + // 3030 + // 5D0D63E2C673934E5677E902C155F54F3FBE8E53D709F32E + + // 解析头部 + bb.get(new byte[2], 0, 2); + + // 解析header + byte[] header = new byte[8]; + bb.get(header, 0, 8); + + // 解析协议 + bb.get(new byte[2], 0, 2); + + if (!Arrays.equals(sn.getSn().array(), header)) { + throw new SydApiException("包序号不匹配", -4); + } + + // 检测错误 + byte[] error = new byte[2]; + + bb.get(error, 0, 2); + + int e = Util.a2i(error, 16); + + if (0 != e) { + throw new SydApiException(0x80 == e ? "数据长度错" : "输入长度错", e); + } + + // 依次连接所有密钥密文输出 + byte[] linkKeyOut = new byte[exportKeyNum * 16]; + bb.get(linkKeyOut, 0, exportKeyNum * 16); + + // 依次连接所有密钥校验值输出 + byte[] linkKeyCheckOut = new byte[exportKeyNum * 8]; + bb.get(linkKeyCheckOut, 0, exportKeyNum * 8); + + RetWrap retWrap = new RetWrap(); + retWrap.put("linkKeyOut", linkKeyOut); + retWrap.put("linkKeyCheckOut", linkKeyCheckOut); + + return retWrap; + } + + private RetWrap _exportKeyAndCalc(String protectedKeyIndex, int algFlag, byte[] iv, int protectedKeyDivNum, List protectedKeyDivData, int[] protectedKeyDivAlgFlag, List protectedKeyDivIv, int exportKeyNum, List structList) { + ProtoS9 proto = new ProtoS9(); HashMap packet = new HashMap(); HashMap data = new HashMap(); diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 6dbf50d..ca97706 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -14,7 +14,8 @@ public class TestAllMethods { @Before public void before() { System.setProperty("com.sunyard.sydapi4j.debug", "true"); - api = (SydApi4j) new SydApi4j().connect("172.16.17.163", 8889, null, 1000); +// api = (SydApi4j) new SydApi4j().connect("172.16.17.163", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000); } @After @@ -26,7 +27,14 @@ public class TestAllMethods { } } - // 1.1.1 对称密钥产生 + public void printRetWrap(RetWrap rw) { + for (String s : rw.keySet()) { + System.out.println(s + ":" + rw.get(s)); + } + } + + // A0 1.1.1 对称密钥产生, + // 验证成功 @Test public void testGenSymmetricKey() { RetWrap retWrap = api.genSymmetricKey("000", 'X'); @@ -36,19 +44,58 @@ public class TestAllMethods { System.out.println("keyCheck:" + keyCheck); } - // 1.1.2 对称密钥产生, 对比之前添加了可产生ZMK加密下的密钥 + // 002D3030303030303030 + // 4130 + // 31 + // 303030 + // 58 + // 534B393939393939393939393939303030303030303030303030303030 + // 58 + + // A0 1.1.2 对称密钥产生, 对比之前添加了可产生ZMK加密下的密钥, + // 验证成功 @Test public void testGenSymKey() { -// RetWrap retWrap = api.genSymKey(0, "000", 'X', null); -// String lmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("lmkKey")))); -// String keyCheck = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("keyCheck")))); -// System.out.println("lmkKey:" + lmkKey); -// System.out.println("keyCheck:" + keyCheck); - - RetWrap retWrap = api.genSymKey(1, "000", 'X', "1"); + // 此密钥方案为: 1A+K+27位的索引号 + RetWrap retWrap = api.genSymKey(1, "000", 'X', "SK999999999999000000000000000"); String lmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("lmkKey")))); + String zmkKey = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("zmkKey")))); String keyCheck = new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) retWrap.get("keyCheck")))); System.out.println("lmkKey:" + lmkKey); + System.out.println("zmkKey:" + zmkKey); System.out.println("keyCheck:" + keyCheck); } + + // 00000000 + // A4 + // 2 + // 000 + // X + // 密钥成份1:X0404894E7B8DE129B4FF4EF9889E56A2 + // 密钥成份2:X94D35D86EF1F3213D55C47822F87D385 + + // A4 + @Test + public void testComposeKey() { + String[] strs = {"583034303438393445374238444531323942344646344546393838394535364132", "583934443335443836454631463332313344353543343738323246383744333835"}; + RetWrap rw = api.composeKey("000", strs); + + printRetWrap(rw); + } + + // 00000000 + // A6 + // 000 + // ZMK:XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB + // ZMK下加密的密钥:X94D35D86EF1F3213D55C47822F87D385 + // X + @Test + public void testInputKey() { + RetWrap retWrap = api.inputKey("000", '0', "XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB", "X94D35D86EF1F3213D55C47822F87D385"); + + printRetWrap(retWrap); + } + + // 00000000A8000XAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBX0404894E7B8DE129B4FF4EF9889E56A2X +// public void test } diff --git a/src/test/java/com/sunyard/sydapi/test/TestZY.java b/src/test/java/com/sunyard/sydapi/test/TestZY.java index b48dae7..16b3b76 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestZY.java +++ b/src/test/java/com/sunyard/sydapi/test/TestZY.java @@ -3,11 +3,15 @@ package com.sunyard.sydapi.test; import com.sunyard.RetWrap; import com.sunyard.entity.Struct; import com.sunyard.proto.Util; +import com.sunyard.proto.value.Str; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import racal.sunyard.main.SydApi4j; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -22,6 +26,8 @@ public class TestZY { String key4 = "X87654321876543218765432187654321"; String key5 = "1234567812345678"; String key7 = "12345678123456781234567812345678"; + private static final Logger log= LoggerFactory.getLogger(TestZY.class); + @Before public void before() { @@ -29,7 +35,8 @@ public class TestZY { // api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("47.118.63.165", 46889, null, 15000); api = (SydApi4j) new SydApi4j().connect("192.168.0.99", 8889, null, 3000); - + // 电脑ip设置192.168.17.17 +// api = (SydApi4j) new SydApi4j().connect("192.168.17.18", 8889, null, 1000); // api = (SydApi4j) new SydApi4j().connect("47.111.95.168", 43889, null,100000); } @@ -238,12 +245,12 @@ public class TestZY { //pass @Test public void testS6_1(){ - String s="0100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414E3A9A7A96D9AF6433A1D1E97CDF590B13BED0668"; - byte[] data=Util.hexString2Bytes(s); - String pk="000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7C7FFA2613093243052A11E5EF33A9B52AD9601D2E9FD6DFEA2FFF957C3A3FFCE1CECDFAD44F0EBB6C253EEC4785AFFFB73CE7501D5DE183F1A74330AECA3A76DC9B78CD10ED1EB9C781DF483368F03A5813AB4C5C96B6E2C8D876A677094E6F2ECD695C173458907291A5AB59878089512A8EB9023F9E64E045D7C14F755A300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001"; - String sk="00040000EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C3957DCE9A0F8AB800C0445F6F5F8BD97D9D761B9DBD5569BC68011D48C1138E9EE59D9A847428A44857BB02130D4610C4279B686B4D84878FDE8A1BE6DCA4D10975F8C172ADAFD5ED9A2E7854A458645DE3788872504A18FD0C1B0B307DAA112F4169EFA9C7110E59F22501397088144DF3796A4D326D626D83332AE6462E262EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CD044C8CFF017DB7DEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CED2FC7E8C43401FAE99976774A2CA64DB4626F2AC33D6B721A0B78B4A46B516537BAD6A40C7EFF9593939CA536DF1DB8F7A0FAFA5943E189E5A9D565A1912D66CC2421287A6AA448191946BA6FB6D2143BBFFA19A4D8A4C82B2BC24D0A4F84EADEFD8CDF3377C99D9766698FE8ADF2C2DFFF1A13E8551C7C07CFB0339FB6EEC5EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C53B4DAF62632459A22CFBD829DD3E430ADEA1F2D958257805FFABCF70FE3807B76D48CA7923E361BE9CA56CA75F4C2A3F5C408AA6EA533DC90DFB4A92ABF44E8EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C2F246AEA61195F77713FE63245192CCD1AAB1A1F58CF212D1FB205F51E8F71EC89CBEE6470931674EF07881D924F16FC5EF6331A647C4509A1064656432F7FB6EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CB3053D92AE7BA11A0DD5E2FA6D41743BDA331EB51E8624828F92E0A1FC3C9736A8A1718962080A8180EB88A9934E36B9EA392AAB16B7CD199A9F1DB88A0EBAA5EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C5136AE91766346BC8D0747C22A91DA29FB892C0733E7B9B578F5BCC2233013FDDAE60AAF2601322171ABCDAA2C146D61876913E24B9A44E82AE4DD280BA0F5EFEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CAD1D91712D1D1FD54A40191428DE88E779FA673199397A8EE934B7A9114949E91221E929B8C8E41E1BC22795FE484DF74FD043518763D354062CDEDAB1B00C18"; + String s="0100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414E3A9A7A96D9AF6433A1D1E97CDF590B13BED0668"; + byte[] data=Util.hexString2Bytes(s); + String pk="000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7C7FFA2613093243052A11E5EF33A9B52AD9601D2E9FD6DFEA2FFF957C3A3FFCE1CECDFAD44F0EBB6C253EEC4785AFFFB73CE7501D5DE183F1A74330AECA3A76DC9B78CD10ED1EB9C781DF483368F03A5813AB4C5C96B6E2C8D876A677094E6F2ECD695C173458907291A5AB59878089512A8EB9023F9E64E045D7C14F755A300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001"; + String sk="00040000EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C3957DCE9A0F8AB800C0445F6F5F8BD97D9D761B9DBD5569BC68011D48C1138E9EE59D9A847428A44857BB02130D4610C4279B686B4D84878FDE8A1BE6DCA4D10975F8C172ADAFD5ED9A2E7854A458645DE3788872504A18FD0C1B0B307DAA112F4169EFA9C7110E59F22501397088144DF3796A4D326D626D83332AE6462E262EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CD044C8CFF017DB7DEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CED2FC7E8C43401FAE99976774A2CA64DB4626F2AC33D6B721A0B78B4A46B516537BAD6A40C7EFF9593939CA536DF1DB8F7A0FAFA5943E189E5A9D565A1912D66CC2421287A6AA448191946BA6FB6D2143BBFFA19A4D8A4C82B2BC24D0A4F84EADEFD8CDF3377C99D9766698FE8ADF2C2DFFF1A13E8551C7C07CFB0339FB6EEC5EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C53B4DAF62632459A22CFBD829DD3E430ADEA1F2D958257805FFABCF70FE3807B76D48CA7923E361BE9CA56CA75F4C2A3F5C408AA6EA533DC90DFB4A92ABF44E8EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C2F246AEA61195F77713FE63245192CCD1AAB1A1F58CF212D1FB205F51E8F71EC89CBEE6470931674EF07881D924F16FC5EF6331A647C4509A1064656432F7FB6EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CB3053D92AE7BA11A0DD5E2FA6D41743BDA331EB51E8624828F92E0A1FC3C9736A8A1718962080A8180EB88A9934E36B9EA392AAB16B7CD199A9F1DB88A0EBAA5EA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736C5136AE91766346BC8D0747C22A91DA29FB892C0733E7B9B578F5BCC2233013FDDAE60AAF2601322171ABCDAA2C146D61876913E24B9A44E82AE4DD280BA0F5EFEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CEA0171B8EF06736CAD1D91712D1D1FD54A40191428DE88E779FA673199397A8EE934B7A9114949E91221E929B8C8E41E1BC22795FE484DF74FD043518763D354062CDEDAB1B00C18"; - String outKey="000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2C32395A7D4BE741EDDB411A59DCF1CFCC2B991F60C75D4DD7853A05F73408D4364819099036B033C7148A86C07B66A562A1E0D6D2506D227F443A7165E12754B638F5E9146F742834FEE4E3F6013FC2E41B9B35980EE1A12F1CADCEF22D2B6E3F9DFFE44ABBD2747D4C4F354D926C0E7612E8CD9CD125EC48336964B41F38B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001"; + String outKey="000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2C32395A7D4BE741EDDB411A59DCF1CFCC2B991F60C75D4DD7853A05F73408D4364819099036B033C7148A86C07B66A562A1E0D6D2506D227F443A7165E12754B638F5E9146F742834FEE4E3F6013FC2E41B9B35980EE1A12F1CADCEF22D2B6E3F9DFFE44ABBD2747D4C4F354D926C0E7612E8CD9CD125EC48336964B41F38B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001"; // String signData="000400008000000059734D77FB5555CB3436BE9EE011A60E1E268DF619D96210E8AB91D1B30F3749A3F15B6E8F931DC27683CF6B46C8169177F0D51104E39BA0B892C59807A4CB29991C382A57D27612BDD19204A13EA6E39BE2F93EB2B02650547D6AD3C868AC3DBF4E51D4A1B8524BAA389BE8538D30EA74A3538B344A7464EC533B3770DF1E7C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; byte[] bytes = api.signData(1, 101, sk, data); @@ -295,11 +302,148 @@ public class TestZY { byte[] data=Util.hexString2Bytes("8765432187654321876543218765432187654321876543218765432187654321"); String key="000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A2C32395A7D4BE741EDDB411A59DCF1CFCC2B991F60C75D4DD7853A05F73408D4364819099036B033C7148A86C07B66A562A1E0D6D2506D227F443A7165E12754B638F5E9146F742834FEE4E3F6013FC2E41B9B35980EE1A12F1CADCEF22D2B6E3F9DFFE44ABBD2747D4C4F354D926C0E7612E8CD9CD125EC48336964B41F38B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001"; byte[] bytes = api.ASYMEnData(1, 101,key, data); - // byte[] bytes1 = api.ASYMDeData(0, 102, "12", bytes); + // byte[] bytes1 = api.ASYMDeData(0, 102, "12", bytes); System.out.println(Util.bytes2HexString(bytes)); // System.out.println(Arrays.equals(bytes1, data)); } + // + // 011030303030303030305339 + // 303030303030303030303030303030303030303737373737373737 + // 3038 + // 0000000000000000 + // 33 + // 31313131313131313131313131313131 + // 32323232323232323232323232323232 + // 33333333333333333333333333333333 + // 3038 + // 3038 + // 3038 + // 0000000000000000 + // 0000000000000000 + // 0000000000000000 + // 3031 + // 303030303030303030303030303030303030303030303030303031 + // 0003000000 + // 31313131313131313131313131313131 + // 32323232323232323232323232323232 + // 33333333333333333333333333333333 + // 07000000 + // 07000000 + // 07000000 + // 00000000000000000000000000000000 + // 00000000000000000000000000000000 + // 00000000000000000000000000000000 + // 01000000 + + @Test + public void testS9_fensan(){ + log.error("-----start------------"); + List protectedKeyDivData=new ArrayList<>(); + protectedKeyDivData.add(Util.hexString2Bytes("31313131313131313131313131313131")); + protectedKeyDivData.add(Util.hexString2Bytes("32323232323232323232323232323232")); + protectedKeyDivData.add(Util.hexString2Bytes("33333333333333333333333333333333")); + + List structList=new ArrayList<>(); + byte[] bytes = Util.hexString2Bytes("313131313131313131313131313131313232323232323232323232323232323233333333333333333333333333333333"); + int[] i={41,41,41}; + + + List protectedKeyDivIv1=new ArrayList<>(); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + + List protectedKeyDivIv2=new ArrayList<>(); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + + + Struct struct1=new Struct("1",3,protectedKeyDivData,i,protectedKeyDivIv2,1); + + structList.add(struct1); + + RetWrap retWrap = api.exportKeyAndCalc("77777777",42, Util.hexString2Bytes("0000000000000000"), 3,protectedKeyDivData, new int[]{42,42,42},protectedKeyDivIv1, 1, structList); + + printRetWrap(retWrap); + + log.error("-----end------------"); + } + + public void printRetWrap(RetWrap retWrap) { + + for (String s : retWrap.keySet()) { + System.out.println(s + ": " + Util.bytes2HexString((byte[]) retWrap.get(s))); + } + } + + /** + * S9直接发送数据 + */ + @Test + public void testDirect() { + String s = "00D4000000000013A7C653393030303030303030303030303030303030303030303030303237343037312021081080000000DFDEF7EF7FFFFFFF3037000000000000000030313030303030303030303030303030303030303030303030303032310002000000D15600010100000100000001B0002A01210000080931524100080931524132380000000000000000000000000000000007000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000"; + api.directBytes(Util.hexString2Bytes(s)); + } + + //00C2 + //3030303030303030 + //5339 + //303030303030303030303030303030303030303737373737373737 + //3038 + //0000000000000000 + //30 + //3031 + //303030303030303030303030303030303030303030303030303031 + //0000000000 + //31313131313131313131313131313131 + //32323232323232323232323232323232 + //33333333333333333333333333333333 + //07000000 + //07000000 + //07000000 + //00000000000000000000000000000000 + //00000000000000000000000000000000 + //00000000000000000000000000000000 + //01000000 + + @Test + public void testS9_fensan1(){ + long start = System.currentTimeMillis(); + List protectedKeyDivData=new ArrayList<>(); + protectedKeyDivData.add(Util.hexString2Bytes("31313131313131313131313131313131")); + protectedKeyDivData.add(Util.hexString2Bytes("32323232323232323232323232323232")); + protectedKeyDivData.add(Util.hexString2Bytes("33333333333333333333333333333333")); + + List structList=new ArrayList<>(); + byte[] bytes = Util.hexString2Bytes("313131313131313131313131313131313232323232323232323232323232323233333333333333333333333333333333"); + int[] i={41,41,41}; + + + List protectedKeyDivIv1=new ArrayList<>(); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + protectedKeyDivIv1.add(Util.hexString2Bytes("0000000000000000")); + + List protectedKeyDivIv2=new ArrayList<>(); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + protectedKeyDivIv2.add(Util.hexString2Bytes("00000000000000000000000000000000")); + + + Struct struct1=new Struct("1",3,protectedKeyDivData,i,protectedKeyDivIv2,1); + + structList.add(struct1); + + + RetWrap retWrap = api.exportKeyAndCalc("77777777",42, Util.hexString2Bytes("0000000000000000"), 0,null, null,protectedKeyDivIv1, 1, structList); + printRetWrap(retWrap); + + System.out.println("时间:" + (System.currentTimeMillis() - start)); + } + + @Test public void testS9(){ @@ -325,13 +469,13 @@ public class TestZY { structList.add(struct2); RetWrap retWrap = api.exportKeyAndCalc("77777777",41, null, 0,protectedKeyDivData, new int[]{41,41,41},protectedKeyDivIv, 2, structList); - System.out.println(retWrap); + printRetWrap(retWrap); } - @Test public void testS9_1(){ + log.error("----------------start-----------------"); List protectedKeyDivData=new ArrayList<>(); protectedKeyDivData.add(Util.hexString2Bytes("31313131313131313131313131313131")); protectedKeyDivData.add(Util.hexString2Bytes("32323232323232323232323232323232")); @@ -364,8 +508,9 @@ public class TestZY { structList.add(struct5); RetWrap retWrap = api.exportKeyAndCalc("77777777",52, Util.hexString2Bytes("00000000000000000000000000000000"), 3,protectedKeyDivData, i,protectedKeyDivIv, 5, structList); - System.out.println(retWrap); + printRetWrap(retWrap); + log.error("----------------end-----------------"); } @Test @@ -495,8 +640,6 @@ public class TestZY { System.out.println(Util.bytes2HexString(bytes)); } - - //pass @Test public void testSD_1(){ @@ -506,6 +649,7 @@ public class TestZY { System.out.println(bytes.length); System.out.println(Util.bytes2HexString(bytes)); } + //00E80000000000000000534431313230303638000100000F46A8BF6B282E2EA4E01C620F741E256F45AB17150E9B08871176515042B65200000000000000000000000000000000000000000000000000000000000000003031343330818C0221008EE7EDEBF4AEC4BABAAF80438BF08C597F2A7E7C071A4C279AEA0D839FE4BA3902202B4F6C9E3E387AA4F990C363B910002CD7A228CBFEE88A9075C9800CF0C4678004207515F4B1FB3716675137FD3DC49B70B7B09FC57D837E2B21F9C9B2C271A64D630423A298EC40AA9A7BD7420A9EA6083F78242D044A8241439F325F6FFF487EC7EE1CFCFB16 //00E80000000000000000534431313230303638000100000F46A8BF6B282E2EA4E01C620F741E256F45AB17150E9B08871176515042B65200000000000000000000000000000000000000000000000000000000000000003031343330818C0221008EE7EDEBF4AEC4BABAAF80438BF08C597F2A7E7C071A4C279AEA0D839FE4BA3902202B4F6C9E3E387AA4F990C363B910002CD7A228CBFEE88A9075C9800CF0C4678004207515F4B1FB3716675137FD3DC49B70B7B09FC57D837E2B21F9C9B2C271A64D630423A298EC40AA9A7BD7420A9EA6083F78242D044A8241439F325F6FFF487EC7EE1CFCFB16 //pass