JAVA 实现磁盘文件加解密操作的示例代码

简单实现了下:

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;

/**
 * 文件/目录加解密相关
 * @author: Nemo
 * @date: 2019/3/19.
 */
public class FileCrote {

  /**
   * 加密后的文件后缀
   */
  private static final String SUBFIX = ".enc";

  /**
   * 执行路径
   */
  private static String path = "";

  /**
   * 执行模式 1加密 2解密
   */
  private static String mode = "1";

  /**
   * 执行密码
   */
  private static String pass = "";

  private static String currentFilePath = null;

  /**
   * 根据路径加密文件
   * 1、如果是目录,则找它下面的文件进行加密
   * 2、如果是文件,则直接加密
   * @param path
   * @throws IOException
   */
  private static void encrypt(String path) throws IOException, GeneralSecurityException {
    System.out.println("开始处理"+path);
    File file = new File(path);
    if(!file.exists()){
      System.out.println("需加密的路径不存在:"+path);
      return;
    }
    if(file.isDirectory()){
      //目录则遍历其下的文件
      File[] files = file.listFiles();
      if(files == null){
        return;
      }
      for (File subFile : files) {
        encrypt(subFile.getAbsolutePath());
      }
    }else{
      //文件则直接加密
      encrypt(file);
    }
  }

  /**
   * 文件加密
   * @param file
   * @throws IOException
   */
  private static void encrypt(File file) throws IOException, GeneralSecurityException {
    String path = file.getAbsolutePath();
    if(path.endsWith(SUBFIX)){
      System.out.println("已加密文件不需再次加密"+path);
      return;
    }

    String encFilePath = path + SUBFIX;
    File encFile = new File(encFilePath);

    System.out.println("开始加密文件"+path);
    encryptFile(file,encFile,Cipher.ENCRYPT_MODE);
  }

  /**
   * 加解密文件操作
   * @param srcFile
   * @param encFile
   * @throws IOException
   */
  private static void encryptFile(File srcFile, File encFile,int mode) throws IOException, GeneralSecurityException {
    if(!srcFile.exists()){
      System.out.println("source file not exixt");
      return;
    }

    currentFilePath = srcFile.getAbsolutePath();

    //密码
    Cipher cipher = getCipher(mode);

    FileInputStream fis = null;
    FileOutputStream fos = null;
    try {
      fis = new FileInputStream(srcFile);
      fos = new FileOutputStream(encFile);

      //真正处理
      crypt(fis, fos, cipher);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (fis != null) {
        fis.close();
      }
      if (fos != null) {
        fos.close();
      }
    }

    //源文件删除
    srcFile.delete();
  }

  /**
   * 得到加解密Cipher
   * @param mode
   * @return
   * @throws GeneralSecurityException
   */
  private static Cipher getCipher(int mode) throws GeneralSecurityException {
    String type = "AES";
    Cipher cipher = Cipher.getInstance(type+"/ECB/PKCS5Padding");
    KeyGenerator kgen = KeyGenerator.getInstance(type);
    kgen.init(128, new SecureRandom(pass.getBytes()));
    SecretKey key = kgen.generateKey();
    cipher.init(mode,key);
    return cipher;
  }

  /**
   * 加密解密流
   * @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);
  }

  /**
   * 根据路径解密
   * 1、如果是目录,则找它下面的加密文件进行解密
   * 2、如果是文件,并且它是加密文件,则直接解密
   * @param path
   * @throws IOException
   */
  private static void decrypt(String path) throws IOException, GeneralSecurityException {
    System.out.println("开始处理"+path);
    File file = new File(path);
    if(!file.exists()){
      System.out.println("需解密的路径不存在:"+path);
      return;
    }
    if(file.isDirectory()){
      //目录则遍历其下的文件
      File[] files = file.listFiles();
      if(files == null){
        return;
      }
      for (File subFile : files) {
        decrypt(subFile.getAbsolutePath());
      }
    }else{
      decrypt(file);
    }
  }

