java AES/ECB/ZeroPadding 加密解密

本文介绍了一种在Java中实现AES/ECB/ZeroPadding加密解密的方法,由于Java默认不支持ZeroPadding模式,作者通过自定义填充方式来解决这一问题。文章提供了一个枚举类示例,包括加密和解密过程,使用了DatatypeConverter进行字节与十六进制字符串的转换。

//在使用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"));
    }
}

 


 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值