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"); //输出程序运行时间 } } }