1、升级dproto依赖,2、添加77,78指令的接口,sm2加解密密文结构为C1C2C3,3、生成数字信封添加机构码

This commit is contained in:
zhoubin
2022-01-07 17:08:01 +08:00
parent 8a38108727
commit 61456f74b6
11 changed files with 389 additions and 225 deletions
@@ -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,
+106 -3
View File
@@ -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);
}