Java經常使用加密方案及實現——AES和DES

  AES和DES都是對稱加密算法,其中DES全稱爲Data Encryption Standard,AES全稱爲Advanced Encryption Standard即高級加密標準。html

  DES如今已經不是一種安全的加密方法,主要由於它使用的56位密鑰太短。儘管DES在安全上是脆弱的,但因爲快速DES芯片的大量生產,使得DES仍能暫時繼續使用,爲提升安全強度,一般使用獨立密鑰的三級DES。可是DES早晚要被AES代替。而AES高級加密標準已然成爲對稱密鑰加密中最流行的算法之一。在咱們的實際開發中,如今更建議選擇AES算法。java

  下面是維基百科對二者的解釋:DESAES,因爲AES的實用性和安全性以及性能,這裏只給出AES的代碼實現,DES的Java實現會面給出參考連接。算法

  

 1 package com.****.common.util;
 2 
 3 import java.io.IOException;
 4 import java.io.UnsupportedEncodingException;
 5 import java.security.SecureRandom;
 6 
 7 import javax.crypto.Cipher;
 8 import javax.crypto.KeyGenerator;
 9 import javax.crypto.SecretKey;
10 import javax.crypto.spec.SecretKeySpec;
11 
12 import org.apache.log4j.LogManager;
13 import org.apache.log4j.Logger;
14 
15 
16 
17 
18 
19 public class AESUtil {
20 
21     private static final Logger log = LogManager.getLogger(AESUtil.class);
22     
23 
24     
25     /**
26      * @Description: AES加密 
27      * @author wang
28      * @date 2017-7-30 下午03:42:47
29      * @param content 須要加密的內容 
30      * @param password  加密密鑰 
31      * @return
32      */
33     public static String encrypt(String content, String AESKey){
34         try{
35             KeyGenerator kgen = KeyGenerator.getInstance("AES");  
36             SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
37             random.setSeed(AESKey.getBytes());
38             
39             kgen.init(128, random);  
40             SecretKey secretKey = kgen.generateKey();  
41             byte[] enCodeFormat = secretKey.getEncoded();  
42             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  
43             Cipher cipher = Cipher.getInstance("AES");// 建立密碼器   
44             byte[] byteContent = content.getBytes("utf-8");  
45             cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化   
46             
47             byte[] encryptResult = cipher.doFinal(byteContent);    //加密後接口
48             
49             String result = Base64.encodeBytes(encryptResult);
50             return result; // 加密
51         }catch (Exception e){
52             log.error("AES加密時出現異常:【content:"+content+";AESPwd:"+AESKey+"】",e);
53         }
54         return null; 
55     }
56     
57     /**
58      * 
59      * @Description: AES解密
60      * @author wang
61      * @date 2017-7-30 下午04:05:32
62      * @param content  待解密內容
63      * @param password 解密密鑰
64      * @return
65      */
66     public static String decrypt(String content, String AESKey){
67         try{
68             byte[] contentByte = Base64.decode(content);// 先用base64解密  
69             KeyGenerator kgen = KeyGenerator.getInstance("AES");
70             SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
71             random.setSeed(AESKey.getBytes());
72             
73             kgen.init(128, random);
74             SecretKey secretKey = kgen.generateKey();
75             byte[] enCodeFormat = secretKey.getEncoded();
76             SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
77             Cipher cipher = Cipher.getInstance("AES");// 建立密碼器   
78             cipher.init(Cipher.DECRYPT_MODE, key);// 初始化   
79             byte[] result = cipher.doFinal(contentByte);
80             return new String(result,"utf-8"); // 解密
81         }catch(Exception e){
82             log.error("AES解密時出現異常:[content:"+content+";AESPwd:"+AESKey+"]");
83         }
84         return null;
85     }
86     
87     
88     //test 
89     public static void main(String[] args) throws IOException {
90         String a = "JDE1234567891234567891_abcd-1234-abcd-1234";
91         String aesKey="JDE1234567891234567891";
92         String encodeStr = encrypt(a,aesKey);
93         System.out.println(encodeStr);
94         String decodeStr = decrypt(encodeStr,aesKey);
95         System.out.println(decodeStr);
96     }
97 }

  運行結果:apache

  

  延伸一點:關於AES加密後獲得的密文的長度,我在網上看到的有一種解釋是密文長度只和明文長度有關,和祕鑰長無關,可是根據代碼的實際運行狀況看不是這樣,而是和明文以及祕鑰都有關。關於密文長度問題,歡迎你們一塊兒討論。安全

  關於DES的Java代碼實現:參考這裏dom

相關文章
相關標籤/搜索