Java AES 加密简单使用

目录

  • 注意问题
    • 1. AES 填充设置,AES 密文比明文多出 16 字节的原因
  • ASE 工具类
  • 测试代码
  • 附加信息
    • AES支持五种模式
    • 三种补码方式

注意问题

1. AES 填充设置,AES 密文比明文多出 16 字节的原因

Cipher.getInstance("AES/CBC/NoPadding");
  • 在原始数据长度为16的整数倍时,使用 NoPadding 时加密后数据长度等于16*n,使用其他的加密数据长度等于16*(n+1)。
  • 在不足16的整数倍的情况下,假如原始数据长度等于16*n+m[其中m小于16],NoPadding填充情况下,CBC、ECB和PCBC三种模式是不支持的,CFB、OFB两种模式下则加密数据长度等于原始数据长度。除了NoPadding填充之外的任何方式,加密数据长度都等于16*(n+1)。

ASE 工具类

public class AesHelper {

    private IvParameterSpec iv;
    private SecretKeySpec secretKeySpec;
    private Cipher encryptCipher, decryptCipher;
    private String initVector = "0000000000000000";
	
    public AesHelper(String key) {

        try {
            iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8));
            secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");

            decryptCipher = Cipher.getInstance("AES/CBC/NoPadding");
            decryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv);

            encryptCipher = Cipher.getInstance("AES/CBC/NoPadding");
            encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 解密
     *
     * @param bytes 解密字节数组
     * @return 返回解密后明文数组
     */
    public byte[] decrypt(byte[] bytes) {
        try {

            return decryptCipher.doFinal(bytes);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    /**
     * 加密
     *
     * @param bytes 明文字节数组
     * @return 加密后字节数组
     */
    public byte[] encrypt(byte[] bytes) {
        try {
            return encryptCipher.doFinal(bytes);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

}

测试代码

public class AesHelperTest {

    byte[] bytes = new byte[64];

    @Test
    public void decrypt() {
		
		AesHelper aesHelper = new AesHelpler("xxxxxxxxxxxxxxxx");
		
		//加密
        byte[] decrypt = aesHelper.encrypt(bytes);
        System.out.println(decrypt.length);
        
		//解密
        decrypt = aesHelper.decrypt(decrypt);
        System.out.println(decrypt.length);

        Assert.assertArrayEquals(bytes, decrypt);
    }

}

附加信息

AES支持五种模式

  • ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
  • CBC/PCBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。
  • CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度。

三种补码方式

NoPadding,PKCS5Padding,ISO10126Padding

你可能感兴趣的:(杂杂,md5,java,加密解密)