参考资料:百度百科【高级加密标准】

 

AES简介

1、密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

2、它的功能是代替原先的DES数据加密解密算法。

3、高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一

 

何为对称加密解密

1、对称算法(Symmetric Algorithm),又称为传统密码算法,在大多数对称算法中,加密密匙和解密密匙是相同的,所以也称为单密匙算法。

2、对称算法的安全性依赖于密匙,泄露密匙就意味着消息很可能被他人解密。

3、对称加密的优点在于算法实现的效率高、速度快。

4、对称加密的缺点在于密匙的管理比较复杂。

 

为什么要对数据进行加密

1、为了避免明文传输泄露敏感数据,加密后可以保证数据的安全,就算别人看到了这些数据,也不知道他具体内容是什么。

2、数据加密是防止数据攻击的一种有效而经济的方法。

3、避免数据在传输过程中被篡改,一旦数据被篡改,AES将无法解密,而一旦解密失败,则说明数据被篡改了。

 

 

AES加密解密算法应用的场景

1、两个内部系统之前敏感数据传输的时候可使用AES对数据进行加密解密。

2、不想让数据明文传输的情况。

3、防止数据在传输过程中被篡改。

 

为什么选择AES加密解密算法

1、算法实现的效率高、速度快。

2、符合主流标准。

 

Java实现AES算法加密解密

AES工具类的代码如下:

package com.chenlw.java.web.utils.utils;

import org.apache.commons.lang.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * AES加密和解密工具类
 * Created by chenlw on 2019/06/18
 */
public class AESUtils {

    /**
     * 编码格式
     */
    private static final String CHARSET_UTF8 = "UTF-8";

    /**
     * AES加密算法
     */
    private static final String KEY_AES = "AES";

    /**
     * 签名算法
     */
    public static final String SIGN_ALGORITHMS = "SHA1PRNG";


    public static void main(String[] args) throws Exception {
        test1();
        //testDecrypt();
    }

    public static void test1() throws Exception{
        // Key为加密和解密的钥匙
        final String KEY = "12345678";
        String content = "12345678";
        System.out.println("加密前:" + content);
        System.out.println("加密密钥和解密密钥:" + KEY);
        String encrypt = encrypt(content, KEY);
        System.out.println("加密后:" + encrypt);
        String decrypt = decrypt(encrypt, KEY);
        System.out.println("解密后:" + decrypt);
    }


