1. 程式人生 > >java DES演算法實現字串加密(本地txt存取)

java DES演算法實現字串加密(本地txt存取)

什麼是DES加密演算法

常見加密演算法有對稱加密演算法和非對稱加密演算法,它們的區別是加密和解密使用的是否是同一把鑰匙,常見的對稱加密演算法有DES,非對稱演算法有RSA,我們這裡重點介紹DES加密演算法,我們希望把這種演算法應用在本地賬號密碼資訊的加密上。顧名思義,祕鑰在這裡用來加密資料,解密資料的,我們通過原字串和祕鑰可以獲得加密後的位元組陣列,儲存在本地,取出後,利用祕鑰解密得到之前儲存的字串,在生產字串之前,我們是無法通過別的途徑拿到資料的。我們這裡重點介紹DES演算法的使用,在Java中,有一組DES的API,我們需要學會如何去使用它。

DES加密演算法的特點

  1. 祕鑰是位元組陣列,且其長度必須是8的整數倍。
  2. 加密、解密都需要同一把祕鑰參與(它是一個位元組陣列)。
  3. 對稱加密演算法,加密和解密的流程類似。

需要注意的地方

  1. 我們採用IO流的方式存取資料,存資料的時候是直接把位元組陣列寫入檔案流。
  2. 取出資料時,我們先用一個長陣列接收(假設長度未知),再獲取位元組陣列的長度,然後擷取相應長度到新陣列。
  3. 解密後得到的是位元組陣列,且其中每個元素都是用ASCII碼錶示的,我們需要把它轉為字串。

Java實現DES加密、解密字串及本地存取資料

1、字串加密,解密,IO流本地存取:

public class Test {	
	/**
	 * 把字串加密得到位元組陣列寫入檔案儲存在本地,等待取出;當需要用到的時候,取出位元組陣列,解密 ,轉字串
	 * @param args
	 */
	public static void main(String[] args){     		
		 byte[] buff1 = null; //申明變數,等下要用到
		 String password = "231rg34324234324dgdgdg3"; //需要加密的內容
		 System.out.println("需要加密的字串:"+password);
		 byte[] key ={1,2,3,4,5,6,7,8}; //8位金鑰
		 byte[] result1 = DES.desEncrypt(password.getBytes(), key ) ;//加密,返回加密後的位元組陣列
	     System.out.println("加密後的位元組陣列:"+Arrays.toString(result1));   		 
		 File file = new File("E:\\workspace\\mayifan\\src\\com\\myf\\des1210\\data.txt");//地址
		 try {
		 FileOutputStream out = new FileOutputStream(file); //輸出流					     
	     out.write(result1); //寫入檔案,直接寫位元組陣列
	     out.close(); //關資源	     
	     byte[] buff = new byte[1024]; 
	     FileInputStream fis = new FileInputStream(file);//檔案輸入流,準備讀檔案位元組
	     int length =fis.read(buff); //讀資料到buff,並返回長度
	     buff1 = new byte[length];  
	     System.arraycopy(buff, 0, buff1, 0 , length );//System的靜態方法 ,(原陣列,原陣列起始位置,目的陣列,目的陣列起始位置,截長度)	
	     System.out.println("從檔案中讀出來的位元組陣列:"+Arrays.toString(buff1));
	     fis.close();	     
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}	      					 
	    byte[] result2 = DES.desDecrypt(buff1, key ) ;//解密	                       
	    System.out.println("解密得到的位元組陣列轉字串並列印"+Arrays.toString(result2));  //列印解密得到的位元組陣列轉字串       	   
			try {
		    String passwordGeted = new String(result2,"ascii");  //位元組陣列表示的是ASCII碼,位元組陣列轉字串
			System.out.println("最終得到的字串:"+passwordGeted); //列印字串
		} catch (UnsupportedEncodingException e) {   //可能會有字元的編碼異常,故try,catch
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	    //得到的字串和之前輸入的字串一致
	}			
}

2、工具類,包括DES加密演算法和DES解密演算法:

public class DES {	
	// 加密
	public static byte[] desEncrypt(byte[] data,byte[] keyData){
	    return des(Cipher.ENCRYPT_MODE,data,keyData);
	}
	// 解密
	public static byte[] desDecrypt(byte[] data,byte[] keyData){
	    return des(Cipher.DECRYPT_MODE,data,keyData);
	}		
	//DES演算法	
	public static byte[] des(int mode,byte[] data,byte[] keyData)
	{
	    byte[] ret = null;
	    //加密的內容存在並且金鑰存在且長度為8個位元組
	    if (data != null
	        && data.length>0
	        &&keyData!=null
	        && keyData.length==8) {
	      try {
	        Cipher cipher = Cipher.getInstance("DES");
	        DESKeySpec keySpec = new DESKeySpec(keyData);
	        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
	        SecretKey key = keyFactory.generateSecret(keySpec);
	        cipher.init(mode, key);
	        ret = cipher.doFinal(data);
	      } catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	      } catch (NoSuchPaddingException e) {
	        e.printStackTrace();
	      } catch (IllegalBlockSizeException e) {
	        e.printStackTrace();
	      } catch (BadPaddingException e) {
	        e.printStackTrace();
	      } catch (InvalidKeySpecException e) {
	        e.printStackTrace();
	      } catch (InvalidKeyException e) {
	        e.printStackTrace();
	      }
	    }
	    return ret;
	}				
}

3、程式執行結果:
需要加密的字串:231rg34324234324dgdgdg3
加密後的位元組陣列:[-74, -76, 35, -87, -47, -94, 13, -24, 37, 8, 122, -113, 24, 79, -20, -92, 23, 101, 66, -69, -66, 10, -44, 66]
從檔案中讀出來的位元組陣列:[-74, -76, 35, -87, -47, -94, 13, -24, 37, 8, 122, -113, 24, 79, -20, -92, 23, 101, 66, -69, -66, 10, -44, 66]
解密得到的位元組陣列轉字串並列印[50, 51, 49, 114, 103, 51, 52, 51, 50, 52, 50, 51, 52, 51, 50, 52, 100, 103, 100, 103, 100, 103, 51]
最終得到的字串:231rg34324234324dgdgdg3