zoukankan      html  css  js  c++  java
  • Java 实现 AES 加解密

      毕业课题中需要使用加解密算法,要求加解密前后的数据长度不会变化,查了一些资料,发现可以采用AES加密的CFB跟OFB模式是无填充的模式,可以保持加解密前后数据的长度相等。下面上代码:

    import java.io.UnsupportedEncodingException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
    
    public class Encrypt_Decrypt_AES {
    
    
        /**
         * AES加密算法,调用Java自有类库,采用CFB模式密文反馈无填充模式,可以保证数据长度在加密前后是相同的
         * @param content 待加密内容
         * @param key 密钥
         * @return byte[] 加密结果用byte数组表示
         * 
         */
        public static byte[] encrypt_AES(String content, String key) {
            try {
                Cipher aesECB = Cipher.getInstance("AES/CFB/NoPadding");
                SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivSpec = new IvParameterSpec(key.getBytes());
                aesECB.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
                byte[] result = aesECB.doFinal(content.getBytes());
                return result;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return null;
        }
        
        /**
         * 
         * @param content 待解密内容,字符串形式
         * @param key    解密用的密钥
         * @return    使用字符串形式返回解密内容
         * @throws UnsupportedEncodingException
         */
        
        public static String decrypt_AES(byte[] content, String key) throws UnsupportedEncodingException {
            try {
                Cipher aesECB = Cipher.getInstance("AES/CFB/NoPadding");
                SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
                IvParameterSpec ivSpec = new IvParameterSpec(key.getBytes());
                aesECB.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
                byte[] result = aesECB.doFinal(content);
                String AES_decode=new String(result,"utf-8");
                /************************************/
    //            System.out.println("解密结果:"+AES_decode);
                return AES_decode;
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return null;
        }
    
    
    
        public static void main(String[] str) throws InvalidKeyException,
                InvalidAlgorithmParameterException, IllegalBlockSizeException,
                BadPaddingException, UnsupportedEncodingException {
    
            
            String s = "fire fox 22";
            byte[] r = encrypt_AES(s, "@93456781234567A");
            for (byte i : r){
                String l = Integer.toBinaryString((i & 0xFF) + 0x100).substring(1);  
                System.out.print(l+" ");
            }
            System.out.println();
            decrypt_AES(r, "@93456781234567A");
        }
    
    
    }
  • 相关阅读:
    【学习】018 Spring框架
    【学习】017 Mybatis框架
    【学习】016 MySQL数据库优化
    【学习】 015 Linux相关
    【学习】014 深入理解Http协议
    【学习】013 Servlet、Cookie、Session的简述
    js 异常判断
    CSS 文字概念小记
    Echarts tooltip 坐标值修改
    js 查找当前元素/this
  • 原文地址:https://www.cnblogs.com/qj4d/p/6929550.html
Copyright © 2011-2022 走看看