Imooc_JAVA實現對稱加密4-1 JAVA-對稱加密算法PBE

原視頻地址
Imooc_JAVA實現對稱加密4-1 JAVA-對稱加密算法PBE

package PBE;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

import org.apache.commons.codec.binary.Hex;

import Base64.Base64;

public class PBE {

    private static  String src = "imooc security pbe";

    public static void main(String[] args) {
        jdkPBE();
    }//main方法結束



    private static void jdkPBE(){
        try {
            /*鹽值就是在密碼hash過程中添加的額外的隨機值,如,用戶的ID就可以作爲鹽值,
                 來進行hash,生產密文,進而,可以做到密碼保護的目的
            */

            //初始化鹽(口令):加密的隨機數或字符串           通過隨機數random來產生鹽
            //SecureRandom提供加密的強隨機數生成器 (RNG)
            SecureRandom random = new SecureRandom();
            byte[] salt = random.generateSeed(8);//返回給定的種子字節數量,該數量可使用此類用來爲其自身提供種子的種子生成算法來計算。


            //加密  首先定義密碼
            //口令與密鑰
            String password = "jluzh";
            //通過PBEKeySpec類實例化一個能夠把           鹽 密碼 口令轉爲密鑰               的對象pbeKeySpec
            //PBEKeySpec可以將密碼視爲某種原始密鑰內容,由此加密機制使用其導出一個密鑰
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
            //SecretKeyFactory類祕密密鑰的工廠。 密鑰工廠用來將密鑰(類型 Key 的不透明加密密鑰)轉換爲密鑰規範(底層密鑰材料的透明表示形式)
            //getInstance返回轉換指定算法的祕密密鑰的 SecretKeyFactory 對象  
            //algorithm參數 - 所請求的祕密密鑰算法的標準名稱
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            //通過factory 的generateSecret 生成Key       根據提供的密鑰規範(密鑰材料)生成 SecretKey 對象  keySpec - 祕密密鑰的規範(密鑰材料)     
//          generateSecret()參數爲祕鑰材料desKeySpec   該生成我們所需要的祕鑰
            Key key = factory.generateSecret(pbeKeySpec);

            //加密
            //實例化一個PBE的參數的輸入材料  爲 PKCS #5 標準中所定義的基於密碼的加密法構造一個參數集合。 
            //salt - salt。複製該 salt 的內容來防止後續修改。  iterationCount - 迭代計數。 
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100);
            //KEY轉換完之後      Cipher類的實例來進行加密和解密操作
            //getInstance("加解密算法/工作方式/填充方式")
            //Cipher此類爲加密和解密提供密碼功能  
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            //cipher.init(opmode, certificate);  第一個參數爲模式  第二個參數爲轉換後的KEY
//          Cipher.ENCRYPT_MODE加密模式     轉換後的KEY:convertsecretKey
            cipher.init(Cipher.ENCRYPT_MODE, key,pbeParameterSpec);
            //doFinal(input);  input即使要被加密的內容
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println("jdk pbe encrypt:"+org.apache.commons.codec.binary.Base64.encodeBase64String(result));


            //解密
            //cipher.init(opmode, certificate);  第一個參數爲模式  第二個參數爲轉換後的KEY
//          Cipher.ENCRYPT_MODE解密模式     轉換後的KEY:convertsecretKey
            cipher.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec);
            result = cipher.doFinal(result);
            System.out.println("jdk pbe decrypt:"+new String(result));

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}//PBE類結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章