zoukankan      html  css  js  c++  java
  • AES256对称加密

    需要引入bouncycastle库的jar包

    package test;
    
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    import java.security.Security;
    import java.util.Base64;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.SecretKeySpec;
    
    public class Aes256Util {
        private final static String PROVIDER_BC = "BC";
        private final static String CHARSET = "UTF-8";
        private final static String ALGORITHM = "AES/ECB/PKCS5Padding";
        private final static String KEY_ALGORITHM = "AES";
        
        
        /**
         * 引入BC库
         */
        static {
            try {
                Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 初始化一个256位对称加密的秘钥
         * @param keyStr 如果加密解密的方法直接用一个String.getByte()的话,那么这个key需要达到128/192/256 bits
         * @return
         */
        public static byte[] getRandomKey(String keyStr){
            KeyGenerator keyGenerator = null;
            SecureRandom secureRandom = null;
            try {
                keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
                secureRandom = SecureRandom.getInstance("SHA1PRNG");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            secureRandom.setSeed(keyStr.getBytes());  
            keyGenerator.init(256, secureRandom);
            return keyGenerator.generateKey().getEncoded();
        }
        
        /**
         * 加密
         * @param content 原明文串
         * @param key 对称加密秘钥
         * @return 最后对byte进行了base64encode
         */
        public static String encrypt(String content, byte[] key){
            String encryptStr = "";
            
            try {
                //密码器初始化
                Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER_BC);
                SecretKeySpec secretKeySpec = new SecretKeySpec(key, KEY_ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
                byte[] encryptByte = cipher.doFinal(content.getBytes(CHARSET));
                
                encryptStr = Base64.getEncoder().encodeToString(encryptByte);
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
            return encryptStr;
        }
        
        /**
         * 解密
         * @param contentByte 加密后的密文byte
         * @param key
         * @return
         */
        public static String decrypt(byte[] contentByte, byte[] key){
            String decryptStr = "";
            //密码器初始化
            try {
                Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER_BC);
                SecretKeySpec secretKeySpec = new SecretKeySpec(key, KEY_ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
                byte[] encryptByte = cipher.doFinal(contentByte);
                
                decryptStr = new String(encryptByte, CHARSET);
                
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
            return decryptStr;
        }
        
        public static void main(String[] args) {
            String keyStr = "1111111111111111111111111111111";
            
            byte[] rkey = getRandomKey(keyStr);
            
            String a = encrypt("test", rkey);
            
            String b = decrypt(Base64.getDecoder().decode(a), rkey);
            
            System.out.println(a);
            System.out.println(b);
        }
    }
  • 相关阅读:
    C# dataGridView控件某单元格,间隔地变换背景色
    VS2005 DataGridView 和 GirdView 横向大比拼
    WinForm 修改Internet选项安全属性 。。。。。。。。。。
    [C#]使用HttpWebRequest请求远端服务器时如何加载SSL证书
    C# 采集 :设计一个可超时的阻塞方法
    c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.
    windows下的正则式工具介绍之一:RegexBuddy
    delegate 与异步调用。。。。。。。。。。。
    C# 轻松实现水印: 利用原图和水印图的重叠 !!!!
    DataGridView常用属性 《一》
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/10572780.html
Copyright © 2011-2022 走看看