您的位置:首页 > 编程语言 > Java开发

java文件加密

2015-07-11 22:45 375 查看
package utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;

//import lantrack.common.config.Config;

public class des {

//	public  String keyFile = (new StringBuilder(Config.EWEBEDIT_UPLOAD_PATH)).append("\\xfaj\\moban\\key.txt").toString();

public  String keyFile="D:\\code.txt";

//	public String getKeyFile(){
//		return this.keyFile;
//	}
//
//	public void setKeyFile(String keyFile){
//		this.keyFile=keyFile;
//	}

//用java生成一个key并保存到一个二进制文件中去的方法如下:
public static void saveBytePriveKey(String file) {

try {
//        	String keyString="de23a211";
//			byte[] keyData=keyString.getBytes();
//			SecretKey key=new SecretKeySpec(keyData,"DES");
//			System.out.println("key1====="+key.toString());

KeyGenerator keyGen = KeyGenerator.getInstance("DES");

SecretKey key = keyGen.generateKey();// 生成私钥Key
System.out.println("key2====="+key.toString());
//key2=====com.sun.crypto.provider.DESKey@1805a
FileOutputStream fop = new FileOutputStream(file);
fop.write(key.getEncoded());
fop.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}

//从密钥文件中读取内容生成密钥
public static SecretKey getBytePriveKey(String file) throws Exception {
File keyf = new File(file);
long length = keyf.length();
byte[] bytes = new byte[(int) length];

FileInputStream fis = new FileInputStream(keyf);

// Read in the bytes
int offset = 0;
int numRead = 0;

while (offset < bytes.length && (numRead = fis.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
DESKeySpec dks = new DESKeySpec(bytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
System.out.println("key3===="+key);

return key;
}

//文件加密
public static void encryptFile(String plainFile, String encryptedFile, String keyFile) {
try {

SecretKey key = getBytePriveKey(keyFile);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);

FileInputStream fis = new FileInputStream(plainFile);
FileOutputStream fos = new FileOutputStream(encryptedFile);
crypt(fis, fos, cipher);

fis.close();
fos.close();

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

public static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException,
GeneralSecurityException {
int blockSize = cipher.getBlockSize();
int outputSize = cipher.getOutputSize(blockSize);
System.out.println("blockSize " + blockSize + " outputSize" + outputSize);

byte[] inBytes = new byte[blockSize];
byte[] outBytes = new byte[outputSize];

int inLength = 0;
boolean more = true;
while (more) {
inLength = in.read(inBytes);
if (inLength == blockSize) {
int outLength = cipher.update(inBytes, 0, blockSize, outBytes);//加密流的解密
out.write(outBytes, 0, outLength);
} else {
more = false;
}
}
if (inLength > 0)
outBytes = cipher.doFinal(inBytes, 0, inLength);
else
outBytes = cipher.doFinal();
out.write(outBytes);
}

//文件解密
public static void decryptFile(String encryptedFile, String decryptedFile, String keyFile) {
try {

SecretKey key = getBytePriveKey(keyFile);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);

FileInputStream fis = new FileInputStream(encryptedFile);
FileOutputStream fos = new FileOutputStream(decryptedFile);
crypt(fis, fos, cipher);

fis.close();
fos.close();

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

}

public static void main(String[] args) throws Exception {
des fk= new des();
//String keyFile=fk.getKeyFile();
String keyFile="D:\\code.txt";
String plainFile="D:\\test.docx";
String encryptedFile="D:\\jiami.docx";
//
//
//	  fk.encryptFile(plainFile, encryptedFile, keyFile);
//解密文件地址
//	  String path="D:\\jiemi.docx";
//	  System.out.println(path);
//	  fk.decryptFile(encryptedFile, path, keyFile);
fk.saveBytePriveKey("D:\\savekey.txt");
fk.getBytePriveKey("D:\\getkey.txt");
}

}

savekey和getkey两个方法暂时没有用到。

本地对txt格式和word格式测试过,其中word中有图片的也测试过。

转:http://www.oschina.net/code/snippet_945123_23891
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: