aes加密解密,含 128蒙挑、192宗侦、256位,cbc忆蚀、cfb矾利、ecb、ofb馋袜、pcbc模式

aes 128男旗、192、256位欣鳖,cbc察皇、cfb、ecb泽台、ofb什荣、pcbc在線加密解密

AES加解密總共有以下這些

算法/模式/填充                 字節(jié)加密后數(shù)據(jù)長(zhǎng)度       不滿16字節(jié)加密后長(zhǎng)度  
AES/CBC/NoPadding                   16                          不支持  
AES/CBC/PKCS5Padding                32                          16  
AES/CBC/ISO10126Padding             32                          16  
AES/CFB/NoPadding                   16                          原始數(shù)據(jù)長(zhǎng)度  
AES/CFB/PKCS5Padding                32                          16  
AES/CFB/ISO10126Padding             32                          16  
AES/ECB/NoPadding                   16                          不支持  
AES/ECB/PKCS5Padding                32                          16  
AES/ECB/ISO10126Padding             32                          16  
AES/OFB/NoPadding                   16                          原始數(shù)據(jù)長(zhǎng)度  
AES/OFB/PKCS5Padding                32                          16  
AES/OFB/ISO10126Padding             32                          16  
AES/PCBC/NoPadding                  16                          不支持  
AES/PCBC/PKCS5Padding               32                          16  
AES/PCBC/ISO10126Padding            32                          16  

一、不帶模式和填充來獲取AES算法的時(shí)候怀酷,其默認(rèn)使用AES/ECB/PKCS5Padding(輸入可以不是16字節(jié)稻爬,也不需要填充向量)

Cipher cipher = Cipher.getInstance("AES");

下面是 AES/ECB/PKCS5Padding 128位、192位胰坟、256加解密 完整代碼

        String content = "在線助手";
        // 生成密鑰需要的密碼值
        String key = "www.it399.com";
        /**
         * AES加密方式一:AES不指定模式和填充因篇,默認(rèn)為 ECB/PKCS5Padding
         *
         * 不能使用填充向量
         * java.security.InvalidAlgorithmParameterException: ECB mode cannot use IV
         */
        System.out.println("【0】AES不指定模式和填充泞辐,默認(rèn)為 ECB/PKCS5Padding,輸入可以不是16字節(jié)竞滓,也不需要填充向量\n");
        //128
        byte[] encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
        //192
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_DEFAULT);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_DEFAULT);
        //256
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_DEFAULT);

結(jié)果如下:

【0】AES不指定模式和填充咐吼,默認(rèn)為 ECB/PKCS5Padding,輸入可以不是16字節(jié)商佑,也不需要填充向量

秘鑰長(zhǎng)度锯茄,128,加密方式: AES,加密結(jié)果:09942AC3BB18703E2BAF29EC18E69BCC
秘鑰長(zhǎng)度茶没,128肌幽,解密方式: AES,解密結(jié)果:在線助手

秘鑰長(zhǎng)度,192抓半,加密方式: AES,加密結(jié)果:B9F574EF92836DFD2CC0EE03E7A0E717
秘鑰長(zhǎng)度喂急,192,解密方式: AES,解密結(jié)果:在線助手

秘鑰長(zhǎng)度笛求,256廊移,加密方式: AES,加密結(jié)果:118CD83850A220EFD791FF6B1FF180F8
秘鑰長(zhǎng)度,256探入,解密方式: AES,解密結(jié)果:在線助手

二狡孔、AES/CBC 加密方式

2.1 AES/CBC/NoPadding
  • 輸入必須是16字節(jié),不然報(bào)錯(cuò) javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
  • CBC模式必須提供初始向量IvParameterSpec蜂嗽,不然報(bào)錯(cuò) java.security.InvalidKeyException: Parameters missing
content: 在線助手
key: www.it399.com111
javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1041)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:1009)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)
    at com.csy.spring.it399.controller.encode.aes.AESUtil.encrypt(AESUtil.java:80)
    at com.csy.spring.it399.controller.encode.aes.AESUtil.main(AESUtil.java:200)
