//在使用AES解密中,发现JAVA没有 AES/ECB/ZeroPadding的模式,于是手动书写了一个,如下
ZeroPadding原理是 不足16的倍数未使用0x00补位
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
/**
* class description<br/>
*
* @author wgc
* @version 1.0
* @date 2020/3/5 16:24
* @since JDK 1.8+
*/
@Slf4j
public enum AES128 {
/**
* 加密
*/
ENCRYPT {
@Override
public String doFinal(String str, String password) {
try {
Cipher cipher = Cipher.getInstance(CIPHERMODE);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(AES128.to16BitBytes(password), "AES"));
return DatatypeConverter.printHexBinary(cipher.doFinal(AES128.to16BitBytes(str)));
} catch (Exception e) {
log.error("ENCRYPT error {} use pwd {}", str, password);
return null;
}
}
},
/**
* 解密
* hexStr 必须是16的倍数
*/
DECRYPT {
@Override
public String doFinal(String hexStr, String pwd) {
try {
Cipher cipher = Cipher.getInstance(CIPHERMODE);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(AES128.to16BitBytes(pwd), "AES"));
byte[] result = cipher.doFinal(DatatypeConverter.parseHexBinary(hexStr));
return new String(result);
} catch (Exception e) {
log.error("DECRYPT error {} use pwd {}", hexStr, pwd);
return null;
}
}
};
private static final String CIPHERMODE = "AES/ECB/NoPadding";
private static byte[] to16BitBytes(String str) {
int len= (str.length()/16+str.length()%16==0?0:1)*16;
byte[] bs = new byte[len];
System.arraycopy(str.getBytes(), 0, bs, 0, str.length());
return bs;
}
public abstract String doFinal(String content, String pwd);
public static void main(String[] args) throws Exception {
String str = AES128.ENCRYPT.doFinal("123456", "passwd");
log.info("加密后:{}",str);
log.info("解密后:{}",AES128.DECRYPT.doFinal(str, "passwd"));
}
}
本文介绍了一种在Java中实现AES/ECB/ZeroPadding加密解密的方法,由于Java默认不支持ZeroPadding模式,作者通过自定义填充方式来解决这一问题。文章提供了一个枚举类示例,包括加密和解密过程,使用了DatatypeConverter进行字节与十六进制字符串的转换。
1252

被折叠的 条评论
为什么被折叠?



