java实现DES数据加密与解密

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  

你可能感兴趣的:(java,DES加密与解密)