java.security.InvalidKeyException: Parameters missing
    at com.sun.crypto.provider.CipherCore.init(CipherCore.java:470)
    at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:313)
    at javax.crypto.Cipher.implInit(Cipher.java:802)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1249)
    at javax.crypto.Cipher.init(Cipher.java:1186)
    at com.csy.spring.it399.controller.encode.aes.AESUtil.decrypt(AESUtil.java:117)
    at com.csy.spring.it399.controller.encode.aes.AESUtil.main(AESUtil.java:202)
encode: null
decode: null

初始化加密模式的時(shí)改成

 Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”);

java.security.InvalidKeyException: Parameters missing解決辦法:

 if (modeAndPadding.equals(EncodeType.AES_CBC_NoPadding)) {
         //指定一個(gè)初始化向量 (Initialization vector苗膝,IV), IV 必須是16位
         cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(getIV()));
   } else {
         cipher.init(Cipher.ENCRYPT_MODE, keySpec);
}

下面是 AES/CBC/NoPadding,AES/CBC/PKCS5Padding,AES/CBC/ISO10126Padding 128位,192位,256加密解密(文末附完整代碼植旧,點(diǎn)擊此處使用AES128/192/256在線加密解密)

       /**
         * 1.1 AES/CBC
         * AES/CBC/NoPadding
         * AES/CBC/PKCS5Padding
         * AES/CBC/ISO10126Padding
         */
        System.out.println("【1.1】AES_CBC_NoPadding模式");
        content = "在線助手在線助手在線助手在線助手";
        key = "www.it399.com";
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
秘鑰長(zhǎng)度辱揭,128,加密方式: AES/CBC/NoPadding,加密結(jié)果:81C094D454913311113FA1E5B5A3B6778DC81026A19A52C51FAF54B82E48448A813E1FDE3F97E8ACE13FE37C550023DA
秘鑰長(zhǎng)度病附,128界阁,解密方式: AES/CBC/NoPadding,解密結(jié)果:在線助手在線助手在線助手在線助手

秘鑰長(zhǎng)度,192胖喳,加密方式: AES/CBC/PKCS5Padding,加密結(jié)果:5BCD216A00741AB48668742393A8F995C63B4A875F6BD460BFB04DBCF5BF35E429C0C177A54D0DAFF7E38DD83EA11B0C434B836B8EAAE015666987377AF8C9D0
秘鑰長(zhǎng)度泡躯,192,解密方式: AES/CBC/PKCS5Padding,解密結(jié)果:在線助手在線助手在線助手在線助手

秘鑰長(zhǎng)度丽焊,256较剃,加密方式: AES/CBC/ISO10126Padding,加密結(jié)果:1A45746F4E488AB13752033C21F9EE9C64417ECAA3A8FA08326D76DD1A052445218AA6D5408AC1D2F52998437C0786EEBC3990098DC36E6B7E6701474BA737D4
秘鑰長(zhǎng)度,256技健,解密方式: AES/CBC/ISO10126Padding,解密結(jié)果:在線助手在線助手在線助手在線助手

三写穴、AES/CFB 加密方式

  • 需要填充變量,不然報(bào)如下錯(cuò)誤
Exception in thread "main" java.security.InvalidKeyException: 
Parameters missing
下面是AES/CFB/NoPadding雌贱,AES/CFB/PKCS5Padding啊送,AES/CFB/ISO10126Padding 128位偿短,192位,256位加加密解密
       /**
         * 1.2 AES/CFB
         * AES/CBC/NoPadding
         * AES/CBC/PKCS5Padding
         * AES/CBC/ISO10126Padding
         */
        System.out.println("【1.2】AES_CFB_NoPadding模式\n");
        content = "在線助手";
        // 生成密鑰需要的密碼值
        key = "http://www.it399.com";
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);

四馋没、AES/ECB 加密方式

  • AES/ECB不要填充變量昔逗,不然會(huì)報(bào)如下錯(cuò)誤
Exception in thread "main" java.security.InvalidAlgorithmParameterException: ECB mode 
cannot use IV

