sydapi/src/test/java/sample/ShangqingXingye.java

111 lines
4.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package sample;
import cn.hutool.crypto.asymmetric.SM2;
import com.sunyard.RetWrap;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import com.sunyard.util.ASN1Util;
import com.sunyard.util.CertUtil;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchProviderException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
public class ShangqingXingye {
private static final byte[] orgData2k = new byte[ 16 ];
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
long startTime = System.currentTimeMillis(); //获取开始时间
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build();
try {
String orgData = "123456";
//
/**
* 产生对称密钥,通过公钥加密生成数字信封,。
* @param pcDnEN: 清算所的公钥证书
* @param pcData: 明文数据。
* @return RetWrap: 数字信封
*/
RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k);
byte[] cpkey2 = (byte[]) signData.get("CipherKey");
System.out.println("加密信封:" + new String(cpkey2));
/**
* 接收用私钥解密数字信封,还原原文。。
* @param pcDnEN: 清算所的公钥证书
* @param cpkey: 数字信封。
* @return preData: 原数据
*/
RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData));
//
// /**
// * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名遵循PKCS#7
// * @param orgData: 待签名的原始数据
// * @param pcDnEN: 签名者证书 DN
// * @return signsData: 签名数据
// */
String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN);
System.out.println("签名数据:" + signsData);
/**
* 利用清算所的公钥证书对签名数据进行验签。
* @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1)
* @param orgData: 待签名的原始数据
* @param sign: 签名数据。
*/
boolean result = api.detachedVerify(1, orgData2k, signsData);
System.out.println("验签结果:" + result);
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 利用会员的私钥证书对数据进行签名
* 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
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"); //输出程序运行时间
}
}
}