增加签名数字信封、解签名数字信封接口

This commit is contained in:
yihzhou
2022-09-05 11:06:34 +08:00
parent 6daefe5d48
commit bed95d2009
6 changed files with 319 additions and 16 deletions
+3 -1
View File
@@ -2,6 +2,7 @@ package com.sunyard;
import com.sunyard.inf.*;
import com.sunyard.inf.customize.Syd4DigitalEnvelope;
import com.sunyard.inf.customize.SydHAApi;
import com.sunyard.inf.customize.SydQNUCApi;
import com.sunyard.inf.customize.SydUnionPayApi;
@@ -14,7 +15,7 @@ import racal.sunyard.main.SydApiBuilder;
public interface SydApi extends
SydRawApi, SydCertApi, SydCryptionApi, SydGenApi,
SydSVApi, SydHAApi, SydQNUCApi, SydPledge, SydPINOpt,
SydManufactureApi, SydZYOption, SydUnionPayApi {
SydManufactureApi, SydZYOption, SydUnionPayApi ,Syd4DigitalEnvelope{
byte ALG_AES = 0x30;
byte ALG_SM4 = 0x31;
@@ -101,6 +102,7 @@ public interface SydApi extends
// 单例可以不实现
void error();
/**
* 获取加密机cpu,内存,磁盘使用状况
*
@@ -0,0 +1,31 @@
package com.sunyard.inf.customize;
/**
* 上清所数字信封类接口
*/
public interface Syd4DigitalEnvelope {
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 上清所
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign:会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
public String SYD_SignDigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
/**
* 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。
* 上清所
* @param pcDnDe: 会员的私钥证书
* @param pcDnVerify: 清算所公钥证书
* @param pcSignData: 签名数字信封数据。
* @return pcData:原数据
*/
public byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
}
+138 -1
View File
@@ -2310,6 +2310,7 @@ public class SydApi4j implements SydApi {
}
}
public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) {
certSerial = DnUtil.verifyDn( certSerial );
@@ -2923,6 +2924,142 @@ public class SydApi4j implements SydApi {
return true;
}
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 上清所
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign:会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
@Override
public String SYD_SignDigitalEnvelope(String pcDnEN, String pcDnSign, byte[] pcData){
// 获取协议
Proto6A proto = new Proto6A();
// 填充数据
PacketSN sn = PacketSN.gen();
HashMap<String, Object> packet = new HashMap<String, Object>();
packet.put("header", sn.getSn().array());
HashMap<String, Object> data = new HashMap<String, Object>();
try { data.put("alg$option", 3);
//data.put("pFlag", "P");
data.put("certificateModel$option", 1);
data.put("certificateDn", pcDnEN.getBytes("GBK"));
data.put("orgData", pcData);
// data.put("orgDataLen", pcData.length);
data.put("keyType", "S");
data.put("pSignFlag", "P");
//data.put("signCertificateLen", pcDnSign.length());
data.put("signCertificateDn", pcDnSign.getBytes("GBK"));
data.put("signCertificateModel$option", 0);
}catch (Exception e){
e.printStackTrace();
}
packet.put("data", data);
// 渲染发送 耗时长
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());
}
RetWrap rw = new RetWrap();
rw.put(SydApi.RET_CIPHER_KEY, ((PacketSection) ret.get("key")).getString());
rw.put(SydApi.RET_KCV, ((PacketSection) ret.get("keyCheck")).getString());
return (String) rw.get("CipherKey");
}
/**
* 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。
* 上清所
* @param pcDnDe: 会员的私钥证书
* @param pcDnVerify: 清算所公钥证书
* @param pcSignData: 签名数字信封数据。
* @return pcData:原数据
*/
@Override
public byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData) {
// 获取协议
Proto6B proto = new Proto6B();
// 填充数据
PacketSN sn = PacketSN.gen();
HashMap<String, Object> packet = new HashMap<String, Object>();
packet.put("header", sn.getSn().array());
HashMap<String, Object> data = new HashMap<String, Object>();
try {
data.put("pFlag", "P");
data.put("pSignFlag", "P");
//data.put("signCertificateLen", pcDnDe.length());
data.put("signCertificateDn", pcDnDe.getBytes("GBK"));
data.put("certificateModel$option", 1);
//data.put("certificateLen", pcDnVerify.length());
data.put("certificateDn", pcDnVerify.getBytes("GBK"));
data.put("key", pcSignData.getBytes("GBK"));
data.put("keyType", "S");
}catch(Exception e){
e.printStackTrace();
}
packet.put("data", data);
// 渲染发送
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());
}
RetWrap rw = new RetWrap();
rw.put("oData", ((PacketSection) ret.get("oData")).getBytes());
byte[] odata = (byte[])rw.get("oData");
return odata;
// int orgCodeLen = Util.a2i(((PacketSection) ret.get("orgCodeLen")).getBytes(), 10);
// if (orgCodeLen != 0) {
// rw.put("orgCode", ((PacketSection) ret.get("orgCode")).getBytes());
// }
//
// rw.put(SydApi.RET_SESSION_KEY, (((PacketSection) ret.get("lmkHead")).getString() +
// ((PacketSection) ret.get("lmk")).getString()).getBytes()
// );
//
}
/**
* 用指定的证书私钥对指定的数据进行数字签名。
* 网联
@@ -3207,7 +3344,6 @@ public class SydApi4j implements SydApi {
}
// 测试通过
@Override
public RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData) {
@@ -5497,6 +5633,7 @@ public class SydApi4j implements SydApi {
/**
* 使用SM4算法进行加密,其中加密模式为CBC,
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING 。
@@ -0,0 +1,57 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class AAA4shangqing {
private static final String orgData = "12345678";
private static final String publicKey = "034200043EDA3A107B7CC35CC005C7FBF0BB4E6B43A07EE14E360603D22ECA2A600B2D0FA03055D400D1240300F54648B849D13F50B330FF14351B5645B13686820A65BB";
private static final String pcDnEN ="C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
public static void main(String[] args) {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
long startTime = System.currentTimeMillis(); //获取开始时间
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100");
SydApi4j api = (SydApi4j) builder.build();
try {
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign:会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
String pcSignData= api.SYD_SignDigitalEnvelope(pcDnEN,pcDnEN, orgData.getBytes("GBK"));
System.out.println("签名数字信封:"+pcSignData);
/**
* 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。
* 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
* @param pcDnDe: 会员的私钥证书
* @param pcDnVerify: 清算所公钥证书
* @param pcSignData: 签名数字信封数据。
* @return pcData:原数据
*/
byte[] oData =api.SYD_VerifyDigitalEnveloe(pcDnEN,pcDnEN,pcSignData);
System.out.println("原数据:"+ Util.bytes2HexString(oData));
}
catch (Exception e) {
e.printStackTrace();
}finally {
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
}
}