下面是AES/ECB/NoPadding,AES/ECB/PKCS5Padding篷朵,AES/ECB/ISO10126Padding 128位勾怒,192位,256位加加密解密

        /**
         * 1.3 AES/ECB
         * AES/ECB/NoPadding
         * AES/ECB/PKCS5Padding
         * AES/ECB/ISO10126Padding
         */
        System.out.println("【1.3】AES_ECB模式");
        content = "在線助手";
        // 生成密鑰需要的密碼值
        key = "http://www.it399.com";
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);

五声旺、AES/OFB 加密方式

下面是AES/OFB/NoPadding笔链,AES/OFB/PKCS5Padding,AES/OFB/ISO10126Padding 128位腮猖,192位鉴扫,256位加加密解密

  • 需要填充向量
        /**
         * 1.4 AES/OFB
         * AES/OFB/NoPadding
         * AES/OFB/PKCS5Padding
         * AES/OFB/ISO10126Padding
         */
        System.out.println("【1.4】AES_OFB模式");
        content = "在線助手";
        // 生成密鑰需要的密碼值
        key = "http://www.it399.com";
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);

六、AES/PCBC 加密方式

下面是AES/PCBC/NoPadding澈缺,AES/PCBC/PKCS5Padding幔妨,AES/PCBC/ISO10126Padding 128位,192位谍椅,256位加加密解密

  • 需要填充向量
       /**
         * 1.5 AES/PCBC
         * AES/PCBC/NoPadding
         * AES/PCBC/PKCS5Padding
         * AES/PCBC/ISO10126Padding
         */
        System.out.println("【1.5】AES_PCBC模式");
        content = "在線助手";
        // 生成密鑰需要的密碼值
        key = "http://www.it399.com";
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);

七、完整代碼

