整理短链接的四接口,依然使用 java 实现。

This commit is contained in:
cheney 2025-07-11 11:09:53 +08:00
parent fdbcf5d43b
commit 01c29d3d79

View File

@ -596,7 +596,7 @@ public class SydApiBaseFunction implements SydApi {
public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData, String[] pcMac) { public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List<byte[]> pcData, String[] pcMac) {
Logger log = LogFactory.getLogger(); Logger log = LogFactory.getLogger();
if (LogFactory.iLogLevel == 3) { if (LogFactory.iLogLevel == 3) {
log.debug("SYD_SM4Mac_BatchData方法接收参数iKeyIndex{},pcData元素个数为{},pcMac{}", iKeyIndex, pcData.size(), Arrays.toString(pcMac)); log.debug("SYD_SM4Mac_BatchData方法接收参数iKeyIndex{}, pcData元素个数为{},pcMac{}", iKeyIndex, pcData.size(), Arrays.toString(pcMac));
} }
if (pcData.isEmpty()) { if (pcData.isEmpty()) {
@ -778,18 +778,24 @@ public class SydApiBaseFunction implements SydApi {
@Override @Override
public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) {
return SYD_SM4Mac_ShortData(iKeyIndex, pcData, 1024);
}
public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen) {
Logger log = LogFactory.getLogger(); Logger log = LogFactory.getLogger();
if (LogFactory.iLogLevel == 3) { if (LogFactory.iLogLevel == 3) {
log.debug("SYD_SM4Mac_ShortData方法接收参数iKeyIndex{},pcData{},iFlag{}", iKeyIndex, Arrays.toString(pcData)); log.debug("SYD_SM4Mac_ShortData方法接收参数iKeyIndex{},pcData{},iFlag{}", iKeyIndex, Arrays.toString(pcData));
} }
if ( null == pcData || pcData.length > 1040 ) { if ( null == pcData || pcData.length > limitDataLen ) {
throw new SydApiException("输入内容超长",19); throw new SydApiException("输入内容长度错误", 0x01000001);
} }
if (null == this.hsms || this.hsms.length < 1) { if (null == this.hsms || this.hsms.length < 1) {
throw new SydApiException(-1); throw new SydApiException(-1);
} }
String keyIndex = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex)); String keyIndex = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex));
log.debug("\"SK\" + SYMUtil.genPrivateKeyMark方法返回值{}", keyIndex); log.debug("\"SK\" + SYMUtil.genPrivateKeyMark方法返回值{}", keyIndex);
@ -838,12 +844,17 @@ public class SydApiBaseFunction implements SydApi {
@Override @Override
public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) {
return SYD_SM4Mac_ShortData(iKeyIndex, pcData, 1024, pcMac);
}
public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, int limitDataLen, String pcMac) {
Logger log = LogFactory.getLogger(); Logger log = LogFactory.getLogger();
if (LogFactory.iLogLevel == 3) { if (LogFactory.iLogLevel == 3) {
log.debug("SYD_SM4Mac_ShortData方法接收参数{}", iKeyIndex, Arrays.toString(pcData), pcMac); log.debug("SYD_SM4Mac_ShortData方法接收参数{}", iKeyIndex, Arrays.toString(pcData), pcMac);
} }
if ( null == pcData || pcData.length > 1040 ) { if ( null == pcData || pcData.length > limitDataLen ) {
throw new SydApiException("输入内容超长",19); throw new SydApiException("输入内容超长",19);
} }
@ -861,83 +872,43 @@ public class SydApiBaseFunction implements SydApi {
} }
/**
* 非依赖 C 实现仅长连接依赖 C
* @param iEncKeyIndex输入加密所需要的密钥索引值
* @param iMacKeyIndex输入计算mac所需要的密钥索引值
* @param pcData 输入计算mac所需要的数据
* @return
*/
@Override @Override
public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) {
if ( null == pcData || pcData.length > 1024 ) { Logger log = LogFactory.getLogger();
throw new SydApiException(19); if (LogFactory.iLogLevel == 3) {
log.debug("SYD_SM4_EncryptAndMac_ShortDatak1={} k2={}", iEncKeyIndex, iMacKeyIndex);
} }
// 参数检查在函数内部
if ( ! ConnectHandlerManager.isInited() ) { byte[] enData = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC);
throw new SydApiException(-1); // mac 长度放宽到 1024因为密文填充
} String mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData, 1040);
return new DataAndMac(enData, mac);
int enLen = BytesUtil.calculatePaddedLength(pcData.length);
byte[] encData = new byte[enLen];
byte[] mac = new byte[16];
IntByReference encDataLen = new IntByReference(encData.length);
int i = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_ShortData(
ConnectHandlerManager.getHandler(),
iEncKeyIndex,
iMacKeyIndex,
pcData,
pcData.length,
encData,
encDataLen,
mac
);
if ( 0 == i ){
return new DataAndMac(encData, Util.bytes2HexString(mac));
} else {
throw new SydApiException(i);
}
// byte[] enData = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_ENC);
// String mac = SYD_SM4Mac_ShortData(iMacKeyIndex, enData);
// return new DataAndMac(enData, mac);
} }
@Override @Override
public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) { public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, String mac) {
// boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, mac); Logger log = LogFactory.getLogger();
// byte[] data = null; if (LogFactory.iLogLevel == 3) {
// try { log.debug("SYD_SM4_CheckMacAndDecrypt_ShortDatak1={} k2={}", iEncKeyIndex, iMacKeyIndex);
// data = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_DEC);
// }catch (Exception e){
// return new DataAndMacCheck(null, ret);
// }
// return new DataAndMacCheck(data, ret);
if ( ! ConnectHandlerManager.isInited() ) {
throw new SydApiException(-1);
} }
byte[] decryptedData = new byte[pcData.length]; boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, 1040, mac);
IntByReference decryptedDataLen = new IntByReference(decryptedData.length); byte[] data = null;
try {
int i = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_ShortData( data = SYD_SM4_ShortData(iEncKeyIndex, pcData, Consts.ECB_DEC);
ConnectHandlerManager.getHandler(), }catch (Exception e){
iEncKeyIndex, return new DataAndMacCheck(null, ret);
iMacKeyIndex,
pcData,
pcData.length,
Util.hexString2Bytes(mac),
decryptedData,
decryptedDataLen
);
byte[] data = new byte[decryptedDataLen.getValue()];
System.arraycopy(decryptedData, 0, data, 0, data.length);
if ( 0 == i ){
return new DataAndMacCheck(data, true);
} if (0x01000010 == i) {
return new DataAndMacCheck(data, false);
} else {
throw new SydApiException(i);
} }
return new DataAndMacCheck(data, ret);
} }
@Override @Override
@ -947,15 +918,18 @@ public class SydApiBaseFunction implements SydApi {
log.debug("SYD_SM4_EncryptAndMac_BatchData"); log.debug("SYD_SM4_EncryptAndMac_BatchData");
} }
if (pcData.isEmpty()) { if (null == this.hsms || null == iMacKeyIndex || null == pcData) {
return new ArrayList<>(); throw new SydApiException("输入内容为空",0x01000001);
} }
if (null == this.hsms || null == iMacKeyIndex || null == pcData) {
throw new SydApiException("输入内容为空",15);
}
if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) { if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) {
throw new SydApiException("密钥长度和数据长度不对应", 15); throw new SydApiException("密钥长度和数据长度不对应", 0x01000001);
}
if (pcData.isEmpty()) {
log.info("SYD_SM4_EncryptAndMac_BatchData pcData isEmpty");
return new ArrayList<>();
} }
List<byte[]> enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC); List<byte[]> enDatas = SYD_SM4_BatchData(iEncKeyIndex, pcData, Consts.ECB_ENC);
@ -976,14 +950,15 @@ public class SydApiBaseFunction implements SydApi {
} }
if (pcData.isEmpty()) { if (pcData.isEmpty()) {
log.info("SYD_SM4_CheckMacAndDecrypt_BatchData pcData isEmpty");
return new ArrayList<>(); return new ArrayList<>();
} }
if (null == this.hsms || null == iMacKeyIndex || null == pcData) { if (null == this.hsms || null == iMacKeyIndex ) {
throw new SydApiException("输入内容为空",15); throw new SydApiException("输入内容为空", 0x01000001);
} }
if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) { if ( iEncKeyIndex.length != iMacKeyIndex.length || iEncKeyIndex.length != pcData.size() ) {
throw new SydApiException("密钥长度和数据长度不对应", 15); throw new SydApiException("密钥长度和数据长度不对应", 0x01000001);
} }
String[] macs = new String[pcData.size()]; String[] macs = new String[pcData.size()];