java實現DES資料加密與解密

DisFney發表於2017-09-06

DES加密原理

DES 使用一個 56 位的金鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文字塊分成兩半。使用子金鑰對其中一半應用迴圈功能,然後將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最後一個迴圈不交換。DES 使用 16 個迴圈,使用異或,置換,代換,移位操作四種基本運算。 解密反之。

 

接下來是我做測試的程式碼:

 

DES資料加密清單:

 

[java] view plain copy
 print?
  1. /** 
  2.      * DES演算法金鑰 
  3.      */  
  4.     private static final byte[] DES_KEY = { 211, -11082, -32, -85, -128, -65 };  
  5.     /** 
  6.      * 資料加密,演算法(DES) 
  7.      * 
  8.      * @param data 
  9.      *            要進行加密的資料 
  10.      * @return 加密後的資料 
  11.      */  
  12.     public static String encryptBasedDes(String data) {  
  13.         String encryptedData = null;  
  14.         try {  
  15.             // DES演算法要求有一個可信任的隨機數源  
  16.             SecureRandom sr = new SecureRandom();  
  17.             DESKeySpec deskey = new DESKeySpec(DES_KEY);  
  18.             // 建立一個密匙工廠,然後用它把DESKeySpec轉換成一個SecretKey物件  
  19.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  20.             SecretKey key = keyFactory.generateSecret(deskey);  
  21.             // 加密物件  
  22.             Cipher cipher = Cipher.getInstance("DES");  
  23.             cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
  24.             // 加密,並把位元組陣列編碼成字串  
  25.             encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));  
  26.         } catch (Exception e) {  
  27. //            log.error("加密錯誤,錯誤資訊:", e);  
  28.             throw new RuntimeException("加密錯誤,錯誤資訊:", e);  
  29.         }  
  30.         return encryptedData;  
  31.     }  



DES資料解密清單:

 

[java] view plain copy
 print?
  1.  /** 
  2.      * 資料解密,演算法(DES) 
  3.      * 
  4.      * @param cryptData 
  5.      *            加密資料 
  6.      * @return 解密後的資料 
  7.      */  
  8.     public static String decryptBasedDes(String cryptData) {  
  9.         String decryptedData = null;  
  10.         try {  
  11.             // DES演算法要求有一個可信任的隨機數源  
  12.             SecureRandom sr = new SecureRandom();  
  13.             DESKeySpec deskey = new DESKeySpec(DES_KEY);  
  14.             // 建立一個密匙工廠,然後用它把DESKeySpec轉換成一個SecretKey物件  
  15.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  16.             SecretKey key = keyFactory.generateSecret(deskey);  
  17.             // 解密物件  
  18.             Cipher cipher = Cipher.getInstance("DES");  
  19.             cipher.init(Cipher.DECRYPT_MODE, key, sr);  
  20.             // 把字串解碼為位元組陣列,並解密  
  21.             decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));  
  22.         } catch (Exception e) {  
  23. //            log.error("解密錯誤,錯誤資訊:", e);  
  24.             throw new RuntimeException("解密錯誤,錯誤資訊:", e);  
  25.         }  
  26.         return decryptedData;  
  27.     }  


 

測試清單:

 

[java] view plain copy
 print?
  1. public static void main(String[] args) {  
  2.         // TODO Auto-generated method stub  
  3.           
  4.         String str="0123456789abcdefg";  
  5.   
  6.         // DES資料加密  
  7.         String s1=encryptBasedDes(str);  
  8.           
  9.         System.out.println(s1);  
  10.           
  11.         // DES資料解密  
  12.         String s2=decryptBasedDes(s1);  
  13.           
  14.         System.err.println(s2);  
  15.           
  16.           
  17.     }  


輸出結果:

 

[java] view plain copy
 print?
  1. eUhQ+Ko1BJh5j4ok/VKL/LrUgmg0n8vV  
  2. 0123456789abcdefg  

相關文章