美文网首页java
AES对称加密

AES对称加密

作者: 策马踏清风 | 来源:发表于2020-09-21 16:47 被阅读0次

    AES对称加密安全性好,加密速度快。

    import java.nio.charset.StandardCharsets;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Base64;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    public class AESUtil {
    
        /** key长度 */
        private static final int KEY_SIZE = 256;
        /** 算法名 */
        private static final String KEY_ALGORITHM = "AES";
        /** 默认的加密算法及模式 */
        private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
    
        /**
         * AES 加密操作
         *
         * @param byteContent
         *            待加密内容
         * @param key
         *            加密密钥
         * @return 加密数据
         */
        public static byte[] encrypt(byte[] byteContent, byte[] key) {
            try {
                // 创建密码器
                Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
                // 初始化为加密模式的密码器
                cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
                // 加密
                return cipher.doFinal(byteContent);
            } catch (Exception ex) {
                Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    
        /**
         * AES 加密操作,返回Base64字符串
         * 
         * @param byteContent
         *            待加密内容
         * @param key
         *            加密密钥
         * @return Base64转码后的加密数据
         */
        public static String base64Encrypt(byte[] byteContent, byte[] key) {
            byte[] encrypt = encrypt(byteContent, key);
            if (encrypt != null) {
                return Base64.getEncoder().encodeToString(encrypt);
            }
            return null;
        }
    
        /**
         * AES 解密操作
         *
         * @param content
         *            密文
         * @param key
         *            秘钥
         * @return 解密后的数据
         */
        public static byte[] decrypt(byte[] content, byte[] key) {
            try {
                // 实例化
                Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
                // 使用密钥初始化,设置为解密模式
                cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
                // 执行操作
                return cipher.doFinal(content);
            } catch (Exception ex) {
                Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    
        /**
         * AES 解密操作
         * 
         * @param content
         *            base64形式的密文
         * @param key
         *            秘钥
         * @return 解密后的数据
         */
        public static byte[] decrypt(String content, byte[] key) {
            if (content != null) {
                byte[] decode = Base64.getDecoder().decode(content);
                return decrypt(decode, key);
            }
            return null;
        }
    
        /**
         * 生成加密秘钥
         *
         * @return 生成指定算法密钥生成器的 KeyGenerator 对象
         */
        private static SecretKeySpec getSecretKey(final byte[] key) {
            KeyGenerator kg;
            try {
                kg = KeyGenerator.getInstance(KEY_ALGORITHM);
                kg.init(KEY_SIZE, new SecureRandom(key));
                // 生成一个密钥
                SecretKey secretKey = kg.generateKey();
                // 转换为AES专用密钥
                return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);
            } catch (NoSuchAlgorithmException ex) {
                Logger.getLogger(AESUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    
        public static void main(String[] args) {
            String content = "123在下面的文本框内输入需要处理abc";
            String key = "个8ga10bg105*()_^%fag1啥干-0人48时阿嘎多沟沟壑壑ssssdca";
            System.out.println("原文:" + content);
            String s1 = AESUtil.base64Encrypt(content.getBytes(StandardCharsets.UTF_8), key.getBytes());
            System.out.println("密文:" + s1);
            System.out.println("解密:" + new String(AESUtil.decrypt(s1, key.getBytes()), StandardCharsets.UTF_8));
        }
    }
    

    相关文章

      网友评论

        本文标题:AES对称加密

        本文链接:https://www.haomeiwen.com/subject/bvnvyktx.html