    public static void testDecrypt() throws Exception{
        final String key = "12345678";
        //加密前的内容为12345678
        String content = "F217884172ECDE99FC3F24F184963D7A";
        //String content = "B28C4B0493144589D8D5D348CCF579BBAE3E90973F19F55583AD73FFEC301188B874F1F41B3EC3244C43928D62B7E2B938827A97CC0E1CB5F312A4671DE5203C36B67E905E26DB51FE9225FC601261FEE23DA9D956D93F0A221FF2D34AB99FB078BEEF18E12187CCDF0D98EA342280D8A8ABBCA9B7ACA0BA921667744DE5630131A14C03E068D1402956C533E2ACAE6A399AD38EE42A8D29E39FEB2E7844CCD62BD9E36B2ECAA16F796F1C6E139BD823E2D9DF39E26DAA9C5551B80212281D5BAF1DB557D7FD4E38AD51540BC32293370D1AA4F98127121E26185B47D57DF3F58243DCFF31E866AB3996FDC36243B2C137B01264716219AFD84846D4082D7E2B6ADEAE8A454B35EDCC05FA7C5BD827FD21842C4A2A83F34DF19FBD4E89ADFF94C6C719C2C1B592FD15B7A2A10D499C00AA2C7478915A6B9CA4B4AD13C41C4CC849364282F331F0596D3EB1B38B7452226ADEAE8A454B35EDCC05FA7C5BD827FD90FDEB651862D68DBB6F616D61182160BC1E87E093BE05564D90670142EAADEFC8A5BA9872D6195B739739317551094C87FDF80B8CEA40023A659A66FF9478866ADEAE8A454B35EDCC05FA7C5BD827FD8A05015414131850EACD3DFB2FA7FAC038B111F1017248F347F79C84D46F917564976C1DEE96BC9D03CF18C41EE77D46B4463FAE104726B1890416E5E89D2A11FFFE0EC19CE1CE38738F6158F4DBF981FAF95877C47E182114C257BCDB53E7153E863CCA6FA5920C94C17F962E61FFDC6C28A823F509D3FD388ECAD1AE67D84B7789A9135484CBC7738745FF5F28F58AAA9BD1ABF92325B9B09439C1127FDB7FE34D7EC54FB662C74C903D9D4C8B5C21A0B85A87DCE0B2306A1754B8993C099A89DDDEEFEBCA4AE7A788CD7FA4965326F776F21426D642BDC9518669F98C0B9580CCB1090ADB1070609F400049D43A481C0DEF9F893CDFEED9EAEE72D396F28BF04415B9C93EE43AA9D2B300DC9B6F5FCF903EF0ACE7EE6DC985BC92037A45FDE08627B9A0FAE8AE533919BAAB84D5B853D3B8A76B356203BF89DC06D6BE76701C0DEF9F893CDFEED9EAEE72D396F28BA0CD2E186C04E23593C8AD3FB49A42D5BF158341B8F700E574FA0444AE3210C432725128333B6E32DD0D2A5739AF6D2929C28D8E3F680E5282272AB45B7291E81C0DEF9F893CDFEED9EAEE72D396F28B22C2414838E0AAB46345DA0EAB337CB03C01C289A657971C28D2FC86E183113B4F27235B267FAF9881FAA4BB46F0227E9BDD9026C7FF1AD643CA2940D69B1B72478ECEDC3B1C2EF63D58D6D53A4062835FBD2678C498E835DE71622B9D877D1B00E02EF24AAD5DFCF5751C37279A690F65636DA7B2B932D4EFDA6C0E5DBC6CED98BCD297281F67DA96A1EF457D7A3F533E8CE923EBD690E77EAF6ED498F1B2825E66D27BDE4F45743CA1FC096EAF55B09A6691836129C719D86B7021E4FF8A35189C555540C326DA6AA6DBCCEB520C8AF7DC2535E7257A4DE0003AF71200911B36BC60C489BE8D7DA4F7C6915E04A06B4FAAA3A00C95E3E0A43FDCAF17ED09F8B404DB3FA5CF46439F2513A11435A86161979B895B32030A4554879B300039899868AC1859A3A1970E1D098A6B3C0ED8271B7ADA83DBFB94B48B19BEFF0649298760DD829C3F0ADB09C797B3A6B192095711EFB7E69C62233AF793F818378439EC01CE4D83FEA82C372176ED774D4EA4AD69400AB3DC0DD50CE8512C25C0886FB89A415E549BDFF869CF0A498CB95FA1418FA358C0EF66A441AACA03B6B153CA669D85C0E3D127829CFF7D9999EEDA48A4F40BCA3E8A4D0399CA03A4705A46CE060129BF8DC1E8F413EB8C9F04CD73721B1D935118DB177266E381B3E1BE054C345686953C1B929C4E91148EA04B6C0C4DBC8ECD7EA6001D42B560B7FD81A57F379766C1A3C90B2A9B8376A9210539C5684C002E7BBBC1A75C904D771B988CEC4D5EBB556C19221A9928272B94D27ABD07FF094B9489198CCB3B9C115467D214D4316C7AEB894B8D943B7E7DD5EA2445A7991A9EF504E94FABC3E1A3C28BEA05E742DEC33A709810DFC73549E232A2250BF30C637058380676247FD562E70631A16FE2A3DF28E923B2D4D9FDDF17E592E072618773C3C6072E8C1E4D3CDCCC4A25375066865CB576B749FD7FB2A2E1539DE70B975ECFAF41815CA0E4E4A0784304A7C61FC98C81EAD921BF7F64F670104B07A05239016C21A86F055CE011214B550B4A959D067CAE6598993A245BF91D3BA205080785508E15E5852F82FA9EFF5BC1AA34AC75B900156F4A2057B64F9C68AF46AC8AAC062D70E2F9DDC59072AE6E9644C1444AE960EBC44D7A1CA81B7A5A8537AE99886AA6F62C71C6BC06EAB32ADDE4B08D242BF6287E9AE1338BD9EDF3BEB852413E5149D165A6D292D00135DACDAA7D7A76BE8C9983887D36FE26048486DE8310676EDA51C4B7B0D345E3450F588B6498B00F6AF4E1007527B0967C1E296EA87131D887270ACAEE96BA35E2140A1577EDE3E9A3810A6A81C272FEB936EB53662B01D48BD5358C92626ED238EB28918ADCCF090883B70E17A7AB7DF3236A0686E9C32359B21C3F503BEFB32CC686349995C3F93948A51DDD2479B8C76CCD253A047F980AED69CF341D9D795941F9E19936772B67DB922AE4A55D65E618A2C1B55F42937F8033191D147672AB5634CB6DB0B1C49E3491E0B74428BC75";
        String decrypt = decrypt(content, key);
        System.out.println("解密后:" + decrypt);
    }