  /**
   * 文件解密
   * @param file
   * @throws IOException
   */
  private static void decrypt(File file) throws IOException, GeneralSecurityException {
    String path = file.getAbsolutePath();
    if(!path.endsWith(SUBFIX)){
      System.out.println("非加密文件不需解密"+path);
      return;
    }
    System.out.println("开始解密文件"+path);

    String newPath = path.substring(0,path.length() - SUBFIX.length());
    encryptFile(file,new File(newPath),Cipher.DECRYPT_MODE);
  }

  /**
   * 字符串是否非空
   * @param s
   * @return
   */
  private static boolean isNotEmpty(String s){
    if (s == null || "".equals(s)) {
      return false;
    }
    return true;
  }

  /**
   * 开始处理
   * @throws IOException
   * @throws GeneralSecurityException
   */
  private static void deal() throws IOException, GeneralSecurityException {
    while (true) {
      print();
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      String s = reader.readLine();
      if("path".equals(s)) {
        System.out.println("\r\n请输入执行路径\r\n");
        while (true) {
          reader = new BufferedReader(new InputStreamReader(System.in));
          s = reader.readLine();
          if (!isNotEmpty(s)) {
            System.out.println("\r\n请输入执行路径\r\n");
            continue;
          }else {
            File file = new File(s);
            if(!file.exists()){
              System.out.println("\r\n该路径不存在,请重新输入\r\n");
              continue;
            }
          }
          path = s;
          break;
        }
      } else if("pass".equals(s)) {
        System.out.println("\r\n请输入加/解密密码\r\n");
        while (true) {
          reader = new BufferedReader(new InputStreamReader(System.in));
          s = reader.readLine();
          if (!isNotEmpty(s)) {
            System.out.println("\r\n请输入加/解密密码\r\n");
            continue;
          }
          pass = s;
          break;
        }
      } else if ("1".equals(s)) {
        mode = s;
        System.out.println("\r\n当前已选模式:加密\n");
      } else if ("2".equals(s)) {
        mode = s;
        System.out.println("\r\n当前已选模式:解密\r\n");
      }else if("start".equals(s)){
        if(!isNotEmpty(path)) {
          System.out.println("\r\n请输入加/解密密码再开始\r\n");
          continue;
        }

        if(!isNotEmpty(pass)) {
          System.out.println("\r\n请输入执行路径后再开始\r\n");
          continue;
        }

        if ("1".equals(mode)) {
          encrypt(path);
          System.out.println("\r\n\r\n操作完成\r\n\r\n");
        } else {
          try {
            decrypt(path);
            System.out.println("\r\n\r\n操作完成\r\n\r\n");
          }catch (BadPaddingException e) {
            System.out.println("文件:"+currentFilePath+"解密失败,密码错误");
          }
        }
      }else if("quit".equals(s)){
        System.exit(-1);
      } else {
        System.out.println("\r\n输入错误\r\n");
      }
    }
  }

  /**
   * 输出提示语
   */
  private static void print(){
    System.out.println("\r\n" +
        "输入path开始选择执行路径\r\n" +
        "输入pass开始选择加/解密密码\r\n" +
        "输入如下数字以选择处理模式:1 加密 2 解密\r\n" +
        "输入start则开始执行已选操作\r\n" +
        "输入quit则退出程序\r\n" +
        "当前选择路径:"+path+"\r\n" +
        "当前选择模式:"+mode+"\r\n" +
        "当前选择密码:"+pass+"\r\n");
  }

  public static void main(String args[]) throws IOException, GeneralSecurityException {
    deal();
  }

}

