上传与下载文件加密

对称加密算法使用详解

1、加密算法类型

AES DES 3DES (黑色字体的为常用算法)

2、具体使用

  2.1 DES算法

package web;

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.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class DESUtil {
    
    
    /**
     * 1.定义密码字符串
     */
    private static String SECRET = "!QAZ@WSX";
    
    /**
     * 2.定义算法类型
     */
    private static String DES = "DES";
    
    /**
     * 3.根据密码字符串生成加密所需秘钥
     * @throws NoSuchAlgorithmException 
     */
    public static Key getKey(String secretStr) throws NoSuchAlgorithmException {
        KeyGenerator generator = KeyGenerator.getInstance(DES);
        generator.init(new SecureRandom(secretStr.getBytes()));
        SecretKey key = generator.generateKey();
        return key;
    }
    
    /**
     * 4.加密
     * @throws NoSuchAlgorithmException 
     * @throws NoSuchPaddingException 
     * @throws InvalidKeyException 
     * @throws IOException 
     */
    public static void encDES(File srcFile, File destFile) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
        if(null == srcFile) {
            System.out.println("文件不存在!");
            return;
        }
        
        // 获取cipher对象  用于加密解密
        Key key = getKey(SECRET);
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 注:DES 需要填充方式
        cipher.init(Cipher.ENCRYPT_MODE,key);    // 加密是为ENCRYPT_MODE

        InputStream is = new FileInputStream(srcFile); // 待加密流
        CipherInputStream cis = new CipherInputStream(is, cipher); // 加密流
        OutputStream os = new FileOutputStream(destFile);
        int readLength = 0;
        while ( (readLength = cis.read()) != -1) {
            os.write(readLength);
        }
        os.flush();
        os.close();
        is.close();
        cis.close();
    }
    
    /**
     * 5.解密
     */
    public static void decDES(File srcFile, File destFile) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
        // 获取cipher对象  用于加密解密
        Key key = getKey(SECRET);
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 注:DES方式需要填充
        cipher.init(Cipher.DECRYPT_MODE,key);    // 加密是为DECRYPT_MODE
        
        InputStream is = new FileInputStream(srcFile); // 加密流
        CipherInputStream cis = new CipherInputStream(is, cipher); // 解密流 
        
        // 解密文件
        OutputStream os = new FileOutputStream(destFile);
        byte[] bys = new byte[1024];
        int readLength = 0;
        while ( (readLength=cis.read(bys)) != -1) {
            os.write(bys, 0, readLength);
        }
        os.flush();
        os.close();
        is.close();
        cis.close();
    }
}

  

  2.2 AES算法

package web;

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 java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class AESUtil {
    /**
     * 1.定义密码字符串
     */
    private static String SECRET = "!QAZ@WSX"; //任一字符串
    
    /**
     * 2.定义算法类型
     */
    private static String AES = "AES";
    
    /**
     * 3.获取加密秘钥
     * @throws NoSuchAlgorithmException 
     */
    private static Key getKey(String secretStr) throws NoSuchAlgorithmException {
        KeyGenerator genertor = KeyGenerator.getInstance(AES);
        genertor.init(128,new SecureRandom(secretStr.getBytes())); // 128 256...
        SecretKey key = genertor.generateKey();
        return key;
    }
    
    /**
     * 4.加密解密流文件(主要方法)
     */
    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);
    }
    
    /**
     * 5.加密
     * @throws GeneralSecurityException 
     * @throws IOException 
     */
    public static void encAES(File srcFile, File destFile) throws IOException, GeneralSecurityException {
        // 获取cipher对象  用于加密解密
        Key key = getKey(SECRET);
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // 注:AES需要填充方式
        cipher.init(Cipher.ENCRYPT_MODE,key);    // 加密是为ENCRYPT_MODE
        
        InputStream is = new FileInputStream(srcFile);
        OutputStream os = new FileOutputStream(destFile);
        crypt(is, os, cipher);
        os.close();
        is.close();
    }
    
    /**
     * 6.解密
     * @throws GeneralSecurityException 
     * @throws IOException 
     */
    public static void decAES(File srcFile, File destFile) throws IOException, GeneralSecurityException {
        // 获取cipher对象  用于加密解密
        Key key = getKey(SECRET);
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // 注:AES需要填充方式
        cipher.init(Cipher.DECRYPT_MODE,key);    // 加密是为ENCRYPT_MODE
        
        InputStream is = new FileInputStream(srcFile);
        OutputStream os = new FileOutputStream(destFile);
        crypt(is, os, cipher);
        os.close();
        is.close();
    }
posted @ 2017-12-04 17:48  柒陆零柒伍伍柒玖零  阅读(1963)  评论(0编辑  收藏  举报