package com.sunyard.inf; import com.sunyard.RetWrap; import java.io.UnsupportedEncodingException; /** * 密钥生成相关接口 */ public interface SydGenApi { /** * RSA、SM2 非对称密钥产生 * * @return RetWrap 包含 privateKey 和 publicKey * privateKey LMK 加密下的私钥 * publicKey 公钥的 DER 编码 */ RetWrap SM2GenKeyPair(); /** * RSA、SM2 非对称密钥产生 * @param keyType 算法标识 0:RSA 1:SM2 * @param index 27位数字,以此索引存储生成的密钥 * @param length 长度 * @return RetWrap 包含 privateKey 和 publicKey * privateKey LMK 加密下的私钥 * publicKey 公钥的 DER 编码 * 再之前的接口上添加了索引参数 */ RetWrap SM2OrRSAGenKeyPair(int keyType,String index,int length); /** * 对称密钥产生 * @param keyType 密钥类型 * @param solution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。 * @return RetWrap 包含 * lmkKey LMK LMK加密密钥 * keyCheck 密钥校验值 * */ RetWrap genSymmetricKey(String keyType,char solution); /** * 生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥) * * 默认加密输出密钥的密钥方案为X,业务标识为N。 * @param mode 是否产生ZMK加密下的密钥,0-产生密钥。1-产生密钥并在ZMK下加密 * @param keyType 密钥类型 * @param solution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。 * @param zmk zmk * @return RetWrap 包含 * lmkKey LMK LMK加密密钥 * zmkKey ZMK加密密钥 * keyCheck 密钥校验值 */ RetWrap genSymKey(int mode, String keyType, char solution, String zmk); /** * 生成一个密钥并以分开的成份形式打印(=) * @param keyType 密钥类型 * @param solution 密钥长度/LMK 下加密密钥的方案。 * @return RetWrap * lmkKey LMK 加密下的密钥。 * keyCheck 密钥校验值 */ RetWrap genAndPrintSplit(String keyType,char solution); /** * 输出一个ZMK下加密的密钥 * @param keyType 密钥类型 * @param solution 密钥方案(ZMK) 加密输出密钥的密钥方案 * @param zmk 27 位的索引号: 16 位机构号+3 位密钥类型+8 位密钥索引号 * @param key LMK 加密的密钥。 * @return * key lmk 头 + LMK 加密下的密钥。 * keyCheck 密钥校验值 */ public RetWrap outputKey(String keyType, char solution, String zmk, String key); /** * 输入一个ZMK下加密的密钥。转换为LMK下加密 * @param keyType 密钥类型 * @param solution 加密输出密钥的密钥方案 * @param zmk zmk 27 位的索引号: 16 位机构号+3 位密钥类型+8 位密钥索引号 * @param key ZMK 加密下的密钥。 * @return RetWrap * key lmk 头 + LMK 加密下的密钥。 * keyCheck 密钥校验值 */ public RetWrap inputKey(String keyType, char solution, String zmk, String key); /** * 密钥合成 * @param keyType 密钥类型 * @param keySolution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。 * @param keyClearPattern 两个明文分量异或合成 * @return RetWrap 包含 * lmkKey LMK LMK加密密钥 * keyCheck 密钥校验值 * */ RetWrap genComposeKey(String keyType,char keySolution,String keyClearPattern); /** * 由2到9个加密的成份组成一个密钥,同时返回一个LMK对(04-05)下加密的ZMK以及校验值 * @param keys 已加密的多个ZMK成份 * @return * */ RetWrap genComposeKey(String[] keys); /** * SM2 非对称密钥产生和存储 * * @return RetWrap 包含 privateKey 和 publicKey * privateKey LMK 加密下的私钥 * publicKey 公钥的 DER 编码 */ RetWrap SYD_SM2GenKeyPair(); /** * 此函数用于会话密钥的产生,用于发起端。 * 加密机产生随机会话密钥,输出两类密文: * 1、 公钥加密的密文,用于密钥的传递。 * 2、 本地 LMK 加密,用于本地应用数据的加解密。 * * @param publicKey 公钥串,DER 编码,HEX 格式。 * @return CipherKey 公钥加密的会话密钥,DER 编码,HEX 格式, SessionKey 本地LMK 加密的会话密钥,HEX 格式 , KCV 会话密钥的检验值,HEX 格式,长度为 16H */ RetWrap SM2GenSessionKey(String publicKey); /** * 生成数字信封 * @param publicKey 公钥 * @return * CipherKey: 公钥加密的会话密钥,DER 编码,HEX 格式, * SessionKey: 本地LMK 加密的会话密钥,HEX 格式 , * KCV: 会话密钥的检验值,HEX 格式,长度为 16H。 */ RetWrap genDigitalEnvelope(String publicKey); /** * 解密数字信封 * * @param sk 私钥索引 * @param cipherKey 密文 * @return sessionKey LMK加密下的密钥 */ String deDigitalEnvelope(String sk, String cipherKey); /** * @Description: 数字信封加密数据,会员专用 * @Param: [pk, inPutData,msgId] * @return: byte[] 格式:sessionByPk+\r\n+头+\r\n+密文 * @Author: wp * @Date: 2020/11/20 */ String genDigitalEnvelopeWithDM(String pk, String inPutDataStr,String msgId) throws UnsupportedEncodingException; /** * 数字信封加密数据,票价所定制格式 * @param pk 公钥值 * @param inPutData 报文明文 * @return 报文密文 格式:sessionByPk(base64)+\r\n+密文(base64) * @throws UnsupportedEncodingException */ String genDigitalEnvelopeWithData(String pk,String inPutData) throws UnsupportedEncodingException; /** * 解密数字信封,解密数据 * @param sk 私钥索引 * @param inPutData 报文密文 * @return 报文明文 * @throws UnsupportedEncodingException */ String deDigitalEnvelopeWithData(String sk, String inPutData) throws UnsupportedEncodingException; /** * 将秘钥从 PK 加密转为 LMK 加密 * @param skIndex 私钥索引 * @param sessionKey 会话秘钥密文 * @return 会话秘钥密文 */ String transKeyFromPkToLmk(String skIndex, String sessionKey); /** * 此函数用于会话密钥的接收,用于接收端。 * 加密机通过使用者 ID 所对应的私钥解密对方公钥加密的密文,输出本地 LMK 加密的会话密钥,用于本地应用数据的加解密。 * * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。 * @param cipherKey 公钥加密的会话密钥,DER 编码,HEX 格式 * @return SessionKey : 本地LMK 加密的会话密钥,HEX 格式 ; KCV 会话密钥的检验值,HEX 格式,长度为 16H。 */ RetWrap SM2ConfirmSessionKeyC(String userId, String cipherKey); /** * 此函数用于会话密钥的接收,用于接收端。 * 加密机通过使用者 ID 所对应的私钥解密对方公钥加密的密文,输出本地 LMK 加密的会话密钥,用于本地应用数据的加解密。 * * @param sk 私钥 * @param cipherKey 公钥加密的会话密钥,DER 编码,HEX 格式 * @return SessionKey : 本地LMK 加密的会话密钥,HEX 格式 ; KCV 会话密钥的检验值,HEX 格式,长度为 16H。 */ RetWrap SM2ConfirmSessionKey(String sk, String cipherKey); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * @param dn 对*方 X509 证书DN。 * @param alg 算法标识,0:AES,1:SM4 * @param model 证书模式,0:证书序号,1:证书 DN * @return RetWrap 包含 CipherKey SessionKey KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDEByDn(byte[] dn, int alg, int model) throws Exception; /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * @param certSerial 证书DN。 * @param oData 明文数据 * @return RetWrap 包含 CipherKey SessionKey KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDEByDn(byte[] certSerial, String oData); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * @param certSerial 证书DN或SN。 * @param alg 算法标识,0:AES,1-3:SM4 * @param model 证书模式,0:证书序号,1:证书 DN * @param oData 明文数据 * @return RetWrap 包含 CipherKey SessionKey KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDE(byte[] certSerial, int alg, int model, String oData); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * @param certSerial 对*方 X509 证书的序列号。 * @param nAlg 算法标识,0:AES,1:SM4 * @return RetWrap 包含 CipherKey, SessionKey, KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDEbyGS(String certSerial, byte nAlg); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * * @param certSerial 对*方 X509 证书的序列号。 * @param orgCode 机构码 * @return RetWrap 包含 CipherKey, SessionKey, KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDEbyGS(String certSerial, String orgCode); /** * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * @param certSerial 对*方 X509 证书的序列号。 * @param nAlg 算法标识,0:AES,1:SM4 * @return RetWrap 包含 CipherKey, SessionKey, KCV * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 */ RetWrap generateDE( String certSerial, byte nAlg ); /** * 接收用私钥解密数字信封,还原对称密钥。 * * @param pCertSerial 输入。 对方 X509 证书的序列号。 * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码 * @return RetWrap 包含 SessionKey KCV * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文 * KCV 会话密钥的检验值,HEX 格式,长度为 36H。 * orgCode 如果有机构码的话会返回机构码 */ RetWrap decryptDE( String pCertSerial, String pCipherKey ); /** * 接收用私钥解密数字信封,还原对称密钥。 * 默认会传P * @param certSerial 输入。 对方 X509 证书的DN。 * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码 * @return RetWrap 包含 SessionKey KCV * oData 如果有机构码的话会返回原数据 * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文 * KCV 会话密钥的检验值,HEX 格式,长度为 36H。 * orgCode 如果有机构码的话会返回机构码 */ RetWrap decryptDEByDN(byte[] certSerial, String pCipherKey); /** * 接收用私钥解密数字信封,还原对称密钥。 * * @param pFlag 输入。 p标识,如果为true,则传入P * @param model 输入。 证书模式,0:证书序号,1:证书 DN * @param certSerial 输入。 对方 X509 证书的序列号或DN。 * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码 * @return RetWrap 包含 SessionKey KCV * oData 如果有机构码的话会返回原数据 * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文 * KCV 会话密钥的检验值,HEX 格式,长度为 36H。 * orgCode 如果有机构码的话会返回机构码 */ RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey); /** * 产生要求长度的随即数据串,可用于身份认证 * * @param nRandomSize 需要输出的随机串的长度 * @return 未抛出异常表示成功, 返回 HEX 格式的密钥 * */ String GenerateRandom( int nRandomSize ); }