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");
        }
    
    
    }
  • 相关阅读:
    poj2478
    poj2376
    poj2192
    poj1062
    [HDOJ2639]Bone Collector II(第k优01背包)
    [HDOJ3466]Proud Merchants(贪心+01背包)
    [HDOJ5510]Bazinga(并查集)
    [POJ3264]Balanced Lineup(线段树,区间最值差)
    [HDOJ4325]Flowers(树状数组 离散化)
    [HDOJ5521]Meeting(最短路)
  • 原文地址:https://www.cnblogs.com/qj4d/p/6929550.html
Copyright © 2011-2022 走看看