编程中会遇到对整个文件进行加密/解密或对网络通信进行加密/解密等。尽管可以先从流中读出字节,然后进行加密/解密,但使用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流中读取数据,则在读取过程中会自动根据密码器中的设置进行加密