aes加密文件

这个Java程序展示了如何使用AES算法对文件进行加密和解密。它通过创建密钥,初始化Cipher对象,并处理文件输入输出流来实现加密和解密操作。
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());
		
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值