对称加密算法AES

608151106.png

AES(Advanced Encryption Standard),高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法;
AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
它适用于敏感内容进行加密传输,防止被窃取。

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

/**
 * Created on 2022/6/2.
 *
 * @author bruce
 */
public class AESUtils {
    private static String AES = "AES";
    private static final String defaultCharset = "utf-8";
    private static final String key = "7F863881B59CFBEF306FBBF59DBDA3E1";

    public static class Factory {
        //此方法可以被改写,定义自己的密钥生成策略
        public static String genKey() {
            try {
                KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
                keyGenerator.init(128);
                SecretKey secretKey = keyGenerator.generateKey();
                return parseByte2HexStr(secretKey.getEncoded());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("generate AES key error.");
        }
    }

    public static String enAes(String data) {
        return enAes(data, key);
    }

    private static String enAes(String data, String key) {
        try {
            Cipher cipher = Cipher.getInstance(AES);
            byte[] byteContent = data.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
            byte[] result = cipher.doFinal(byteContent);
            return new String(Base64.getEncoder().encode(result), "utf-8");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        throw new RuntimeException("enAES error.");
    }

    public static String deAes(String data) {
        return deAes(data, key);
    }

    private static String deAes(String data, String key) {
        try {
            Cipher cipher = Cipher.getInstance(AES);
            cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
            byte[] result = cipher.doFinal(Base64.getDecoder().decode(data.getBytes(defaultCharset)));
            return new String(result, "utf-8");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        throw new RuntimeException("deAES error.");
    }

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

    private static SecretKeySpec getSecretKey(final String password) {
        try {
            KeyGenerator kg = KeyGenerator.getInstance(AES);
            //AES 要求密钥长度为 128
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(password.getBytes(defaultCharset));
            kg.init(128, secureRandom);
            SecretKey secretKey = kg.generateKey();
            return new SecretKeySpec(secretKey.getEncoded(), AES);
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        throw new RuntimeException("getSecretKey error.");
    }

    public static void main(String[] args) {
        String wl = "{welcome to 中国.}";
        String ens = enAes(wl);
        System.out.println("after enAES: " + ens);
        String des = deAes(ens);
        System.out.println("after deAES: " + des);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容