AES和DES都是對稱加密算法,其中DES全稱爲Data Encryption Standard,AES全稱爲Advanced Encryption Standard即高級加密標準。html
DES如今已經不是一種安全的加密方法,主要由於它使用的56位密鑰太短。儘管DES在安全上是脆弱的,但因爲快速DES芯片的大量生產,使得DES仍能暫時繼續使用,爲提升安全強度,一般使用獨立密鑰的三級DES。可是DES早晚要被AES代替。而AES高級加密標準已然成爲對稱密鑰加密中最流行的算法之一。在咱們的實際開發中,如今更建議選擇AES算法。java
下面是維基百科對二者的解釋:DES、AES,因爲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