AESUtil .java

    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    /**
     * 在線助手|在線工具|在線生成|在線制作
     * http://www.it399.com/
     * 在線助手博客
     * http://www.it399.com/blog/index
     */
    public class AESUtil {
        public static final String CHARSET = "UTF-8";
        private static byte[] encryptOrDecrypt(int mode,byte[] byteContent, String key,byte[] iv, AESType type, String modeAndPadding) throws InvalidKeyException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            //此處解決mac古话,linux報(bào)錯(cuò)
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(key.getBytes());
            kgen.init(type.value, random);
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance(modeAndPadding);// 創(chuàng)建密碼器
            if ( null !=iv ) {
                //指定一個(gè)初始化向量 (Initialization vector雏吭,IV), IV 必須是16位
                cipher.init(mode, keySpec, new IvParameterSpec(iv));
            } else {
                cipher.init(mode, keySpec);
            }
            byte[] result = cipher.doFinal(byteContent);
            return result;
        }
        public static void main(String[] args) throws Exception {
    //        System.out.println("【1】AES不指定模式和填充陪踩,默認(rèn)為 ECB/PKCS5Padding杖们,輸入可以不是16字節(jié),也不需要填充向量\n");
    //        // 需要加密的內(nèi)容
    //        String content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        String key = "www.it399.com111";
    //        System.out.println("content: " + content + "\nkey: " + key);
    //        byte[] encodeByte;
    //        byte[] decodeByte;
    //        //默認(rèn)方式  每次加密都不一樣肩狂,但是秘鑰是一樣的摘完,所以解密還是一樣的
    //        // 內(nèi)容加密后的值
    //        encodeByte = encrypt(content.getBytes(CHARSET), key, AESType.AES_128, EncodeType.AES_DEFAULT);
    //        String encodeStr = TypeConvert.bytesToHexString(encodeByte);
    //        // 被加密的內(nèi)容解密后的值
    //        decodeByte = decrypt(encodeByte, key, AESType.AES_128, EncodeType.AES_DEFAULT);
    //        String decodeStr = new String(decodeByte,CHARSET);
    //        System.out.println("encode: " + encodeStr + "\ndecode: " + decodeStr);
    //
    //
    //        System.out.println("【2】AES_CBC_NoPadding模式,輸入必須是16*n字節(jié)傻谁,需要填充向量\n");
    //        // 內(nèi)容加密后的值
    //        //待加密內(nèi)容不足16*n位 報(bào)錯(cuò)javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
    //        //需要填充向量孝治,不然報(bào)錯(cuò)java.security.InvalidKeyException: Parameters missing
    //        //得到加密后的內(nèi)容先base64編碼再解碼再傳給解碼,不然直接轉(zhuǎn)回亂碼
    //        content = "哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈";
    //        encodeByte = encrypt(content.getBytes(CHARSET), key, AESType.AES_256, EncodeType.AES_CBC_NoPadding);
    //        encodeStr = TypeConvert.bytesToHexString(encodeByte);
    //        decodeByte = decrypt(TypeConvert.hexStringToBytes(encodeStr), key, AESType.AES_256, EncodeType.AES_CBC_NoPadding);
    //        decodeStr = new String(decodeByte,CHARSET);
    //        System.out.println("encode: " + encodeStr + "\ndecode: " + decodeStr);
            String content = "在線助手";
            // 生成密鑰需要的密碼值
            String key = "www.it399.com";
            byte[] encrypt;
            /**
             * AES加密方式一:AES不指定模式和填充审磁,默認(rèn)為 ECB/PKCS5Padding
             */
    //        System.out.println("【0】AES不指定模式和填充谈飒,默認(rèn)為 ECB/PKCS5Padding,輸入可以不是16字節(jié)态蒂,也不需要填充向量\n");
    //        //128
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_DEFAULT);
    //        //192
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_DEFAULT);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_DEFAULT);
    //        //256
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_DEFAULT);
    //        /**
    //         * 1.1 AES/CBC (需要填充向量16*n)
    //         * AES/CBC/NoPadding
    //         * AES/CBC/PKCS5Padding
    //         * AES/CBC/ISO10126Padding
    //         */
    //        System.out.println("【1.1】AES_CBC_NoPadding模式杭措,需要填充向量,待加密必須是16*n");
    //        content = "在線助手在線助手在線助手在線助手";
    //        key = "www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
    //        /**
    //         * 1.2 AES/CFB
    //         * AES/CBC/NoPadding
    //         * AES/CBC/PKCS5Padding
    //         * AES/CBC/ISO10126Padding
    //         */
    //        System.out.println("【1.2】AES_CFB_NoPadding模式\n");
    //        content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        key = "http://www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
    //        /**
    //         * 1.2 AES/ECB
    //         * AES/ECB/NoPadding
    //         * AES/ECB/PKCS5Padding
    //         * AES/ECB/ISO10126Padding
    //         */
    //        System.out.println("【1.3】AES_ECB模式");
    //        content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        key = "http://www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_ECB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_ECB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_ECB_PKCS5Padding);
            /**
             * 1.4 AES/OFB
             * AES/OFB/NoPadding
             * AES/OFB/PKCS5Padding
             * AES/OFB/ISO10126Padding
             */
            System.out.println("【1.4】AES_OFB模式");
            content = "在線助手";
            // 生成密鑰需要的密碼值
            key = "http://www.it399.com";
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_OFB_PKCS5Padding);
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_OFB_PKCS5Padding);
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_OFB_PKCS5Padding);
            /**
             * 1.5 AES/PCBC
             * AES/PCBC/NoPadding
             * AES/PCBC/PKCS5Padding
             * AES/PCBC/ISO10126Padding
             */
            System.out.println("【1.5】AES_PCBC模式");
            content = "在線助手";
            // 生成密鑰需要的密碼值
            key = "http://www.it399.com";
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_PCBC_PKCS5Padding);
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_PCBC_PKCS5Padding);
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_PCBC_PKCS5Padding);
            //
    //        /**1.3 AES/CBC
    //         * AES_CBC_NoPadding模式(填充向量可選)
    //         */
            System.out.println("【1.3】AES_CBC_NoPadding模式");
            content = "在線助手在線助手在線助手在線助手";
            // 生成密鑰需要的密碼值
            key = "www.it399.com";
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_128,EncodeType.AES_CBC_NoPadding);
            content = "在線助手";
            // 生成密鑰需要的密碼值
            key = "www.it399.com";
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_192,EncodeType.AES_CBC_PKCS5Padding);
            encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
            encryptOrdecrypt(false,encrypt,key,getIV(),AESType.AES_256,EncodeType.AES_CBC_ISO10126Padding);
    //
    //
    //
    //        /**
    //         * 2.1 AES/CFB 128/192/256位加解密
    //         * AES_CFB_NoPadding模式(填充向量可選)
    //         */
    //        System.out.println("【2.1】AES_CFB_NoPadding模式,需要填充向量\n");
    //        content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        key = "www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_NoPadding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_NoPadding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_NoPadding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_NoPadding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_NoPadding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_NoPadding);
    //
    //        /**
    //         * 2.2 AES/CFB
    //         * AES_CFB_NoPadding模式(填充向量可選)
    //         */
    //        System.out.println("【2.2】AES_CFB_NoPadding模式\n");
    //        content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        key = "www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_PKCS5Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_PKCS5Padding);
    //
    //        /**2.3 AES/CFB
    //         * AES_CFB_NoPadding模式(填充向量可選)
    //         */
    //        System.out.println("【2.3】AES_CFB_NoPadding模式\n");
    //        content = "在線助手";
    //        // 生成密鑰需要的密碼值
    //        key = "www.it399.com";
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_128,EncodeType.AES_CFB_ISO10126Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_128,EncodeType.AES_CFB_ISO10126Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_192,EncodeType.AES_CFB_ISO10126Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_192,EncodeType.AES_CFB_ISO10126Padding);
    //        encrypt = encryptOrdecrypt(true,content.getBytes(CHARSET),key,null,AESType.AES_256,EncodeType.AES_CFB_ISO10126Padding);
    //        encryptOrdecrypt(false,encrypt,key,null,AESType.AES_256,EncodeType.AES_CFB_ISO10126Padding);
        }
        /**
         *
         * @param isEncrypt
         * @param source
         * @param key
         * @param type
         * @param encodeType
         */
        public static byte[] encryptOrdecrypt(boolean isEncrypt,byte[] source,String key,byte[] iv,AESType type,String encodeType) throws UnsupportedEncodingException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
            if (isEncrypt){
                byte[] encodeByte = encryptOrDecrypt(Cipher.ENCRYPT_MODE,source,key,iv,type,encodeType);
                String encodeStr = TypeConvert.bytesToHexString(encodeByte);
                return encodeByte;
            }else{
                byte[] decodeByte = encryptOrDecrypt(Cipher.DECRYPT_MODE,source, key,iv,type, encodeType);
                String decodeStr = new String(decodeByte,CHARSET);
                return decodeByte;
            }
        }
        /**
         * 指定一個(gè)初始化向量 (Initialization vector钾恢,IV)手素,IV 必須是16位
         */
        public static final byte[] getIV() throws Exception {
            return "1234567812345678".getBytes(CHARSET);
        }

EncodeType

/**
 * 在線助手|在線工具|在線生成|在線制作
 * http://www.it399.com/
 * 在線助手博客
 * http://www.it399.com/blog/index
 */
public class EncodeType {
//    算法/模式/填充                 16字節(jié)加密后數(shù)據(jù)長(zhǎng)度       不滿16字節(jié)加密后長(zhǎng)度
//    AES/CBC/NoPadding                   16                          不支持
//    AES/CBC/PKCS5Padding                32                          16
//    AES/CBC/ISO10126Padding             32                          16
//    AES/CFB/NoPadding                   16                          原始數(shù)據(jù)長(zhǎng)度
//    AES/CFB/PKCS5Padding                32                          16
//    AES/CFB/ISO10126Padding             32                          16
//    AES/ECB/NoPadding                   16                          不支持
//    AES/ECB/PKCS5Padding                32                          16
//    AES/ECB/ISO10126Padding             32                          16
//    AES/OFB/NoPadding                   16                          原始數(shù)據(jù)長(zhǎng)度
//    AES/OFB/PKCS5Padding                32                          16
//    AES/OFB/ISO10126Padding             32                          16
//    AES/PCBC/NoPadding                  16                          不支持
//    AES/PCBC/PKCS5Padding               32                          16
//    AES/PCBC/ISO10126Padding            32                          16
    //默認(rèn)為 ECB/PKCS5Padding
    public final static String AES_DEFAULT = "AES";
    public final static String AES_CBC_NoPadding = "AES/CBC/NoPadding";
    public final static String AES_CBC_PKCS5Padding = "AES/CBC/PKCS5Padding";
    public final static String AES_CBC_ISO10126Padding = "AES/CBC/ISO10126Padding";
    public final static String AES_CFB_NoPadding = "AES/CFB/NoPadding";
    public final static String AES_CFB_PKCS5Padding = "AES/CFB/PKCS5Padding";
    public final static String AES_CFB_ISO10126Padding = "AES/CFB/ISO10126Padding";
    public final static String AES_ECB_NoPadding = "AES/ECB/NoPadding";
    public final static String AES_ECB_PKCS5Padding = "AES/ECB/PKCS5Padding";
    public final static String AES_ECB_ISO10126Padding = "AES/ECB/ISO10126Padding";
    public final static String AES_OFB_NoPadding = "AES/OFB/NoPadding";
    public final static String AES_OFB_PKCS5Padding = "AES/OFB/PKCS5Padding";
    public final static String AES_OFB_ISO10126Padding = "AES/OFB/ISO10126Padding";
    public final static String AES_PCBC_NoPadding = "AES/PCBC/NoPadding";
    public final static String AES_PCBC_PKCS5Padding = "AES/PCBC/PKCS5Padding";
    public final static String AES_PCBC_ISO10126Padding = "AES/PCBC/ISO10126Padding";
}

