说说如何使用 Java 的原生方法实现 AES 算法

AES(Advanced Encryption Standard)高级加密标准,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准 。 这个标准用来替代原先的 DES ,已经被多方分析且广为全世界所使用 。 现已成为对称密钥加密中最流行的算法之一 。

/**
 * AES 算法
 * <p/>
 * 算法采用加密模式:CBC;数据块:128;填充:PKCS5Padding
 * <p/>
 * key 与向量字符串的长度为 16 位
 *
 * @author Deniro Li (lisq037@163.com)
 *         2018/3/17
 */
public class AES {

    /**
     * 算法名称
     */
    public static final String NAME = "AES";

    /**
     * 加密模式:CBC;数据块:128;填充:PKCS5Padding
     */
    public final String MODE = "AES/CBC/PKCS5Padding";

    /**
     * KEY 与 向量字符串的长度
     */
    public static final int LENGTH = 16;


    /**
     * 加密用的 KEY
     */
    private String key;

    /**
     * 向量,用于增加加密强度
     */
    private String ivParameter;

    /**
     * @param key         加密用的 KEY
     * @param ivParameter 偏移量
     */
    public AES(String key, String ivParameter) {
        if (key == null || key.length() != LENGTH) {
            throw new AESException("KEY 不存在,或者长度不为 " + LENGTH);
        }
        if (ivParameter == null || ivParameter.length() != LENGTH) {
            throw new AESException("ivParameter 不存在,或者长度不为 " + LENGTH);
        }

        this.key = key;
        this.ivParameter = ivParameter;
    }


    /**
     * 加密
     *
     * @param s 要加密的字符串
     * @return 加密后的字符串
     */
    public String encode(String s) {
        String result;
        try {

            Cipher cipher = Cipher.getInstance(MODE);
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
            cipher.init(ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), NAME), iv);
            byte[] bytes = cipher.doFinal(s.getBytes(ENCODING));
            result = new BASE64Encoder().encode(bytes);
        } catch (Exception e) {
            throw new AESException("加密", e);
        }
        return result;
    }

    /**
     * 解密
     *
     * @param s 待解密的字符串
     * @return 解密后的字符串
     */
    public String decode(String s) {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("ASCII"), NAME);
            Cipher cipher = Cipher.getInstance(MODE);
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
            return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(s)), ENCODING);
        } catch (Exception e) {
            throw new AESException("解密", e);
        }
    }
}

单元测试:

public class AESTest {

    AES aes;

    @Before
    public void init(){
        aes=new AES("12345abcdef67890","1234567890abcdef");
    }

    @Test
    public void testEncode() throws Exception {
        Assert.assertEquals("jANei3LBvnLCaZ2XddWHZw==", aes.encode("123456"));
    }

    @Test
    public void testDecode() throws Exception {
        Assert.assertEquals("123456", aes.decode("jANei3LBvnLCaZ2XddWHZw=="));
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值