1、升级dproto依赖,2、添加77,78指令的接口,sm2加解密密文结构为C1C2C3,3、生成数字信封添加机构码
This commit is contained in:
@@ -95,6 +95,16 @@ interface SydASYMApi {
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* 用指定的 SM2 公钥对指定的密文数据进行加密。
|
||||
* 输出的sm2密文结构为C1C2C3格式
|
||||
* @param publicKey 公钥钥串,DER 编码,HEX 格式。
|
||||
* @param pOrgData 加密的数据。
|
||||
* @return 加密的数据 base64 编码。
|
||||
*/
|
||||
String SM2EncryptOrder(byte[] publicKey, byte[] pOrgData);
|
||||
|
||||
|
||||
/**
|
||||
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
|
||||
*
|
||||
@@ -112,6 +122,15 @@ interface SydASYMApi {
|
||||
*/
|
||||
byte[] SM2Decrypt(byte[] sk, String enData);
|
||||
|
||||
/**
|
||||
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
|
||||
* 输入的sm2密文结构为C1C2C3格式
|
||||
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
|
||||
* @param enData 加密的数据,base64 编码。
|
||||
* @return 明文数据。
|
||||
*/
|
||||
byte[] SM2DecryptOrder(String userId, String enData);
|
||||
|
||||
/**
|
||||
* 用指定的 RSA 私钥对指定的密文数据进行加密。
|
||||
*
|
||||
|
||||
@@ -228,6 +228,18 @@ public interface SydGenApi {
|
||||
*/
|
||||
RetWrap generateDEbyGS(String certSerial, byte nAlg);
|
||||
|
||||
/**
|
||||
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
|
||||
*
|
||||
* @param certSerial 对*方 X509 证书的序列号。
|
||||
* @param orgCode 机构码
|
||||
* @return RetWrap 包含 CipherKey, SessionKey, KCV
|
||||
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
|
||||
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
|
||||
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
|
||||
*/
|
||||
RetWrap generateDEbyGS(String certSerial, String orgCode);
|
||||
|
||||
/**
|
||||
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。
|
||||
|
||||
@@ -252,6 +264,7 @@ public interface SydGenApi {
|
||||
* @return RetWrap 包含 SessionKey KCV
|
||||
* SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文
|
||||
* KCV 会话密钥的检验值,HEX 格式,长度为 36H。
|
||||
* orgCode 如果有机构码的话会返回机构码
|
||||
*/
|
||||
RetWrap decryptDE(
|
||||
String pCertSerial,
|
||||
|
||||
@@ -2129,15 +2129,20 @@ public class SydApi4j implements SydApi {
|
||||
|
||||
@Override
|
||||
public RetWrap generateDEbyGS(String certSerial, byte nAlg) {
|
||||
return generateDE(1, certSerial, nAlg);
|
||||
return generateDE(1, certSerial, nAlg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RetWrap generateDEbyGS(String certSerial, String orgCode) {
|
||||
return generateDE(1, certSerial, (byte) 0x32, orgCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RetWrap generateDE(String certSerial, byte nAlg) {
|
||||
return generateDE(0, certSerial, nAlg);
|
||||
return generateDE(0, certSerial, nAlg, null);
|
||||
}
|
||||
|
||||
public RetWrap generateDE(int pFlag, String certSerial, byte nAlg) {
|
||||
private RetWrap generateDE(int pFlag, String certSerial, byte nAlg, String orgCode) {
|
||||
// 获取协议
|
||||
//ProtocolRender render = pset.getProtocolReqRender("6A");
|
||||
Proto6A proto = new Proto6A();
|
||||
@@ -2149,6 +2154,14 @@ public class SydApi4j implements SydApi {
|
||||
data.put("alg$option", nAlg - 0x30);
|
||||
if (pFlag == 1) {
|
||||
data.put("pFlag", 'P');
|
||||
|
||||
if (nAlg == 0x32) {
|
||||
if (orgCode.length() != 14) {
|
||||
throw new SydApiException("机构码长度错(只能==14)", -6);
|
||||
}
|
||||
|
||||
data.put("orgCode", orgCode);
|
||||
}
|
||||
}
|
||||
data.put("certificateModel$option", 0);
|
||||
data.put("certificateSn", certSerial.getBytes());
|
||||
@@ -2225,6 +2238,11 @@ public class SydApi4j implements SydApi {
|
||||
}
|
||||
RetWrap rw = new RetWrap();
|
||||
|
||||
int orgCodeLen = Util.a2i(((PacketSection) ret.get("orgCodeLen")).getBytes(), 10);
|
||||
if (orgCodeLen != 0) {
|
||||
rw.put("orgCode", ((PacketSection) ret.get("orgCode")).getString());
|
||||
}
|
||||
|
||||
rw.put(SydApi.RET_SESSION_KEY, ((PacketSection) ret.get("lmkHead")).getString() +
|
||||
((PacketSection) ret.get("lmk")).getString()
|
||||
);
|
||||
@@ -3974,6 +3992,43 @@ public class SydApi4j implements SydApi {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String SM2EncryptOrder(byte[] publicKey, byte[] pOrgData) {
|
||||
Proto77 proto = new Proto77();
|
||||
|
||||
// 填充数据
|
||||
HashMap<String, Object> packet = new HashMap<String, Object>();
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
packet.put("data", data);
|
||||
PacketSN sn = PacketSN.gen();
|
||||
packet.put("header", sn.getSn().array());
|
||||
data.put("AlgorithmKey$option", 1);
|
||||
data.put("publicKey", publicKey);
|
||||
data.put("infoData", pOrgData);
|
||||
// 渲染发送
|
||||
ByteBuffer bb = proto.rend(packet);
|
||||
synchronized (this) {
|
||||
// 响应解析
|
||||
bb = syncRead(syncSend(bb));
|
||||
}
|
||||
//ProtocolParser parser = pset.getProtocolResParse();
|
||||
Packet p = proto.parse(bb);
|
||||
Map<String, Object> ret = p.toMap();
|
||||
if (
|
||||
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
|
||||
) {
|
||||
throw new SydApiException("包序号不匹配", -4);
|
||||
}
|
||||
ret = (Map<String, Object>) ret.get("data");
|
||||
PacketSection error = (PacketSection) ret.get("error");
|
||||
if (!"00".equals(error.getString())) {
|
||||
throw new SydApiException(error.getInfo(), error.autoInt());
|
||||
}
|
||||
|
||||
System.out.println("内部输出: " + Util.bytes2HexString(((PacketSection) ret.get("cipherData")).getBytes()));
|
||||
|
||||
return SYMUtil.derEnData2Base64EnC1C2C3(((PacketSection) ret.get("cipherData")).getBytes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String SM2Encrypt(byte[] publicKey, byte[] pOrgData) {
|
||||
@@ -4092,6 +4147,54 @@ public class SydApi4j implements SydApi {
|
||||
return ((PacketSection) ret.get("data")).getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
|
||||
* 输入的sm2密文结构为C1C2C3格式
|
||||
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
|
||||
* @param enData 加密的数据,base64 编码。
|
||||
* @return 明文数据。
|
||||
*/
|
||||
@Override
|
||||
public byte[] SM2DecryptOrder(String userId, String enData) {
|
||||
//ProtocolRender render = pset.getProtocolReqRender("78");
|
||||
Proto78 proto = new Proto78();
|
||||
|
||||
byte[] pOrgData = SYMUtil.base64EnData2DerEnDataC1C2C3(enData);
|
||||
|
||||
System.out.println("解密内部输出: " + Util.bytes2HexString(pOrgData));
|
||||
|
||||
// 填充数据
|
||||
HashMap<String, Object> packet = new HashMap<String, Object>();
|
||||
HashMap<String, Object> data = new HashMap<String, Object>();
|
||||
packet.put("data", data);
|
||||
PacketSN sn = PacketSN.gen();
|
||||
packet.put("header", sn.getSn().array());
|
||||
data.put("AlgorithmKey$option", 1);
|
||||
data.put("infoData", pOrgData);
|
||||
data.put("privateKeyTag", SYMUtil.genPrivateKeyMark(userId, SYMUtil.KT_ENCRYPT, "00000001"));
|
||||
// 渲染发送
|
||||
ByteBuffer bb = proto.rend(packet);
|
||||
synchronized (this) {
|
||||
// 响应解析
|
||||
bb = syncRead(syncSend(bb));
|
||||
}
|
||||
//ProtocolParser parser = pset.getProtocolResParse();
|
||||
Packet p = proto.parse(bb);
|
||||
Map<String, Object> ret = p.toMap();
|
||||
if (
|
||||
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
|
||||
) {
|
||||
throw new SydApiException("包序号不匹配", -4);
|
||||
}
|
||||
ret = (Map<String, Object>) ret.get("data");
|
||||
PacketSection error = (PacketSection) ret.get("error");
|
||||
if (!"00".equals(error.getString())) {
|
||||
throw new SydApiException(error.getInfo(), error.autoInt());
|
||||
}
|
||||
|
||||
return ((PacketSection) ret.get("data")).getBytes();
|
||||
}
|
||||
|
||||
public byte[] SM3HashSNaId(String sn, String userId, byte[] msg) {
|
||||
return SM3Hash(null, sn, null, userId, msg);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user