diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx index 9dacad5..d247182 100644 Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java index 99faa58..821e34b 100644 --- a/src/main/java/com/sunyard/inf/SydCryptionApi.java +++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java @@ -246,6 +246,16 @@ interface SydSYMApi { */ byte[] SYMEncryptData(int nAlg, String seesionKey, byte[] pINdata); + /** + * 对指定报文数据进行SM4加密 + * @param type 密钥类型。0: ZEK,1: TEK + * @param userId 生成密钥时的机构号。 + * @param index 密钥索引 + * @param data 待加密的数据 + * @return + */ + byte[] SYMSM4EncDataByIndex(int type, String userId, String index, byte[] data); + /** * 用输入的会话密钥,对指定报文数据进行加密处理。 * diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 8883658..2fc4c3d 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -1911,6 +1911,25 @@ public class SydApi4j implements SydApi { return retWrap; } + /** + * 对指定报文数据进行SM4加密 + * @param type 密钥类型。0: ZEK,1: TEK + * @param userId 生成密钥时的机构号。 + * @param index 密钥索引 + * @param data 待加密的数据 + * @return + */ + public byte[] SYMSM4EncDataByIndex(int type, String userId, String index, byte[] data) { + + if (userId.length() > 16 || index.length() > 8) { + throw new SydApiException("机构号或索引长度不匹配", -27); + } + + String indexN = "0000000000000000" + index; + indexN = indexN.substring(indexN.length() - 8); + + return SYMEncryptData(SydApi.NALG_SM4, "XK" + SYMUtil.genPrivateKeyMark(userId, 0 == type ? "00A" : "00B", indexN), 1, data); + } @Override public byte[] SYMEncryptData(int nAlg, String seesionKey, int fullMode, byte[] pInData) { @@ -2033,6 +2052,26 @@ public class SydApi4j implements SydApi { return SYMDecryptData(nAlg, seesionKey, 1, pInData); } + /** + * 对指定报文数据进行SM4解密 + * @param type 密钥类型。0: ZEK,1: TEK + * @param userId 生成密钥时的机构号 + * @param index 密钥索引 + * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数 + * @return + */ + public byte[] SYMSM4DecDataByIndex (int type, String userId, String index, byte[] pINdata) { + + if (userId.length() > 16 || index.length() > 8) { + throw new SydApiException("机构号或索引长度不匹配", -27); + } + + String indexN = "00000000" + index; + indexN = indexN.substring(indexN.length() - 8); + + return SYMDecryptData(SydApi4j.NALG_SM4, "XK" + SYMUtil.genPrivateKeyMark(userId, 0 == type ? "00A" : "00B", indexN), 1, pINdata); + } + @Override public byte[] SYMDecryptData(int nAlg, String seesionKey, int fullmode, byte[] pInData) { if (2 == nAlg && 'L' != seesionKey.charAt(0)) { diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java index 8f4e22e..d0ae978 100644 --- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java +++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java @@ -36,7 +36,8 @@ public class TestAllMethods { public void before() { // 通过设置debug的属性开启debug,如果不设置则默认不打开 System.setProperty("com.sunyard.sydapi4j.debug", "true"); - api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); +// api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); + api = (SydApi4j) new SydApi4j().connect("192.168.0.119", 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); @@ -710,6 +711,7 @@ public class TestAllMethods { String key = "X6CEE744329499B426CEE744329499B42"; String msg = "11111111111"; byte[] bytes = api.SM4EncryptDataCBC(0, key, 0, 0 , msg.getBytes()); + System.out.println("输出为: " + Util.bytes2HexString(bytes)); byte[] bytes1 = api.SM4DecryptDataCBC(0, key, 0, 0, bytes); @@ -803,6 +805,42 @@ public class TestAllMethods { System.out.println("明文:" + new String(bytes1)); } + // 测试通过 + // E0 + @Test + public void testEncDecData1() { + + // 000000000000011100000000001 + String key = "XK000000000000011100000000001"; + + String msg = "111111111111111111qewehtrhq1"; + + byte[] bytes = api.SYMEncryptDataCBC(1, key, msg.getBytes()); + + System.out.println("输出为: " + Util.bytes2HexString(bytes)); + + byte[] bytes1 = api.SYMDecryptDataCBC(1, key, bytes); + System.out.println("明文:" + new String(bytes1)); + } + + // 测试通过 + // E0 + @Test + public void testEncDecData2() { + + String userId = "0000000000000111"; + String index = "00000001"; + + String msg = "1011111111111111101"; + + byte[] bytes = api.SYMSM4EncDataByIndex(0, userId, index, msg.getBytes()); + + System.out.println("输出为: " + Util.bytes2HexString(bytes)); + + byte[] bytes1 = api.SYMSM4DecDataByIndex(0, userId, index, bytes); + System.out.println("明文:" + new String(bytes1)); + } + @Test public void testaaa() throws UnsupportedEncodingException { String key = "X6CEE744329499B426CEE744329499B42";