修改注释,添加甘肃银行数字货币测试类

This commit is contained in:
zhoubin 2021-12-02 15:59:06 +08:00
parent bd3037786f
commit e877e80da9
4 changed files with 199 additions and 3 deletions

View File

@ -73,7 +73,7 @@ public interface SydCertApi {
/** /**
* 通过使用者 ID 获取的 X509 证书文件 * 通过使用者 ID 获取的 X509 证书文件
* @param userId 使用者的 ID最大长度为 16 位数字(要与生成实体的机构号保持一致) * @param userId 使用者的 ID最大长度为 16 位数字(要与生成实体的机构号保持一致)
* @param nCertType 证书类型0x00:签名证书, 0x01:加密证书 * @param nCertType 证书类型0:签名证书, 1:加密证书
* @return base64 编码的证书 * @return base64 编码的证书
*/ */
String GetX509CertFileC( String GetX509CertFileC(

View File

@ -193,7 +193,7 @@ interface SydSYMApi {
/** /**
* 用输入的会话密钥对指定报文数据进行加密处理填充模式为1 * 用输入的会话密钥对指定报文数据进行加密处理填充模式为1
* *
* @param nAlg 算法标识.,0x00:3DES0x01:SM4 * @param nAlg 算法标识., 1:DES,2:AES256,3:SM4
* @param seesionKey 本地LMK 加密的会话密钥HEX 格式 * @param seesionKey 本地LMK 加密的会话密钥HEX 格式
* @param pINdata 要加密的报文明文必须是 8 或16 的倍数 * @param pINdata 要加密的报文明文必须是 8 或16 的倍数
* @return 输出的报文密文, 长度为报文明文 + 16 * @return 输出的报文密文, 长度为报文明文 + 16
@ -225,7 +225,7 @@ interface SydSYMApi {
/** /**
* 用输入的会话密钥对指定报文数据进行解密处理填充模式为1 * 用输入的会话密钥对指定报文数据进行解密处理填充模式为1
* *
* @param nAlg  算法标识.,0x00:3DES0x01:SM4 * @param nAlg  算法标识.1:DES,2:AES256,3:SM4
* @param seesionKey 本地LMK 加密的会话密钥HEX 格式 * @param seesionKey 本地LMK 加密的会话密钥HEX 格式
* @param pINdata 要解密的报文密文长度必须是8 或16 的倍数 * @param pINdata 要解密的报文密文长度必须是8 或16 的倍数
* @return 输出的报文明文 * @return 输出的报文明文

View File

@ -10,6 +10,7 @@ public interface SydQNUCApi {
/** /**
* 用指定的证书私钥对指定的数据进行数字签名 * 用指定的证书私钥对指定的数据进行数字签名
* 最大签名原始数据为8161byte
* @param pCertSerial 输入签名 X509 证书的序列号 * @param pCertSerial 输入签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据 * @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码) * @return 签名数据(BASE64 编码)

View File

@ -0,0 +1,195 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.util.Base64;
/**
* 甘肃银行数字货币
*/
public class TestGSYH {
SydApi4j api;
// 对方加密证书sn
String sn = "1004282452";
// 自己签名证书sn
String sn1 = "1004282451";
@Before
public void before() {
// 通过设置debug的属性开启debug如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
}
@Test
public void test02() {
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
// 2.
String data = "1111111111111111";
// 随机生成对称密钥由指定的公钥加密生成数字信封
RetWrap retWrap = api.generateDE(sn, (byte) 0x31);
String sessionKey = (String) retWrap.get("SessionKey");
// sm4加密账号等数据
byte[] dataEnc = api.SYMEncryptData(3, sessionKey, data.getBytes());
// base64转码
byte[] dataEncBs64 = encoder.encode(dataEnc);
// 将sm2加密后的数据进行base64转码
String cipherKey = (String) retWrap.get("CipherKey");
byte[] cipherKeyBs64 = encoder.encode(cipherKey.getBytes());
// 3.
// 报文正文
String msg = "12313146464564";
// 对报文正文签名内部会计算hash
String msgSign = api.netSign(sn1, msg.getBytes());
// base64转码
byte[] msgSignBs64 = encoder.encode(msgSign.getBytes());
// -------------下面为城银清算步骤-----------------
// 7.
// base64解码
byte[] msgSignB = decoder.decode(msgSignBs64);
// 对报文验签
boolean b = api.netVerify(sn1, dataEncBs64, new String(msgSignB));
System.out.println("验签结果: " + b);
// 8.
byte[] cipherKeyB = decoder.decode(cipherKeyBs64);
// 解密数字信封获取对称密钥
RetWrap retWrap1 = api.decryptDE(sn, new String(cipherKeyB));
sessionKey = (String) retWrap1.get("SessionKey");
// 9.
// 使用对称密钥解密报文
dataEnc = decoder.decode(dataEncBs64);
byte[] bytes1 = api.SYMDecryptData(3, sessionKey, dataEnc);
System.out.println("data: " + new String(bytes1));
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
// 测试通过
// 8017
@Test
public void testGetX509CertFileC() {
String userId = "8001";
/**
* 通过使用者 ID 获取的 X509 证书文件
* @param userId 使用者的 ID最大长度为 16 位数字(要与生成实体的机构号保持一致)
* @param nCertType 证书类型0:签名证书, 1:加密证书
* @return base64 编码的证书
*/
String s = api.GetX509CertFileC(userId, 1);
System.out.println(s);
/**
* 输入 X509 格式的证书获取证书信息
* @param pCert base64 编码的证书
* @return 证书信息类
* 证书信息类包含颁发者DN 证书序列号 证书主题证书有效期的起始时间证书有效期的终止时间DER编码的公钥
*/
X509 x509 = api.GetX509CertInfo(s);
byte[] pubKey = x509.getPubKey();
System.out.println("publicKey: " + Util.bytes2HexString(pubKey));
}
@Test
public void test() {
// 证书序号
String sn = "1004282451";
String data = "111";
/**
* 用指定的证书私钥对指定的数据进行数字签名
* @param pCertSerial 输入签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @return 签名数据(BASE64 编码)
*/
String s = api.netSign(sn, data.getBytes());
/**
* 用指定证书对指定的原始数据进行数字签名验证
* @param pCertSerial 输入 签名 X509 证书的序列号
* @param pOrgData 输入 待签名的原始数据
* @param pSignData 输入 签名数据(BASE64 编码)
* @return true 表示验证正确false 表示失败
*/
// 12对正文进行验签内部会计算hash
boolean b = api.netVerify(sn, data.getBytes(), s);
System.out.println(b);
String sn1 = "1004282452";
/**
* 产生对称密钥通过公钥加密生成网联格式的数字信封
*
* @param certSerial * X509 证书的序列号
* @param nAlg 算法标识,0:AES1SM4
* @return RetWrap 包含 CipherKey, SessionKey, KCV
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
* SessionKey 本地LMK 加密的会话密钥HEX 格式, 本地 LMK 加密的会话密钥长度HEX 格式(不包括第 1 个字符)一般为 33 Bytes默认输入值为缓冲区的大小
* KCV 会话密钥的检验值HEX 格式长度为 32H
*/
RetWrap retWrap = api.generateDE(sn1, (byte) 0x31);
String CipherKey = (String) retWrap.get("CipherKey");
/**
* 接收用私钥解密数字信封还原对称密钥
*
* @param pCertSerial 输入 对方 X509 证书的序列号
* @param pCipherKey 输入 公钥加密的会话密钥,BASE64 编码
* @return RetWrap 包含 SessionKey KCV
* SessionKey 输出 本地LMK 加密的会话密钥格式为密钥类型|密钥密文比如02|密钥密文
* KCV 会话密钥的检验值HEX 格式长度为 36H
*/
// 13解密数字信封获取对称密钥
RetWrap rw = api.decryptDE(sn1, CipherKey);
String sessionKey = (String) rw.get("SessionKey");
/**
* 用输入的会话密钥对指定报文数据进行加密处理填充模式为1
*
* @param nAlg 算法标识. 3:SM4
* @param seesionKey 本地LMK 加密的会话密钥HEX 格式
* @param pINdata 要加密的报文明文必须是 8 或16 的倍数
* @return 输出的报文密文, 长度为报文明文 + 16
*/
byte[] bytes = api.SYMEncryptData(3, sessionKey, "1111111111111111".getBytes());
/**
* 用输入的会话密钥对指定报文数据进行解密处理填充模式为1
*
* @param nAlg  算法标识.3:SM4
* @param seesionKey 本地LMK 加密的会话密钥HEX 格式
* @param pINdata 要解密的报文密文长度必须是8 或16 的倍数
* @return 输出的报文明文
*/
// 13使用对称密钥解密敏感数据
byte[] bytes1 = api.SYMDecryptData(3, sessionKey, bytes);
System.out.println(new String(bytes1));
}
}