TypeConvert

    /**
     * 在線助手|在線工具|在線生成|在線制作
     * http://www.it399.com/
     * 在線助手博客
     * http://www.it399.com/blog/index
     */
    public class TypeConvert {
        /**
         * 字符串轉(zhuǎn)換成十六進(jìn)制字符串
         */
        public static String str2HexStr(String str) {
            char[] chars = "0123456789ABCDEF".toCharArray();
            StringBuilder sb = new StringBuilder("");
            byte[] bs = str.getBytes();
            int bit;
            for (int i = 0; i < bs.length; i++) {
                bit = (bs[i] & 0x0f0) >> 4;
                sb.append(chars[bit]);
                bit = bs[i] & 0x0f;
                sb.append(chars[bit]);
            }
            return sb.toString();
        }
        /**
         * Convert hex string to byte[]
         *
         * @param hexString the hex string
         * @return byte[]
         */
        public static byte[] hexStringToBytes(String hexString) {
            if (hexString == null || hexString.equals("")) {
                return null;
            }
            hexString = hexString.toUpperCase();
            int length = hexString.length() / 2;
            char[] hexChars = hexString.toCharArray();
            byte[] d = new byte[length];
            for (int i = 0; i < length; i++) {
                int pos = i * 2;
                d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
            }
            return d;
        }
        /**
         * Convert char to byte
         *
         * @param c char
         * @return byte
         */
        private static byte charToByte(char c) {
            return (byte) "0123456789ABCDEF".indexOf(c);
        }
        /**
         * 數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串
         * @param bArray byte[]
         * @return HexString
         */
        public static final String bytesToHexString(byte[] bArray) {
            if (bArray == null || bArray.length==0){
                return null;
            }
            StringBuffer sb = new StringBuffer(bArray.length);
            String sTemp;
            for (int i = 0; i < bArray.length; i++) {
                sTemp = Integer.toHexString(0xFF & bArray[i]);
                if (sTemp.length() < 2){
                    sb.append(0);
                }
                sb.append(sTemp.toUpperCase());
            }
            return sb.toString();
        }
        /**
         * 十六進(jìn)制字符串轉(zhuǎn)換成字符串
         * @param hexStr
         * @return String
         */
        public static String hexStr2Str(String hexStr) {
            String str = "0123456789ABCDEF";
            char[] hexs = hexStr.toCharArray();
            byte[] bytes = new byte[hexStr.length() / 2];
            int n;
            for (int i = 0; i < bytes.length; i++) {
                n = str.indexOf(hexs[2 * i]) * 16;
                n += str.indexOf(hexs[2 * i + 1]);
                bytes[i] = (byte) (n & 0xff);
            }
            return new String(bytes);
        }
        /**
         * @param hexString String str = "000AB"
         * @return
         */
        public static int hexString2Int(String hexString){
            Integer num = Integer.valueOf(hexString,16);
            return num;
        }
        /**
         * 把byte轉(zhuǎn)為字符串的bit
         */
        public static String byteToBitString(byte b) {
            return ""
                    + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)
                    + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)
                    + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)
                    + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1);
        }
        /**
         * 把byte轉(zhuǎn)為字符串?dāng)?shù)組的bit
         */
        public static String[] byteToBitStrings(byte b) {
            String[] bit = new String[8];
            bit[0] = ""+ (byte) ((b >> 7) & 0x1);
            bit[1] = ""+ (byte) ((b >> 6) & 0x1);
            bit[2] = ""+ (byte) ((b >> 5) & 0x1);
            bit[3] = ""+ (byte) ((b >> 4) & 0x1);
            bit[4] = ""+ (byte) ((b >> 3) & 0x1);
            bit[5] = ""+ (byte) ((b >> 2) & 0x1);
            bit[6] = ""+ (byte) ((b >> 1) & 0x1);
            bit[7] = ""+ (byte) ((b >> 0) & 0x1);
            return bit;
        }
        public static void main(String[] args){
            String hexString = "3A60432A5C01211F291E0F4E0C132825";
            byte[] result = hexStringToBytes(hexString);
            System.out.println(new String(result));
            System.out.println(bytesToHexString(result));
        }
        //base64字符串轉(zhuǎn)byte[]
        public static byte[] base64String2ByteFun(String base64Str){
            return Base64.decodeBase64(base64Str);
        }
        //byte[]轉(zhuǎn)base64
        public static String byte2Base64StringFun(byte[] b){
            return Base64.encodeBase64String(b);
        }
    }