    /**
     * AES加密
     *
     * @param data 需要加密的内容
     * @param key  加密密码
     * @return
     */
    public static String encrypt(String data, String key) throws Exception {
        return doAES(data, key, Cipher.ENCRYPT_MODE);
    }

    /**
     * AES解密
     *
     * @param data 待解密内容
     * @param key  解密密钥
     * @return
     */
    public static String decrypt(String data, String key) throws Exception {
        return doAES(data, key, Cipher.DECRYPT_MODE);
    }

    /**
     * 加解密
     *
     * @param data 待处理数据
     * @param key  密钥
     * @param mode 加解密mode
     * @return
     */
    private static String doAES(String data, String key, int mode) throws Exception {
        try {
            if (StringUtils.isBlank(data) || StringUtils.isBlank(key)) {
                return null;
            }
            //判断是加密还是解密
            boolean encrypt = mode == Cipher.ENCRYPT_MODE;
            byte[] content;
            // true 加密内容 false 解密内容
            if (encrypt) {
                content = data.getBytes(CHARSET_UTF8);
            } else {
                content = parseHexStr2Byte(data);
            }
            // 1.构造密钥生成器,指定为AES算法,不区分大小写
            KeyGenerator kgen = KeyGenerator.getInstance(KEY_AES);
            // 2.根据ecnodeRules规则初始化密钥生成器

            // 生成一个128位的随机源,根据传入的字节数组
            //kgen.init(128, new SecureRandom(key.getBytes()));
            //生成一个128位的随机源,根据传入的字节数组,防止linux下 随机生成key
            SecureRandom random = SecureRandom.getInstance(SIGN_ALGORITHMS);
            random.setSeed(key.getBytes(CHARSET_UTF8));
            kgen.init(128, random);


            // 3.产生原始对称密钥
            SecretKey secretKey = kgen.generateKey();
            // 4.获得原始对称密钥的字节数组
            byte[] enCodeFormat = secretKey.getEncoded();
            // 5.根据字节数组生成AES密钥
            SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, KEY_AES);
            // 6.根据指定算法AES自成密码器
            Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
            // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
            cipher.init(mode, keySpec);// 初始化
            byte[] result = cipher.doFinal(content);
            if (encrypt) {
                // 将二进制转换成16进制
                return parseByte2HexStr(result);
            } else {
                return new String(result, CHARSET_UTF8);
            }
        } catch (Exception e) {
            throw new Exception("AES 密文处理异常:"+e.getMessage());
        }
    }

    /**
     * 将二进制转换成16进制
     *
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 将16进制转换为二进制
     *
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }


}

测试数据加密解密结果:

aes加密解密 js AES加密解密时间比较_数据