zoukankan      html  css  js  c++  java
  • java DES加密解密文件

    在android开发中或者java开发中,经常用一些加密或者解密文件的,下面是我最近测试的一个DES加密解密文件的方式,记录一下,防止以后忘记了!

    下面直接贴代码把,详细的注释都写有:

    package com.spring.des;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.security.InvalidKeyException;
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.Cipher;
    import javax.crypto.CipherInputStream;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.SecretKeySpec;
    
    /***
     * Des文件加密解密
     * 
     * @author spring sky<br>
     * Email:vipa1888@163.com<br>
     * QQ:840950105
     * 
     */
    public class DesFileEncrypt {
    	/**
    	 * 要加密的文件路径列表
    	 */
    	public static String[] filePath = { "D:/sasdfp.sql" };
    	/**
    	 * 加密后的文件路径列表
    	 */
    	public static String[] outFilePath = new String[filePath.length];
    	private static final String KEY = "spring sky";
    
    	public DesFileEncrypt() {
    		super();
    		getKey(KEY);
    		initCipher();
    		//初始化开始加密文件
    		crateEncryptFile();
    	}
    
    	private Key key;
    	
    	/***
    	 * 解密密码
    	 */
    	private Cipher cipherDecrypt;
    	/**
    	 * 加密密码
    	 */
    	private Cipher cipherEncrypt;
    
    	/**
    	 * 加密文件平且记录加密后的文件路径
    	 * */
    	private void crateEncryptFile() {
    		String outPath = null;
    		for (int i = 0; i < filePath.length; i++) {
    			try {
    				outPath = filePath[i].substring(0,filePath[i].lastIndexOf("."))+".bin";
    				encrypt(filePath[i], outPath);
    				outFilePath[i] = outPath;
    				System.out.println(filePath[i]+"加密完成,加密后的文件是:"+outFilePath[i]);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println("=========================加密完成=======================");
    		
    	}
    
    	/**
    	 * 加密文件的核心
    	 * 
    	 * @param file
    	 *            要加密的文件
    	 * @param destFile
    	 *            加密后存放的文件名
    	 */
    	public void encrypt(String file, String destFile) throws Exception {
    		InputStream is = new FileInputStream(file);
    		OutputStream out = new FileOutputStream(destFile);
    
    		CipherInputStream cis = new CipherInputStream(is, cipherEncrypt);
    		byte[] buffer = new byte[1024];
    		int r;
    		while ((r = cis.read(buffer)) > 0) {
    			out.write(buffer, 0, r);
    		}
    		cis.close();
    		is.close();
    		out.close();
    	}
    
    	/***
    	 * 解密文件
    	 * @param destFile
    	 */
    	public void decrypt(String destFile) {
    		try {
    			InputStream is = new FileInputStream(destFile);
    			CipherInputStream cis = new CipherInputStream(is, cipherDecrypt);
    			BufferedReader reader = new BufferedReader(new InputStreamReader(
    					cis));
    			String line = null;
    			while ((line = reader.readLine()) != null) {
    				System.out.println(line);
    			}
    			reader.close();
    			cis.close();
    			is.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	private void initCipher() {
    		try {
    			// 加密的cipher
    			cipherEncrypt = Cipher.getInstance("DES");
    			cipherEncrypt.init(Cipher.ENCRYPT_MODE, this.key);
    			// 解密的cipher
    			cipherDecrypt = Cipher.getInstance("DES");
    			cipherDecrypt.init(Cipher.DECRYPT_MODE, this.key);
    		} catch (InvalidKeyException e) {
    			e.printStackTrace();
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			e.printStackTrace();
    		}
    	}
    
    	/**
    	 * 自定义一个key
    	 * 
    	 * @param string
    	 */
    	public Key getKey(String keyRule) {
    		// Key key = null;
    		byte[] keyByte = keyRule.getBytes();
    		// 创建一个空的八位数组,默认情况下为0
    		byte[] byteTemp = new byte[8];
    		// 将用户指定的规则转换成八位数组
    		for (int i = 0; i < byteTemp.length && i < keyByte.length; i++) {
    			byteTemp[i] = keyByte[i];
    		}
    		key = new SecretKeySpec(byteTemp, "DES");
    		return key;
    	}
    
    	/**
    	 * 解密密码
    	 * 
    	 * @return
    	 */
    	public Cipher getCipherEdcrypt() {
    		return cipherDecrypt;
    	}
    
    	/**
    	 * 加密密码
    	 * 
    	 * @return
    	 */
    	public Cipher getCipherEncrypt() {
    		return cipherEncrypt;
    	}
    
    	/***
    	 * 测试加密解密
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		DesFileEncrypt desFileEncrypt = new DesFileEncrypt();
    		desFileEncrypt.decrypt(outFilePath[0]);  //解密第一个文件平且测试解密后的结果
    	}
    }
    
    
    


  • 相关阅读:
    课后作业 学号15100457
    开学第一课
    20180320作业2:进行代码复审训练
    20180320作业1:源代码管理工具调查
    软工作业PSP与单元测试训练
    构建之法 完成教材第一章P18第4题
    第一天上课 创建博客
    进行代码复审训练
    源代码管理工具调查
    软工作业PSP与单元测试训练
  • 原文地址:https://www.cnblogs.com/springskyhome/p/3689927.html
Copyright © 2011-2022 走看看