AESType

    /**
     * 在線助手|在線工具|在線生成|在線制作
     * http://www.it399.com/
     * 在線助手博客
     * http://www.it399.com/blog/index
     */
    enum AESType {
        AES_128(128), AES_192(192), AES_256(256);
        public int value;
        private AESType(int value) {
            this.value = value;
        }
        public int getValue() {
            return value;
        }
        public void setValue(int value) {
            this.value = value;
        }
    }

轉(zhuǎn)載請(qǐng)注明來自 在線助手 ,原文AES 128/192/256位CBC/CFB/ECB/OFB/PCBC加密解密,鏈接:http://www.it399.com/blog/web/201805211243

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸳址,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泉懦,更是在濱河造成了極大的恐慌稿黍,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠斧,死亡現(xiàn)場(chǎng)離奇詭異闻察,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)琢锋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門辕漂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吴超,你說我怎么就攤上這事钉嘹。” “怎么了鲸阻?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵跋涣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鸟悴,道長(zhǎng)陈辱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任细诸,我火速辦了婚禮沛贪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘震贵。我一直安慰自己利赋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布猩系。 她就那樣靜靜地躺著媚送,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寇甸。 梳的紋絲不亂的頭發(fā)上塘偎,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音拿霉,去河邊找鬼式塌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛友浸,可吹牛的內(nèi)容都是我干的峰尝。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼收恢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼武学!你這毒婦竟也來了祭往?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤火窒,失蹤者是張志新(化名)和其女友劉穎硼补,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熏矿,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡已骇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了票编。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪储。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慧域,靈堂內(nèi)的尸體忽然破棺而出鲤竹,到底是詐尸還是另有隱情,我是刑警寧澤昔榴,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布辛藻,位于F島的核電站,受9級(jí)特大地震影響互订,放射性物質(zhì)發(fā)生泄漏吱肌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一仰禽、第九天 我趴在偏房一處隱蔽的房頂上張望氮墨。 院中可真熱鬧,春花似錦坟瓢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至识颊,卻和暖如春诚镰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祥款。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工清笨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刃跛。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓抠艾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桨昙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子检号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容