增加及修改文件以适应RSA密钥签名验签功能

This commit is contained in:
yihzhou
2022-10-26 10:05:14 +08:00
parent 01f7ac1f31
commit 99b5956143
18 changed files with 1155 additions and 89 deletions
@@ -0,0 +1,73 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.proto.Util;
import com.sunyard.util.ASN1Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class RSASignVertify {
private static final String RSADN = "C=cn,O=CFCA TEST CA,OU=CIPSTEST,OU=Units,CN=041@3CIPSCNSHCLR@CN000000129@00000018";
private static final byte[] orgData={1,2,3,4,5,6};
private static final String SM2DN = "C=CN,O=123,OU=23,OU=23,CN=32";
// public p1
// p7attach
// p7detach
public static void main(String[] args) throws IOException {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
//long startTime = System.currentTimeMillis(); //设置系统时间
SydApiBuilder builder = new SydApiBuilder().setIp("172.16.18.59");
SydApi4j api = (SydApi4j) builder.build();
//
// byte[] nakedSign = api.SYD_NakedSign(1,orgData,RSADN);
// System.out.println("nakedSign"+nakedSign);
// byte[] sm2Sign = api.SYD_NakedSign(orgData,SM2DN);
// System.out.println("sm2Sign:"+sm2Sign);
//
// boolean nakedVerify = api.SYD_NakedVerify(1, orgData, nakedSign, RSADN);
// System.out.println(nakedVerify);
// boolean nakedVerify2 = api.SYD_NakedVerify( orgData, sm2Sign, SM2DN);
// System.out.println(nakedVerify2);
// String attachedSign = api.attachedSign(orgData, SM2DN);
// //System.out.println(attachedSign);
// boolean attachedVerify = api.attachedVerify(attachedSign);
// System.out.println(attachedVerify);
//
// String attachedSign2 = api.attachedSign(1,orgData, RSADN);
// String attachedSign3 = api.attachedSign(2,orgData, RSADN);
// String attachedSign4 = api.attachedSign(3,orgData, RSADN);
// System.out.println("签名1:"+attachedSign2);
// System.out.println("签名2:"+attachedSign3);
// System.out.println("签名3:"+attachedSign4);
// boolean attachedVerify2 = api.attachedVerify(attachedSign2);
// RetWrap retWrap = ASN1Util.takeOutOriginDataFromPKCS7Sign(attachedSign2);
// System.out.println(attachedVerify2);
// byte[] orgData = (byte[]) retWrap.get("orgData");
// String cert = (String) retWrap.get("cert");
// System.out.println(Util.bytes2HexString(orgData));
// System.out.println(Util.bytes2HexString(Util.decodeBase64(cert)));
// System.out.println("证书:"+Util.bytes2HexString(Util.encodeBase64(RSADN.getBytes("GBK")).getBytes("GBK")));
String detachedSign = api.detachedSign(1, orgData, SM2DN);
System.out.println(detachedSign);
String detachedSign2 = api.detachedSign(1,0, orgData, RSADN);
System.out.println(detachedSign2);
boolean detachedVerify = api.detachedVerify(1, orgData, detachedSign);
boolean detachedVerify2 = api.detachedVerify(1,0, orgData, detachedSign2);
System.out.println(detachedVerify);
System.out.println(detachedVerify2);
// String RSAsign = api.attachedSign(1, orgData.getBytes("GBK"), RSADN);
}
}
@@ -537,7 +537,7 @@ public class TestLast {
RetWrap retWrap1 = api.conutHash(1,0, key2.getBytes(), key1.getBytes());
byte[] bytes = api.RSASignC("0000000000000005", 1, 0,(byte[]) retWrap1.get("hash"));
System.out.println(bytes);
}*/
}
/* //15.6 RSA验证签名(+)
@@ -560,7 +560,7 @@ public class TestLast {
//15.7计算HASH散列值(MD5\SHA1\SHA256)(+) -> pass
@Test
public void RSASignC() {
RetWrap retWrap1 = api.conutHash(1, 0, key2.getBytes(), key1.getBytes());
RetWrap retWrap1 = api.countHash(1, 0, key2.getBytes(), key1.getBytes());
System.out.println(retWrap1);
}
+85
View File
@@ -0,0 +1,85 @@
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 Shanghairenhang {
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(0,RSA, orgData.getBytes());
byte[] cpkey2 = (byte[]) signData.get("CipherKey");
System.out.println("加密信封:" + new String(cpkey2));
/**
* 接收用私钥解密数字信封,还原原文。。
* @param pcDnEN: 清算所的公钥证书
* @param cpkey: 数字信封。
* @return preData: 原数据
*/
RetWrap oDataWrap = api.decryptDEByDN(0,RSA, cpkey2);
byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData));
//
} catch (Exception e) {
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
// String [] certDNs =(String []) allCert.get("certDNs");
// System.out.println(certDNs);
}
}
+149 -64
View File
@@ -1,85 +1,137 @@
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;
public class ShangqingXingye {
private static final byte[] orgData2k = new byte[ 2 * 1024];
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
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;
public static void main(String[] args) {
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.100");
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build();
try {
String orgData = "123456";
// String signData = null;
// String certByDn = api.getCertByDn(RSA);
// System.out.println(certByDn);
// boolean signedBySM2Cert = CertUtil.isSM2Cert(certByDn);
// System.out.println(signedBySM2Cert);
// signData= api.attachedSign(2,orgData.getBytes(),RSA);
// System.out.println("加签"+signData);
// RetWrap ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(signData);
// String cert =(String)ret.get("cert");
//
//
// String cert_begin = "-----BEGIN CERTIFICATE-----\n";
// String end_cert = "\n-----END CERTIFICATE-----";
// String pemCert = cert_begin + cert + end_cert;
// System.out.println(pemCert);
// boolean signedBySM2Cert1 = CertUtil.isSM2Cert(pemCert);
// System.out.println(signedBySM2Cert1);
//
// boolean signedBySM2Cert2 = CertUtil.isSignedBySM2Cert(signData);
// System.out.println(signedBySM2Cert2);
/**
* 产生对称密钥,通过公钥加密生成数字信封,。
* @param pcDnEN: 清算所的公钥证书
* @param pcData: 明文数据。
* @return RetWrap: 数字信封
*/
RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k);
byte[] cpkey2 = (byte[]) signData.get("CipherKey");
System.out.println("加密信封:" + new String(cpkey2));
RetWrap retWrap = api.countHash(2,1, orgData.getBytes(),null);
// byte[] hashData = (byte[]) retWrap.get("hash");
byte[] filterData = (byte[]) retWrap.get("filterData");
System.out.println("过渡数据:"+Util.bytes2HexString(filterData));
/**
* 接收用私钥解密数字信封,还原原文。。
* @param pcDnEN: 清算所的公钥证书
* @param cpkey: 数字信封。
* @return preData: 原数据
*/
RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData));
RetWrap retWrap2 = api.countHash(2,3, orgData.getBytes(),filterData);
//byte[] filterData2 = (byte[]) retWrap2.get("filterData");
byte[] finalhash = (byte[]) retWrap2.get("hash");
//System.out.println("中间数据:"+Util.bytes2HexString(filterData2));
System.out.println("最终数据:"+Util.bytes2HexString(finalhash));
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循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));
//
// /**
// * 产生对称密钥,通过公钥加密生成数字信封,。
// * @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) {
@@ -89,5 +141,38 @@ public class ShangqingXingye {
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
RetWrap allCert = api.getAllCert(0);
printRetWrap(allCert);
String[] certDNs =(String[]) allCert.get("certDNs");
System.out.println(certDNs[1]);
ArrayList<String> certlist = new ArrayList<String>();
Collections.addAll(certlist, certDNs);
System.out.println("1111"+certlist.get(2));
String certByDn = api.getCertByDn(RSA);
System.out.println(certByDn);
X509 certInfo = api.GetX509CertInfo(certByDn);
System.out.println(certInfo.getSubject());
boolean sm2Cert = CertUtil.isSM2Cert(certByDn);
System.out.println(sm2Cert);
// String [] certDNs =(String []) allCert.get("certDNs");
// System.out.println(certDNs);
}
}
}