import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class CipherUtil {
/**
* 使用AES对文件进行加密和解密
*
*/
private static String type = "AES";
/**
* 把文件srcFile加密后存储为destFile
* @param srcFile 加密前的文件
* @param destFile 加密后的文件
* @param privateKey 密钥
* @throws GeneralSecurityException
* @throws IOException
*/
public void encrypt(String srcFile, String destFile, String privateKey) throws GeneralSecurityException, IOException {
Key key = getKey(privateKey);
Cipher cipher = Cipher.getInstance(type + "/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(mkdirFiles(destFile));
crypt(fis, fos, cipher);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
}
}
/**
* 把文件srcFile解密后存储为destFile
* @param srcFile 解密前的文件
* @param destFile 解密后的文件
* @param privateKey 密钥
* @throws GeneralSecurityException
* @throws IOException
*/
public void decrypt(String srcFile, String destFile, String privateKey) throws GeneralSecurityException, IOException {
Key key = getKey(privateKey);
Cipher cipher = Cipher.getInstance(type + "/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(mkdirFiles(destFile));
crypt(fis, fos, cipher);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
fis.close();
}
if (fos != null) {
fos.close();
}
}
}
/**
* 根据filePath创建相应的目录
* @param filePath 要创建的文件路经
* @return file 文件
* @throws IOException
*/
private File mkdirFiles(String filePath) throws IOException {
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
return file;
}
/**
* 生成指定字符串的密钥
* @param secret 要生成密钥的字符串
* @return secretKey 生成后的密钥
* @throws GeneralSecurityException
*/
private static Key getKey(String secret) throws GeneralSecurityException {
KeyGenerator kgen = KeyGenerator.getInstance(type);
kgen.init(128, new SecureRandom(secret.getBytes()));
SecretKey secretKey = kgen.generateKey();
return secretKey;
}
/**
* 加密解密流
* @param in 加密解密前的流
* @param out 加密解密后的流
* @param cipher 加密解密
* @throws IOException
* @throws GeneralSecurityException
*/
private static void crypt(InputStream in, OutputStream out, Cipher cipher) throws IOException, GeneralSecurityException {
int blockSize = cipher.getBlockSize() * 1000;
int outputSize = cipher.getOutputSize(blockSize);
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 main(String[] args) throws GeneralSecurityException, IOException {
// SignUtil.checkSignature("", "20120403", "xiongxing20120403!@#$%^&*");
String privateKey = "xiong123456";
// E:\tmp\你好.rar
CipherUtil util = new CipherUtil();
System.out.println("开始.."+System.currentTimeMillis());
//加密
util.encrypt("E:\\tmp\\wei.rar", "E:\\tmp\\wei.css", privateKey);
//解密
//util.decrypt("E:\\tmp\\你好dest.rar", "E:\\tmp\\你好.rar", privateKey);
System.out.println("结束.."+System.currentTimeMillis());
}
}aes加密文件
最新推荐文章于 2023-02-21 14:47:33 发布
这个Java程序展示了如何使用AES算法对文件进行加密和解密。它通过创建密钥,初始化Cipher对象,并处理文件输入输出流来实现加密和解密操作。
360

被折叠的 条评论
为什么被折叠?