以上就是JAVA 实现磁盘文件加解密操作的示例代码的详细内容,更多关于Java 文件加解密的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

    Java中使用OpenSSL生成的RSA公私钥进行数据加解密 RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.目前该加密方式广泛用于网上银行.数字签名等场合.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困

  • java使用Base64实现文件加密解密

    本文实例为大家分享了Java实现Base64给文件加密.解密的具体代码,供大家参考,具体内容如下 package test.base64; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder;

  • java实现仿射密码加密解密

    本文实例为大家分享了java实现仿射密码加密解密的具体代码,供大家参考,具体内容如下 加密:将明文转化为对应的数字,如 'a'-> 0, 'b'->1,-,'1'->26,'2'->27,-然后将数字进行仿射运算,求取出来的数字再转化为字符.即 密文=(K1*明文+K2)mod36 解密:密文转化为对应数字,然后进行仿射的逆运算,得到对应数字,然后将其转化为字符明文.解密 K3是K1的乘法逆元 import java.util.Scanner; public class Affin

  • Java加解密技术系列之RSA详解

    距离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项目太紧,具体的就不多说了.今天来说说非对称加密真的是太重要了,我们的日常生活中,都离不开非对称加密. 概念 在说 RSA 之前,首先聊聊什么是非对称加密.在讲对称加密的时候,就曾经说过,对称加密算法在加密和解密时使用的是同一个秘钥,加解密双方必须使用同一个密钥才能进行正常的沟通.而非对称加密则不然,非对称加密算法需要两个密钥来进行加密和解密,分别是公钥和私钥. 需要注意的一点,这个公钥和私钥必须是

  • Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package com.lyz.base.des; import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c) 2015 * @author liuyazhuang * @see DE

  • Java实现AES/CBC/PKCS7Padding加解密的方法

    最近项目需要选择一套对称加密算法,来满足前后端之间的加解密操作.初步打算前端使用crypto-js来实现,后端使用java本身的加密算法实现,但遇到了一个问题:java本身只支持NoPadding和PKCS5Padding,而crypto-js提供的padding方式没有PKCS5Padding,所以不得以,前后端最终使用PKCS7Padding来实现功能.因此只能通过引入第三方jar包的方式让jave支持pkcs7padding 引入依赖 <dependency> <groupId&g

  • java加解密RSA使用方法代码示例

    最近为了分析一段请求流,不得不去研究一下RSA加密. 首先,强调一点:密钥的"钥"读"yue",不是"yao",额... 网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解: 1. 两个足够大的互质数p, q: 2. 用于模运算的模 n=p*q: 3. 公钥KU(e, n)中的e满足 1<e< (p-1)(q-1),且与(p-1)(q-1)互质: 4. 密钥KR(d, n)中的d满足  d*e % (p-1)(q-1)= 1,

  • java实现置换密码加密解密

    本文实例为大家分享了Java实现置换密码加密解密,供大家参考,具体内容如下 思路 置换密码只不过是简单的换位而已,这里写的是一个分组长度为7的置换密码因为所学知识有限,写的比较麻烦,这里先简单介绍一下思路: 1.因为置换密码首先要将其进行分组,这里分组长度为7,不足的位数补0,可以选取二维数组进行操作,定义二维数组,明文有多少个分组二维数组中就有多少个一维数组,其中一维的长度就是分组长度 2.定义一个一维数组key作为加密用的秘钥,一个一维数组trankey作为解密秘钥,这里其中的元素是自己写的

  • java使用RSA与AES加密解密的实例代码详解

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA •先看代码(先会用在研究) 相关依赖: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.58</versio

  • 详细分析JAVA加解密算法

    加解密算法分析 日常开发中,无论你是使用什么语言,都应该遇到过使用加解密的使用场景,比如接口数据需要加密传给前端保证数据传输的安全:HTTPS使用证书的方式首先进行非对称加密,将客户端的私匙传递给服务端,然后双方后面的通信都使用该私匙进行对称加密传输:使用MD5进行文件一致性校验,等等很多的场景都使用到了加解密技术. 很多时候我们对于什么时候要使用什么样的加解密方式是很懵的.因为可用的加解密方案实在是太多,大家对加解密技术的类型可能不是很清楚,今天这篇文章就来梳理一下目前主流的加解密技术,本篇文

  • Java实现DES加解密算法解析

    本文实例讲述了Java实现DES加解密算法解析.分享给大家供大家参考,具体如下: 简介: 数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款机(Automated Teller Machine,ATM)都使用DEA.它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而

随机推荐