1. 程式人生 > >對稱加密演算法(4):PEB

對稱加密演算法(4):PEB

一.PBE(Password Based Encryption,基於口令加密)是一種基於口令的加密演算法,其特點是使用口令代替了金鑰,而口令由使用者自己掌管,採用隨機數(這裡稱之為 鹽 或者 擾碼)雜湊多重加密等方法保證資料的安全性。PBE 演算法並沒有 真正構建新的加密/解密演算法,而是對已知的對稱加密演算法(eg:DES演算法)做了包裝;使用PBE演算法對資料做加密/解密操作時,其實是使用了 DES 或者 AES 等其他對稱加密演算法做了相應的操作。

二.PEB 的演算法還是比較多的(或者說是包裝演算法),如圖:

三.實現的方式有 jdk , 跟 bc 的兩種 方式,下面給出 jdk 的具體實現(java):

	/**
	 * 獲取 鹽(擾碼)
	 * @return
	 */
	public static byte [] PEB_GetSalt(){
		SecureRandom random = new SecureRandom();
		byte [] salt = random.getSeed(8);
		return salt;
	}
	
	/**
	 * 將口令轉為祕鑰 
	 * @param password
	 * @return
	 * @throws Exception
	 */
	public static Key PEB_PassWordToKey (String password)throws Exception{
		PBEKeySpec pebkeyspec = new PBEKeySpec(password.toCharArray());
		SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");// 指定演算法
		return factory.generateSecret(pebkeyspec);
	}
	
	/**
	 * JDK  使用 peb 進行資料的加密 
	 * @param src
	 * @param encryptKey
	 * @return
	 * @throws Exception
	 */
	public static byte [] JDK_PEB_Decrypt(String src,byte [] salt,String password) throws Exception{
		PBEParameterSpec paraSpec = new PBEParameterSpec(salt,10);  
		//加密
		Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
		cipher.init(Cipher.ENCRYPT_MODE, PEB_PassWordToKey(password),paraSpec);
		byte [] result = cipher.doFinal(src.getBytes());
		return result;
	}
	
	/**
	 * jdk   peb   對資料進行解密 
	 * @param encryptBytes
	 * @param salt
	 * @param password
	 * @return
	 * @throws Exception
	 */
	public static String JDK_PEB_Encrypt(byte [] encryptBytes,byte [] salt,String password) throws Exception{
		PBEParameterSpec paraSpec = new PBEParameterSpec(salt,10);  
		//解密
		Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
		cipher.init(Cipher.DECRYPT_MODE, PEB_PassWordToKey(password),paraSpec);
		String result = new String(cipher.doFinal(encryptBytes));
		return result;
	}