增加签名数字信封、解签名数字信封接口
This commit is contained in:
parent
6daefe5d48
commit
bed95d2009
@ -72,6 +72,30 @@
|
|||||||
公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在
|
公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在
|
||||||
</orgCode>
|
</orgCode>
|
||||||
|
|
||||||
|
<!-- 新增功能-->
|
||||||
|
<pSignFlag len="1" required="false" cn="可选字段">
|
||||||
|
签名数字信封标识符,存在则为P
|
||||||
|
</pSignFlag>
|
||||||
|
|
||||||
|
<signCertificateLen len="4" :value="signCertificateLen()" cn="签名证书DN长度">
|
||||||
|
可选项,只针对"可选字段"为P时存在。
|
||||||
|
</signCertificateLen>
|
||||||
|
|
||||||
|
<signCertificateDn :len="strlen()" :if="hasOrgCN()" cn="签名证书DN">
|
||||||
|
可选项,只针对“证书模式”为1时有,只针对"可选字段"为P时存在。
|
||||||
|
</signCertificateDn>
|
||||||
|
<signCertificateModel len="1" cn="是否附带公钥信息">
|
||||||
|
<options>
|
||||||
|
<option cn="无需附带">
|
||||||
|
<hex>0</hex>
|
||||||
|
</option>
|
||||||
|
<option cn="附带公钥信息">
|
||||||
|
<hex>1</hex>
|
||||||
|
</option>
|
||||||
|
</options>
|
||||||
|
</signCertificateModel>
|
||||||
|
|
||||||
|
|
||||||
<tailSep len="1" :if=" null != $packet.data.tail " cn="尾分隔">
|
<tailSep len="1" :if=" null != $packet.data.tail " cn="尾分隔">
|
||||||
可选项。如果显示消息尾域,则该域必须显示。值为
|
可选项。如果显示消息尾域,则该域必须显示。值为
|
||||||
“X’19”。
|
“X’19”。
|
||||||
@ -172,17 +196,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function signCertificateLen(){
|
||||||
|
var data = $packet.data;
|
||||||
|
if( 'P' == $packet.data.pSignFlag ){
|
||||||
|
return data.signCertificateDn.length
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function getKeyLen() {
|
function getKeyLen() {
|
||||||
return Util.a2i( $final.getSection('data').getSection('keyLen') )
|
return Util.a2i( $final.getSection('data').getSection('keyLen') );
|
||||||
}
|
}
|
||||||
|
|
||||||
function lmkLen() {
|
function lmkLen() {
|
||||||
if( Arrays.equals("L".getBytes(),
|
if( Arrays.equals("L".getBytes(),
|
||||||
$final.getSection('data').getSection('lmkHead').getValue()
|
$final.getSection('data').getSection('lmkHead').getValue()
|
||||||
) ){
|
) ){
|
||||||
return 64
|
return 64;
|
||||||
}else{
|
}else{
|
||||||
return 32
|
return 32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,6 +223,8 @@
|
|||||||
return $packet.data.orgData.length
|
return $packet.data.orgData.length
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
function hasOrgCode() {
|
function hasOrgCode() {
|
||||||
if(2 == $packet.data.alg$option && 'P' == $packet.data.pFlag) {
|
if(2 == $packet.data.alg$option && 'P' == $packet.data.pFlag) {
|
||||||
@ -199,11 +234,21 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function hasOrgCN() {
|
||||||
|
if(1 == $packet.data.certificateModel$option && 'P' == $packet.data.pSignFlag) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function orgCodeLen() {
|
function orgCodeLen() {
|
||||||
def len = $packet.data.orgCode.length();
|
def len = $packet.data.orgCode.length();
|
||||||
def data = new byte[2];
|
def data = new byte[2];
|
||||||
data[0] = (byte)(len >> 8 & 0xFF)
|
data[0] = (byte)(len >> 8 & 0xFF);
|
||||||
data[1] = (byte)(len & 0xFF)
|
data[1] = (byte)(len & 0xFF);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,18 @@
|
|||||||
可选,如果输入P代表使用PKCS7_SM2_SM4_ECB模式解密数字信封
|
可选,如果输入P代表使用PKCS7_SM2_SM4_ECB模式解密数字信封
|
||||||
</pFlag>
|
</pFlag>
|
||||||
|
|
||||||
|
|
||||||
|
<!--新增-->
|
||||||
|
<pSignFlag len="1" required="false" if="'P' == $packet.data.pFlag" cn="可选字段2">
|
||||||
|
如果输入P代表进行解封签名数字信封模式,必须当可选字段1为P时才可选
|
||||||
|
</pSignFlag>
|
||||||
|
<signCertificateLen len="4" :value="signCertificateLen()" if="'P' == $packet.data.pSignFlag" cn="签名证书内容长度">
|
||||||
|
根据证书模式,需要输入内容项的长度n,只针对可选字段2为P时存在
|
||||||
|
</signCertificateLen>
|
||||||
|
<signCertificateDn :if="hasSign()" cn="签名证书DN">
|
||||||
|
X509证书的subject可选项,只针对“证书模式”为1时有,只针对可选字段2为P时存在
|
||||||
|
</signCertificateDn>
|
||||||
|
|
||||||
<certificateModel len="1" cn="证书模式">
|
<certificateModel len="1" cn="证书模式">
|
||||||
<options>
|
<options>
|
||||||
<option cn="证书序号">
|
<option cn="证书序号">
|
||||||
@ -36,14 +48,16 @@
|
|||||||
可选项,只针对“证书模式”为 1时有。
|
可选项,只针对“证书模式”为 1时有。
|
||||||
</certificateDn>
|
</certificateDn>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<keyLen len="4" :value="keyLen()" cn="密钥密文长度">
|
<keyLen len="4" :value="keyLen()" cn="密钥密文长度">
|
||||||
公钥加密的密钥密文长度
|
公钥加密的密钥密文长度
|
||||||
</keyLen>
|
</keyLen>
|
||||||
|
|
||||||
<key :len="getKeyLen()" cn="密钥密文">
|
<key :len="getKeyLen()" cn="密钥密文">
|
||||||
公钥加密的密钥密文的 BASE64 编码
|
公钥加密的密钥密文的 BASE64 编码
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
|
|
||||||
<keyType len="1" cn="加密密钥方案">
|
<keyType len="1" cn="加密密钥方案">
|
||||||
LMK 下加密密钥的方案。
|
LMK 下加密密钥的方案。
|
||||||
</keyType>
|
</keyType>
|
||||||
@ -57,6 +71,8 @@
|
|||||||
<tail maxLen="32" required="false" cn="尾部">
|
<tail maxLen="32" required="false" cn="尾部">
|
||||||
可选项。最大长度为 32个字符。
|
可选项。最大长度为 32个字符。
|
||||||
</tail>
|
</tail>
|
||||||
|
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
</req>
|
</req>
|
||||||
@ -126,7 +142,7 @@
|
|||||||
对称密钥的密文,由 LMK30-31 保护。
|
对称密钥的密文,由 LMK30-31 保护。
|
||||||
</lmk>
|
</lmk>
|
||||||
|
|
||||||
<keyCheck len="16" cn="密钥校验值">
|
<keyCheck len="32" cn="密钥校验值">
|
||||||
密钥校验值
|
密钥校验值
|
||||||
</keyCheck>
|
</keyCheck>
|
||||||
|
|
||||||
@ -155,15 +171,30 @@
|
|||||||
function certificateLen(){
|
function certificateLen(){
|
||||||
var data = $packet.data;
|
var data = $packet.data;
|
||||||
if( 0 == data.certificateModel$option ){
|
if( 0 == data.certificateModel$option ){
|
||||||
return data.certificateSn.length()
|
return data.certificateSn.length
|
||||||
}
|
}
|
||||||
if( 1 == data.certificateModel$option ){
|
if( 1 == data.certificateModel$option ){
|
||||||
return data.certificateDn.length()
|
return data.certificateDn.length
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function signCertificateLen(){
|
||||||
|
var data = $packet.data;
|
||||||
|
return data.signCertificateDn.length
|
||||||
|
}
|
||||||
|
<![CDATA[
|
||||||
|
function hasSign() {
|
||||||
|
if(1 == $packet.data.certificateModel$option && 'P' == $packet.data.pSignFlag) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
|
||||||
|
|
||||||
function keyLen() {
|
function keyLen() {
|
||||||
return $packet.data.key.length()
|
return $packet.data.key.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -175,17 +206,17 @@
|
|||||||
if( Arrays.equals("L".getBytes(),
|
if( Arrays.equals("L".getBytes(),
|
||||||
$final.getSection('data').getSection('lmkHead').getValue()
|
$final.getSection('data').getSection('lmkHead').getValue()
|
||||||
) ){
|
) ){
|
||||||
return 64
|
return 64;
|
||||||
}else{
|
}else{
|
||||||
return 32
|
return 32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function orgCodeLen() {
|
function orgCodeLen() {
|
||||||
return Util.a2i( $final.getSection('data').getSection('orgCodeLen') )
|
return Util.a2i( $final.getSection('data').getSection('orgCodeLen') );
|
||||||
}
|
}
|
||||||
|
|
||||||
function oDataLen() {
|
function oDataLen() {
|
||||||
return Util.a2i( $final.getSection('data').getSection('oDataLen') )
|
return Util.a2i( $final.getSection('data').getSection('oDataLen') );
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</packet>
|
</packet>
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package com.sunyard;
|
|||||||
|
|
||||||
|
|
||||||
import com.sunyard.inf.*;
|
import com.sunyard.inf.*;
|
||||||
|
import com.sunyard.inf.customize.Syd4DigitalEnvelope;
|
||||||
import com.sunyard.inf.customize.SydHAApi;
|
import com.sunyard.inf.customize.SydHAApi;
|
||||||
import com.sunyard.inf.customize.SydQNUCApi;
|
import com.sunyard.inf.customize.SydQNUCApi;
|
||||||
import com.sunyard.inf.customize.SydUnionPayApi;
|
import com.sunyard.inf.customize.SydUnionPayApi;
|
||||||
@ -14,7 +15,7 @@ import racal.sunyard.main.SydApiBuilder;
|
|||||||
public interface SydApi extends
|
public interface SydApi extends
|
||||||
SydRawApi, SydCertApi, SydCryptionApi, SydGenApi,
|
SydRawApi, SydCertApi, SydCryptionApi, SydGenApi,
|
||||||
SydSVApi, SydHAApi, SydQNUCApi, SydPledge, SydPINOpt,
|
SydSVApi, SydHAApi, SydQNUCApi, SydPledge, SydPINOpt,
|
||||||
SydManufactureApi, SydZYOption, SydUnionPayApi {
|
SydManufactureApi, SydZYOption, SydUnionPayApi ,Syd4DigitalEnvelope{
|
||||||
|
|
||||||
byte ALG_AES = 0x30;
|
byte ALG_AES = 0x30;
|
||||||
byte ALG_SM4 = 0x31;
|
byte ALG_SM4 = 0x31;
|
||||||
@ -101,6 +102,7 @@ public interface SydApi extends
|
|||||||
// 单例可以不实现
|
// 单例可以不实现
|
||||||
void error();
|
void error();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取加密机cpu,内存,磁盘使用状况
|
* 获取加密机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 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2310,6 +2310,7 @@ public class SydApi4j implements SydApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) {
|
public RetWrap generateDEByDnHsm(String certSerial, byte[] oData) {
|
||||||
|
|
||||||
certSerial = DnUtil.verifyDn( certSerial );
|
certSerial = DnUtil.verifyDn( certSerial );
|
||||||
@ -2923,6 +2924,142 @@ public class SydApi4j implements SydApi {
|
|||||||
return true;
|
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
|
@Override
|
||||||
public RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData) {
|
public RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData) {
|
||||||
@ -5497,6 +5633,7 @@ public class SydApi4j implements SydApi {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
* 使用SM4算法进行加密,其中加密模式为CBC,
|
* 使用SM4算法进行加密,其中加密模式为CBC,
|
||||||
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
|
||||||
* 补位模式为 PKCS5 PADDING 。
|
* 补位模式为 PKCS5 PADDING 。
|
||||||
|
|||||||
57
src/test/java/com/sunyard/sydapi/test/AAA4shangqing.java
Normal file
57
src/test/java/com/sunyard/sydapi/test/AAA4shangqing.java
Normal file
@ -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"); //输出程序运行时间
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user