AES加密

在线加密地址:点击打开链接

 //编码方式  
    public static final String bm = "UTF-8";

    /**
     * 功能说明: AES加密/CFB8
     * @param data 待加密字符串
     * @param vector 向量
     * @param passwd 密钥
     * @return
     */
    public static String encryptCFB8(String data,String passwd) {  
        try {
            /***生成密钥***/
            SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES");  
            /***AES/CFB8/NOPADDING模式***/
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            /***加密***/
            cipher.init(Cipher.ENCRYPT_MODE, key);  
            //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式  
            byte[] encryptedData = cipher.doFinal(data.getBytes(bm));  
  
            return new BASE64Encoder().encode(encryptedData);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return "";   
        }  
    }  
  
    /**
     * 功能说明: AES解密/CFB8
     * @param data 待解密字符串
     * @param vector 向量
     * @param passwd 密钥
     * @return
     */
    public static String decryptCFB8(String data,String passwd) {  
        try {
            byte[] byteMi = new BASE64Decoder().decodeBuffer(data);  
            SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES");  
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");  
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decryptedData = cipher.doFinal(byteMi);
            return new String(decryptedData, bm);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 功能说明: 随机生成16位的密钥
     * @return
     */
    public static String createPasswdRandom(){
        String passWd = getRandomStr(16);
        return passWd;
    }
    /**
     * 功能说明:生成指定长度的随机数,不足位数前补0
     * @param l
     * @return
     */
    public static String getRandomStr(int l){
       int ranL = 19;
       if(l < ranL){
           ranL = l;
       }
       String maxL = formatStr(String.valueOf(ranL),ranL);
       Long maxI = Long.parseLong(maxL);
       long s = (long)(maxI*Math.random());
       String result = String.format("%0" + l + "d", s);
       return result;
    }
    /**
     * 功能说明: 不足位数右补0
     * @param str
     * @param maxL
     * @return
     */
    public static String formatStr(String str,int maxL){
        int l = str.length();
        if(maxL > l){
            for(int i=0;i<maxL-l;i++){
                str = str + "0";
            }
        }
        return str;
    }
    /** 
     * 测试 
     *  
     * @param args 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  
  
  
        String content = "201801023536111222";
        String passwd = "1234567890123456";
        System.out.println(passwd);
        // 加密  
        System.out.println("加密前:" + content);  
        String encryptResult = encryptCFB8(content,passwd);  
          
        System.out.println("加密后:" + new String(encryptResult));  
        // 解密  
        String decryptResult = decryptCFB8(encryptResult,passwd);  
        System.out.println("解密后:" + new String(decryptResult));  
  
  
    }  


对称加密:加解密都是用的一个秘钥。AES,DES,3DES

非对称加密:一个私有秘钥,一个共有秘钥。一个加密,必须用另外一个解密。RSA  ,DSA

不要向量:

 

  //编码方式  
    public static final String bm = "UTF-8";

    /**
     * 功能说明: AES加密/CFB8
     * @param data 待加密字符串
     * @param vector 向量
     * @param passwd 密钥
     * @return
     */
    public static String encryptCFB8(String data,String passwd) {  
        try {
            /***生成密钥***/
            SecretKeySpec key = new SecretKeySpec(passwd.getBytes(), "AES");  
            /***AES/CFB8/NOPADDING模式***/
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            /***加密***/
            cipher.init(Cipher.ENCRYPT_MODE, key);  
            //加密操作,返回加密后的字节数组,然后需要编码。主要编解码方式有Base64, HEX, UUE,7bit等等。此处看服务器需要什么编码方式  
            byte[] encryptedData = cipher.doFinal(data.getBytes(bm));  
  
            return new BASE64Encoder().encode(encryptedData);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return "";   
        }  
    }  
  
    /**
     * 功能说明: AES解密/CFB8
     * @param data 待解密字符串
     * @param vector 向量
     * @param passwd 密钥
     * @return
     */
    public static String decryptCFB8(String data,String passwd) {  
        try {
            byte[] byteMi = new BASE64Decoder().decodeBuffer(data);  
            SecretKeySpec key = new SecretKeySpec(passwd.getBytes(),"AES");  
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");  
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] decryptedData = cipher.doFinal(byteMi);
            return new String(decryptedData, bm);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 功能说明: 随机生成16位的密钥
     * @return
     */
    public static String createPasswdRandom(){
        String passWd = getRandomStr(16);
        return passWd;
    }
    /**
     * 功能说明:生成指定长度的随机数,不足位数前补0
     * @param l
     * @return
     */
    public static String getRandomStr(int l){
       int ranL = 19;
       if(l < ranL){
           ranL = l;
       }
       String maxL = formatStr(String.valueOf(ranL),ranL);
       Long maxI = Long.parseLong(maxL);
       long s = (long)(maxI*Math.random());
       String result = String.format("%0" + l + "d", s);
       return result;
    }
    /**
     * 功能说明: 不足位数右补0
     * @param str
     * @param maxL
     * @return
     */
    public static String formatStr(String str,int maxL){
        int l = str.length();
        if(maxL > l){
            for(int i=0;i<maxL-l;i++){
                str = str + "0";
            }
        }
        return str;
    }
    /** 
     * 测试 
     *  
     * @param args 
     * @throws Exception 
     */  
    public static void main(String[] args) throws Exception {  
  
  
        String content = "201801023536111222";
        String passwd = "1234567890123456";
        System.out.println(passwd);
        // 加密  
        System.out.println("加密前:" + content);  
        String encryptResult = encryptCFB8(content,passwd);  
          
        System.out.println("加密后:" + new String(encryptResult));  
        // 解密  
        String decryptResult = decryptCFB8(encryptResult,passwd);  
        System.out.println("解密后:" + new String(decryptResult));  
  
  
    }  





         

 String s = "我的中国新+?&";
            byte[] bytes = s.getBytes();
            String s1 = new String(Hex.encodeHex(bytes));
            System.out.println(s1);
            byte[] bytes1 = Hex.decodeHex(s1.toCharArray());
            System.out.println(new String(bytes1));



这里的Aes加密解密方法使用Hex进行了编码解码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.baidu.wallet.bdwallet.utils;
import java.io.UnsupportedEncodingException;
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.SecretKeySpec;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
public class Test {
    private static final String AES= "AES" ;
    private static final String UTF8= "UTF-8" ;
     /**
     * AES加密
     * @param content
     * @param pkey
     * @return
     * @throws DecoderException
     */
     private static byte [] encrypt(String content, String pkey) throws DecoderException {
       try {
         String private_key=pkey;
         byte [] encodeFormat= null ;
         try {
           //秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码
           encodeFormat = Hex.decodeHex(private_key.toCharArray());
         } catch (DecoderException e) {
           e.printStackTrace();
         }
         SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
         // Cipher对象实际完成加密操作
         Cipher cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
         // 加密内容进行编码
         byte [] byteContent = content.getBytes(UTF8);
         // 用密匙初始化Cipher对象
         cipher.init(Cipher.ENCRYPT_MODE, key);
         // 正式执行加密操作
         byte [] result = cipher.doFinal(byteContent);
         return result;
       } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
       } catch (NoSuchPaddingException e) {
         e.printStackTrace();
       } catch (InvalidKeyException e) {
         e.printStackTrace();
       } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
       } catch (IllegalBlockSizeException e) {
         e.printStackTrace();
       } catch (BadPaddingException e) {
         e.printStackTrace();
       }
       return null ;
     }
     /**
      * AES解密
      * @param contents
      * @param password
      * @return
      * @throws DecoderException
      */
     private static byte [] decrypt(String contents, String password) throws DecoderException {
       try {
         //密文使用Hex解码
         byte []content = Hex.decodeHex(contents.toCharArray());
         //秘钥 Hex解码为什么秘钥要进行解码,因为秘钥是某个秘钥明文进行了Hex编码后的值,所以在使用的时候要进行解码
         byte [] encodeFormat = Hex.decodeHex(password.toCharArray());
         SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);
         // Cipher对象实际完成加密操作
         Cipher cipher = Cipher.getInstance(AES);
         // 用密匙初始化Cipher对象
         cipher.init(Cipher.DECRYPT_MODE, key);
         // 正式执行解密操作
         byte [] result = cipher.doFinal(content);
         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();
       }
       return null ;
     }
     /**
      * Aes加密
      * @param context 明文
      * @param private_key 秘钥
      * @return
      * @throws DecoderException
      */
     public static String encryption(String context,String private_key) throws DecoderException{
       //加密后的明文也就变成了密文
       byte [] encryptResult = encrypt(context, private_key);
       //密码文Hex编码
       String encryptResultStr = Hex.encodeHexString(encryptResult);
       return encryptResultStr;
     }
     /**
     * Aes解密
     * @param context 密文
     * @param private_key 秘钥
     * @return
     * @throws DecoderException
     * @throws UnsupportedEncodingException
     */
     public static String decryption(String context,String private_key) throws DecoderException, UnsupportedEncodingException{
      //这里的密文解密前先进行了Hex解码
       byte [] decryptResult = decrypt(context, private_key);
       String result = new String(decryptResult, UTF8);
       return result;
     }
     public static void main(String[] args) throws UnsupportedEncodingException, DecoderException {
       //加密内容
       String content = "123456787654321" ;
       //AES加密解密秘钥
       String password = "这个值一般都是给定的,双发都知道" ;
       // 加密
       System.out.println( "加密前:" + content);
       // 调用加密方法
       String encryptResultStr = encryption(content, password);
       System.out.println( "加密后:" + encryptResultStr);
       // 调用解密方法
       String result = decryption(encryptResultStr, password);
       // 解密内容进行解码
       System.out.println( "解密后:" + result);
     }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值