JAVA安全笔记(三)-输入流加密

时间:2022-02-06 11:28:18
编程中会遇到对整个文件进行加密/解密或对网络通信进行加密/解密等。尽管可以先从流中读出字节,然后进行加密/解密,但使用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();
		}
	}
}

JAVA安全笔记(三)-输入流加密

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流中读取数据,则在读取过程中会自动根据密码器中的设置进行加密