java.security包實現對象加密

    Java原生支持常見的加密算法,例如DES、RSA。隨便寫點關於Java安全包的東西。 java

    Java.security.Provider對象官方的解釋是:實現了 Java 安全性的一部分或者所有。     算法

    provider 可能實現的服務包括:算法(如 DSA、RSA、MD5 或 SHA-1),密鑰的生成、轉換和管理設施(如用於特定於算法的密鑰)。 安全

    每一個 provider 有一個名稱和一個版本號,而且在每一個它裝入運行時中進行配置。 框架

    能夠經過以下語句查看本地JDK提供的provider類型: ide

for(Provider p : Security.getProviders()){
	System.out.println(p+" "+p.getInfo());
}



    javax.crypto.KeyGenerator對象做爲對稱密鑰生成器,JavaAPI當中給出的解釋是:密鑰生成器是使用此類的某個 getInstance 類方法構造的。


    KeyGenerator 對象可重複使用,也就是說,在生成密鑰後,能夠重複使用同一個 KeyGenerator 對象來生成更多的密鑰。生成密鑰的方式有兩種:與算法無關的方式和特定於算法的方式。很少囉嗦,能夠查看API文檔,當中強調了一點:若是客戶端沒有顯式地初始化 KeyGenerator(經過調用 init 方法),那麼每一個提供者都必須提供(並記錄)默認初始化。 this

    javax.crypto.SecretKey對稱表示密鑰。 編碼

    javax.crypto.spec.IvParameterSpec,此類指定一個初始化向量 (IV)。使用 IV 的例子是反饋模式中的密碼,如,CBC 模式中的 DES 和使用 OAEP 編碼操做的 RSA 密碼。 加密

    javax.crypto.Cipher此類爲加密和解密提供密碼功能。它構成了 Java Cryptographic Extension (JCE) 框架的核心。API中的解釋是:爲建立 Cipher 對象,應用程序調用 Cipher 的getInstance 方法並將所請求轉換的名稱傳遞給它。還能夠指定提供者的名稱(可選)。
轉換 是一個字符串,它描述爲產生某種輸出而在給定的輸入上執行的操做(或一組操做)。轉換始終包括加密算法的名稱(例如,DES),後面可能跟有一個反饋模式和填充方案。
轉換具備如下形式:
    「算法/模式/填充」或
    「算法」
    (後一種狀況下,使用模式和填充方案特定於提供者的默認值)。例如,如下是有效的轉換:
    Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

    好了,基本的對象介紹完了,下面來看看代碼:
spa

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;


public class JavaSecurity {
	
	public static void main(String[] args) {
		JavaSecurity js = new JavaSecurity();
		String test = "keep foolish , keep hungry";
		String entryString = js.encrypt(test);
		System.out.println(entryString);
		String decryptString = js.decrypt(entryString);
		System.out.println(decryptString);
	}
	public JavaSecurity(){
		try {
			this.init();
		} catch (NoSuchAlgorithmException | NoSuchProviderException
				| UnsupportedEncodingException | NoSuchPaddingException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * init()
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchProviderException
	 * @throws UnsupportedEncodingException
	 * @throws NoSuchPaddingException
	 */
	public void init() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, NoSuchPaddingException{
		//密鑰生成器
		keyGenerator = KeyGenerator.getInstance("DES", "SunJCE");
		//對稱密鑰
		key = keyGenerator.generateKey();
		//加解密時的初始化向量 8bytes
		iv = new IvParameterSpec("87654321".getBytes("utf-8"));
		//DES加密算法,CBC反饋模式,PKCSPadding的填充方案
		cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
		
	}
	/**
	 * 加密
	 * @param str
	 * @return
	 * @throws InvalidKeyException
	 * @throws InvalidAlgorithmParameterException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public String encrypt(String str) {
		String returnStr = "";
		try {
			cipher.init(Cipher.ENCRYPT_MODE, key , iv);
		} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		byte[] strByte = str.getBytes();
		//加密
		byte[] encryStr = null;
		try {
			encryStr = cipher.doFinal(strByte);
		} catch (IllegalBlockSizeException | BadPaddingException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		returnStr = new sun.misc.BASE64Encoder().encode(encryStr);
		return returnStr;
		
	}
	
	/**
	 * 解密
	 * @param str
	 * @return
	 * @throws InvalidKeyException
	 * @throws InvalidAlgorithmParameterException
	 * @throws IOException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public String decrypt(String str) {
		String returnStr = "";
		try {
			cipher.init(Cipher.DECRYPT_MODE, key, iv);
		} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		byte[] strByte = null;
		try {
			strByte = new BASE64Decoder().decodeBuffer(str);
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		byte[] returnStrByte = null;
		try {
			returnStrByte = cipher.doFinal(strByte);
		} catch (IllegalBlockSizeException | BadPaddingException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		returnStr = new String(returnStrByte);
		return returnStr;
	}


	/**
	 * 密鑰生成器
	 */
	private KeyGenerator keyGenerator;
	/**
	 * 對稱密鑰
	 * */
	private SecretKey key;
	/**
	 * 加解密時的初始化向量 8bytes
	 * */
	private IvParameterSpec iv;
	/**
	 * cipher
	 * */
	private Cipher cipher;
}
相關文章
相關標籤/搜索