對稱加密演算法(4):PEB
阿新 • • 發佈:2019-02-14
一.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; }