package com.topsec.ws.util; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; /** * AES加密使用的工具类 * 加密算法为密钥长度为128位的AES算法,算法运行模式选择CBC模式,填充模式选择PKCS5Padding, 加密时使用的初始化向量固定为0000000000000000。生成密文后,发送方需要将密文按16进制编码再进行接口调用实现网络传输; 收到密文后,接收方需要进行逆过程用以解密。 当且仅当安全管理软件采用WSSmCommLower中的fillConfig接口向安全设备下发通信参数配置(SDMI_Config_1.00)时, oprCode不加密,configXml使用密钥12345678901234567890123456789012按照上述加密方式进行加密。 WSSmUpper中每一个report接口的deviceID参数均不加密。 其余通信内容(包括WSSmCommLower和WSSmCommUpper中的其余任意接口的任意参数, 以及WSSmCommLower.fillConfig接口中的数据上报配置和界面集成配置)中的oprCode和xml, 加密密钥为设备ID的小写md5值(设备ID为SDMI_Config_1.00里面下发的DeviceId)。 经加密后的通信内容中,合法的16进制字符包括0123456789abcdef,以及仅在deviceID字段中可能出现的连接符- 出现其余任意字符均会被判定不合法从而导致验证失败。 使用过程中,安全管理软件可能会在下发的通信参数配置(SDMI_Config_1.00)里重新为安全设备分配DeviceId, 此时安全设备应注意在通信过程中使用新的密钥对相关信息进行加解密。 * * @author hx * @date 2015年10月23日 */ public class AESTool { private static final String ALGORITHM = "AES";//加密算法 private static final String MODE = "AES/CBC/PKCS5Padding";// 运行模式:包含 加密算法/运算模式/填充模式,此处采用CBC // private static final String MODE = "AES/ECB/NoPadding";// 运行模式:包含 加密算法/运算模式/填充模式,此处采用CBC private static String initialVector = "0000000000
AES
最新推荐文章于 2020-10-24 09:40:51 发布