1. 程式人生 > >JAVA安全筆記(三)-輸入流加密

JAVA安全筆記(三)-輸入流加密

程式設計中會遇到對整個檔案進行加密/解密或對網路通訊進行加密/解密等。儘管可以先從流中讀出位元組,然後進行加密/解密,但使用Java中針對流提供的專門的類更加的方便。

輸入流的加密的技術要點

1.金鑰生成
2.初始化密碼器Cipher
3.建立輸入流
4.建立CipherInputStream物件

5.讀取輸入流               

原始碼

package ende;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;


public class E_InStream {
	public static void main(String[] args) throws Exception {
		//生成金鑰
		FileInputStream f=new FileInputStream("C:\\Users\\Administrator\\Desktop\\key1.dat");
		ObjectInputStream ob=new ObjectInputStream(f);
		Key k=(Key)ob.readObject();
		Cipher cp=Cipher.getInstance("DESede");//建立密碼器
		cp.init(Cipher.ENCRYPT_MODE, k); //cp的初始化模式為加密模式ENCRYPT_MODE,以及金鑰k
		FileInputStream in=new FileInputStream("C:\\Users\\Administrator\\Desktop\\file.txt"); //建立要加密的輸入流,txt文件格式
		CipherInputStream cin=new CipherInputStream(in, cp);//建立CipherInputstream物件
		int b=0;
		int i=1;
		FileOutputStream out =new  FileOutputStream("C:\\Users\\Administrator\\Desktop\\E_InStream.dat");//將密文儲存到指定的檔案中
		System.out.println("對檔案輸入流加密的密文如下:");
		while((b= cin.read())!=-1){ //讀輸入流
			System.out.print((byte) b+" ");
			out.write((byte)b); // 書中程式碼中漏掉的,要往檔案中寫
			i++;
			if(i%30 == 0)
				System.out.println();
		}
	}
}

file.txt檔案放置的檔案內容為test

源程式解讀
(1)FileInputStream f=new FileInputStream("C:\\Users\\Administrator\\Desktop\\key1.dat");
語句從檔案中讀取以前儲存的金鑰,這個key1.dat的生成也是由程式執行生成的,這個程式出自  Java安全筆記(二)-建立對稱金鑰
這樣可以保證本例項所用的金鑰和以前相同,以便對比加密結果
(2)FileInputStream in=new FileInputStream("C:\\Users\\Administrator\\Desktop\\file.txt"); 
語句的作用是建立要加密的輸入流,本程式是以加密檔案為例,因此建立檔案輸入流,檔名為file.txt,
教材中為file.doc,doc格式的檔案在加密後解密的時候會亂碼,暫時用txt格式的檔案。
(3)CipherInputStream cin=new CipherInputStream(in, cp);
語句的作用是建立CipherInputStream物件,根據前面所建立的密碼器和輸入流為引數構造CipherInputStream物件
(4) 與java.io包中的基本的輸入流一樣使用read()方法從CipherInputStream流中讀取資料,則在讀取過程中會自動根據密碼器中的設定進行加密