package com.sunyard.inf; import com.sunyard.RetWrap; import java.io.UnsupportedEncodingException; import java.util.List; /** * 对称加解密相关接口 */ public interface SydCryptionApi extends SydSYMApi, SydASYMApi, SydHashApi { } /** * Hash 算法接口 */ interface SydHashApi { /** * 计算SM3散列值 * @param sn 证书序号 * @param userId 用户ID * @param msg 原始数据,二进制的消息块 * @return */ byte[] SM3HashSNaId(String sn, String userId, byte[] msg); /** * 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。 * @param publicKey 公钥的 DER 编码(可以为空) * @param msg 原始数据,二进制的消息块 * @param block 消息块标志 * @param mac 上一轮 mac 值,当 mac 不是 null,长度不为 0,则直接从第二包开始。 * @return HASH 值,32 个 Bytes. */ byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac); /** * 计算SM3散列值 * @param publicKey 公钥的 DER 编码 (03420004 开头) * @param userId 用户ID * @param msg 原始数据,二进制的消息块 * @return */ byte[] SM3Hash(String publicKey, String userId, byte[] msg); /** * 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。 * * @param publicKey 公钥(可以为空) * @param msg 原始数据 * @return HASH 值,32 个 Bytes. */ byte[] SM3Hash(String publicKey, byte[] msg); /** * 输入对指定的原始数据 (无公钥),通过 SM3 算法计算数据的散列值。 * * @param msg 原始数据 * @return HASH 值,32 个 Bytes. */ byte[] SM3Hash(byte[] msg); public byte[] MACCalc(int alg, int keyType, int fullmode, int maclen, String key, byte[] infoData); /** * mac 计算 * @param alg 0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19 * @param keyType 0-TAK 1-ZAK * @param fullMode 0-弱填充 1 强填充 * @param AK 密钥 * @param infoData <=1024 * @param macLen 1=4Byte 2=8Byte 3=16Byte(仅在SM4/AES 下有效) * @return mac 值 hex 格式 */ public String MACCalc(int alg, int keyType, String AK, int fullMode, byte[] infoData, int macLen); public void MACCheck(int alg, int keyType, String AK, int fullMode, byte[] infoData, String mac); public String calcPBOCMAC(int mode, int keyType, String key, byte[] data, int block, byte[] iv); } /** * 非对称加解密接口 */ interface SydASYMApi { /** * 用指定的 SM2 公钥对指定的密文数据进行加密。 * * @param publicKey 公钥钥串,DER 编码,HEX 格式。 * @param pOrgData 加密的数据。 * @return 加密的数据 base64 编码。 */ String SM2Encrypt( byte[] publicKey, byte[] pOrgData ); /** * 用指定的 SM2 公钥对指定的密文数据进行加密。 * * @param publicKey 公钥钥串,DER 编码,HEX 格式。 * @param pOrgData 加密的数据。 * @return 加密的数据 der 编码。 */ byte[] SYD_SM2_Encrypt(byte[] publicKey, byte[] pOrgData); /** * 用指定的 SM2 公钥对指定的密文数据进行加密。 * 输出的sm2密文结构为C1C2C3格式 * @param publicKey 公钥钥串,DER 编码,HEX 格式。 * @param pOrgData 加密的数据。 * @return 加密的数据 base64 编码。 */ String SM2EncryptOrder(byte[] publicKey, byte[] pOrgData); /** * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。 * * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。 * @param pEnData 加密的数据,base64 编码。 * @return 明文数据。 */ byte[] SM2DecryptC(String userId, String pEnData); /** * 使用外部私钥解密 * @param sk LMK下加密的私钥 * @param enData 密文数据(base64 编码) * @return 解密结果 */ byte[] SM2Decrypt(byte[] sk, String enData); /** * 使用外部私钥解密 * @param sk LMK下加密的私钥 * @param enData 密文数据(DER 编码) * @return 解密结果 */ byte[] SYD_SM2_Decrypt(byte[] sk, byte[] enData); /** * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。 * 输入的sm2密文结构为C1C2C3格式 * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。 * @param enData 加密的数据,base64 编码。 * @param keyType 密钥类型,0:签名证书, 1:加密证书。 * @return 明文数据。 */ byte[] SM2DecryptOrder(String userId, String enData, int keyType); /** * 用指定的 RSA 私钥对指定的密文数据进行加密。 * * @param publicKey 私钥串,DER 编码,HEX 格式。 * @param pOrgData 加密的数据。 * @return 加密的数据 base64 编码。 */ String RSAEncrypt( String publicKey, byte[] pOrgData ); /** * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。 * * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。 * @param pEnData 加密的数据,base64 编码。 * @return 明文数据。 */ byte[] RSADecryptC( String userId, String pEnData ) throws Exception; /** * 使用外部私钥解密 * @param sk * @param enData * @return */ public byte[] RSADecrypt(String sk, String enData) throws Exception; /** * 非对称公钥加密 * @param alg 算法标识,0 = RSA 1 = SM2 * @param pk 公钥的 DER 编码 * @param data 数据 * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT). */ public byte[] encryptByPk(int alg, String pk, byte[] data); /** * 非对称私钥解密 * @param alg 算法标识:0 = RSA 1 = SM2 * @param sk 私钥值,LMK下加密的私钥 * @param data 密文数据(DER 编码) * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT) */ public byte[] decryptBySk(int alg, String sk, byte[] data); /** * 非对称私钥解密 * @param alg 算法标识:0 = RSA 1 = SM2 * @param userId 16位机构号 * @param data 密文数据(DER 编码) * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT). */ public byte[] decryptBySkC(int alg, String userId, byte[] data); } /** * 对称加解密接口 */ interface SydSYMApi { /** * E0 指令复合接口 * @param isEn 指定加解密,true为加密,false为解密 * @param nAlg 密钥模式,当isEn为true时,默认为SM4加密,0为DES加密,1为AES256 加密。当isEn为false时,默认为SM4解密,0为DES解密,1为AES256解密 * @param seesionKey 密钥 * @param roundmod 轮模式,密钥加密模式:1=ECB,2=CBC,3=CFB,4=OFB * @param fullMode 填充模式:0为饥饿模式,1为贪婪模式 * @param pInData 消息数据 * @param iv IV * @param block 消息块号 * @return * iv: IV 数据域 * msg_all: 消息数据 */ RetWrap SYMEnDeData(Boolean isEn, int nAlg, String seesionKey, int roundmod, int fullMode, byte[] pInData, byte[] iv, int block); /** * 用输入的会话密钥,对指定报文数据进行加密处理。填充模式为1 * * @param nAlg 算法标识., 0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 */ byte[] SYMEncryptData(int nAlg, String seesionKey, byte[] pINdata); /** * 对指定报文数据进行SM4加密 * @param type 密钥类型。0: ZEK,1: TEK * @param userId 生成密钥时的机构号。 * @param index 密钥索引 * @param data 待加密的数据 * @return */ byte[] SYMSM4EncDataByIndex(int type, String userId, String index, byte[] data); /** * 用输入的会话密钥,对指定报文数据进行加密处理。 * * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式 * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 */ byte[] SYMEncryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata); List SYMEncryptDecryptBatchData(int nAlg, String[] seesionKey, int fullmode, List pINdata); /** * 用输入的会话密钥,对指定报文数据进行加密处理。 * * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pInData 要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 */ byte[] SYMEncryptData_nofill(int nAlg, String seesionKey, byte[] pInData); /** * 用输入的会话密钥,对指定报文数据进行解密处理。填充模式为1 * * @param nAlg  算法标识.0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 */ byte[] SYMDecryptData(int nAlg, String seesionKey, byte[] pINdata); /** * 用输入的会话密钥,对指定报文数据进行解密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式 * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 */ byte[] SYMDecryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata); /** * 用输入的会话密钥,对指定报文数据进行解密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pInData 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 */ byte[] SYMDecryptData_nofill(int nAlg, String seesionKey, byte[] pInData); /** * 加解密数据(E1) * @param nAlg 密钥模式,默认为SM4解密,0:DES加密,1:AES256 解密 * @param seesionKey 密钥 * @param inputPath 输入消息数据的文件路径 * @param outputPath 输出消息数据的文件路径 * @return */ boolean SYMDecryptDataWithFile(int nAlg, String seesionKey, String inputPath, String outputPath) throws Exception; /** * 使用SM4算法进行加密,其中加密模式为CBC, * Ⅳ使用缺省值0X 00000000000000000000000000000000, * 补位模式为 PKCS5 PADDING 。 * @param keyType 密钥类型 0: ZEK,1: TEK * @param key 密钥 * @param inType 输入消息类型 0:二进制 1:扩展十六进制 * @param outType 输出消息类型 0:二进制 1:扩展十六进制 * @param inFilePath 需要加密的数据文件所在的路径 * @param outFilePath 加密后的密文数据将要保存的文件路径 * @return 加密是否成功。false为失败,true为成功 */ boolean SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath); /** * 使用SM4算法进行加密,其中加密模式为CBC, * Ⅳ使用缺省值0X 00000000000000000000000000000000, * 补位模式为 PKCS5 PADDING 。 * @param keyType 密钥类型 0: ZEK,1: TEK * @param key 密钥 * @param inType 输入消息类型 0:二进制 1:扩展十六进制 * @param outType 输出消息类型 0:二进制 1:扩展十六进制 * @param msg 消息数据 * @return 输出的报文密文 */ byte[] SM4EncryptDataCBC(int keyType, String key, int inType, int outType, byte[] msg); /** * 使用SM4算法进行解密,其中加密模式为CBC, * Ⅳ使用缺省值0X 00000000000000000000000000000000, * 补位模式为 PKCS5 PADDING 。 * @param keyType 密钥类型 0: ZEK,1: TEK * @param key 密钥 * @param inType 输入消息类型 0:二进制 1:扩展十六进制 * @param outType 输出消息类型 0:二进制 1:扩展十六进制 * @param inFilePath 加密后的密文数据将要保存的文件路径 * @param outFilePath 解密后的数据文件所在的路径 * @return 解密是否成功。false为失败,true为成功 */ boolean SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) throws UnsupportedEncodingException; /** * 使用SM4算法进行解密,其中加密模式为CBC, * Ⅳ使用缺省值0X 00000000000000000000000000000000, * 补位模式为 PKCS5 PADDING 。 * @param keyType 密钥类型 0: ZEK,1: TEK * @param key 密钥 * @param inType 输入消息类型 0:二进制 1:扩展十六进制 * @param outType 输出消息类型 0:二进制 1:扩展十六进制 * @param msg 加密后的消息数据 * @return 输出的报文明文 */ byte[] SM4DecryptDataCBC(int keyType, String key, int inType, int outType, byte[] msg); /** * 用输入的会话密钥,对指定报文数据进行加密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey  本地LMK 加密的会话密钥,HEX 格式 * @param pINdata  要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 */ byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, byte[] pINdata); /** * 用输入的会话密钥,对指定报文数据进行加密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey  本地LMK 加密的会话密钥,HEX 格式 * @param fullmode  填充模式:0为饥饿模式,1为贪婪模式 * @param pInData  要加密的报文明文。必须是 8 或16 的倍数。 * @return 输出的报文密文, 长度为报文明文 + 16 */ byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData); /** * 用输入的会话密钥,对指定报文数据进行解密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 */ byte[] SYMDecryptDataCBC(int nAlg, String seesionKey, byte[] pINdata); /** * 用输入的会话密钥,对指定报文数据进行解密处理。 * * @param nAlg  算法标识.,0x00:3DES,0x01:SM4。 * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式 * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式 * @param pInData 要解密的报文密文。长度必须是8 或16 的倍数。 * @return 输出的报文明文。 */ byte[] SYMDecryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData); /** * 用输入的会话密钥,对指定报文数据进行解密处理。 * * @param srcKey  源秘钥.十六进制字符串。 * @param desKey  目的秘钥.十六进制字符串。 * @param sca  源算法SCA.Int类型。 * @param sPin  源PIN块.十六进制字符串。 * @param primaryAccount  主账号.十六进制字符串。 * @return 目的Pin块。 */ byte[] transPinFrOneKeyToAno(String srcKey, String desKey, int sca, String sPin, String primaryAccount); /** * 用一把DEK密钥加密数据, 报文总长度不大于8192 * * @param alg 加密算法 * @param DEK DEK密钥 * @param infoData 数据 * @param vector 初始向量数据 可选项,当加密模式为CBC,CFB或OFB时才显示此项 * @param disperseAlg 分散算法 * @return 密文数据 */ byte[] SYD_Encrypt_Data(int alg, String DEK, byte[] infoData, byte[] vector, int disperseAlg, byte[] factor); /** * 用DEK密钥解密数据, 报文总长度不大于8192 * * @param alg 解密算法 * @param DEK DEK密钥 * @param infoData 数据密文 * @param vector 初始向量数据 可选项,当加密模式为CBC,CFB或OFB时才显示此项 * @param disperseAlg 分散算法 * @return 解密后的明文数据 */ byte[] SYD_Decrypt_Data(int alg, String DEK, byte[] infoData, byte[] vector, int disperseAlg, byte[] factor); /** * 对于给定的数据生成一个MAC * * @param key LMK对(16-17)下加密的TAK * @param infoData 生成MAC的数据 * @param IV * @param disperseNum 指定对根密钥分散的次数(1-3次) * @param disperseAlg 分散算法 * @return 所计算出的MAC */ byte[] SYD_MAC_Data(String key, String infoData, byte[] factor, String IV, int disperseNum, int disperseAlg); /** * 对称加密数据 * @param key 索引地址,指示用户密钥存储区的27位地址 * @param intPutData 消息数据 * @return * iv: IV 数据域 * msg_all: 消息数据 */ public String SYMEncrytByKeyIndex( String key, String intPutData); /** * 对称解密数据 * @param key 索引地址,指示用户密钥存储区的27位地址 * @param intPutData 消息数据 * @return 消息数据 */ public String SYMDecrytByKeyIndex(String key,String intPutData); //通过索引读取对称秘钥 RetWrap readKey(String index); }