Encrypt decrypt files example

Click here to download eclipse supported ZIP file



This is input.properties properties file and these properties are used in the application.




plain.files.location=/inputFiles/
key.file.location=/keyFile/
encrypted.files.location=/encryptedFiles/
decrypted.files.location=/decryptedFiles/
lastDaysToUpdate = 1
ELEMENT_VALUES=property


This is CryptoUtils.java file having the source code to execute business logic.



 

    
package com.cv.java.enc;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import org.apache.log4j.Logger;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 @author Chandra Vardhan
 */
public class CryptoUtils {
  private static final Logger LOGGER = Logger.getLogger(CryptoUtils.class);
  public static String process(final String input, final String algorithm, final String actionModethrows Exception {
    LOGGER.info("IN process( - - -)");
    int mode;
    // add a BouncyCastle provider
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    // mode
    if (actionMode.equals("enc")) {
      mode = Cipher.ENCRYPT_MODE;
    else if (actionMode.equals("dec")) {
      mode = Cipher.DECRYPT_MODE;
    else {
      return null;
    }

    // Generate a key
    Key key = null;
    ByteArrayInputStream bis = null;
    CipherOutputStream cos = null;
    ObjectInputStream secKeyFile = null;
    ByteArrayOutputStream bos = null;
    try {
      String keyFileLocation = ReadFiles.getKeyFileLocation();
      if (keyFileLocation != null) {
        File file = new File(keyFileLocation);
        if(!file.exists()) {
          file.mkdirs();
        }        
      }
      File file = new File(keyFileLocation+ "crypto_key.ser");
      if (file != null) {
        if (!file.exists()) {
          ObjectOutputStream keyFile = null;
          try {
            KeyGenerator keygen = KeyGenerator.getInstance(algorithm, "BC");
            keygen.init(new SecureRandom());
            key = keygen.generateKey();
            keyFile = new ObjectOutputStream(new FileOutputStream(file));
            keyFile.writeObject(key);
          catch (NoSuchAlgorithmException ex) {
            LOGGER.error(algorithm + " key generator not found.");
            System.exit(0);
          catch (IOException ex) {
            LOGGER.error("Error saving key.");
            System.exit(0);
          finally {
            if (keyFile != null) {
              keyFile.close();
            }

          }
        }
      }
      // Does a cryptoKey.ser file exist?
      secKeyFile = new ObjectInputStream(new FileInputStream(file));
      key = (KeysecKeyFile.readObject();
      Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding""BC");
      cipher.init(mode, key);
      bos = new ByteArrayOutputStream();

      if (mode == Cipher.DECRYPT_MODE) {
        BASE64Decoder decoder = new BASE64Decoder();
        bis = new ByteArrayInputStream(decoder.decodeBuffer(input));
      else {
        bis = new ByteArrayInputStream(input.getBytes());
      }
      cos = new CipherOutputStream(bos, cipher);
      int length = 0;
      byte[] buffer = new byte[8192];
      while ((length = bis.read(buffer)) != -1) {
        cos.write(buffer, 0, length);
      }

      if (mode == Cipher.ENCRYPT_MODE) {
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(bos.toByteArray());
      else {
        return bos.toString();
      }
    catch (Exception e) {
      e.printStackTrace();
      LOGGER.error("Error reading key.");
      System.exit(0);
    finally {
      if (bis != null) {
        bis.close();
      }
      if (bos != null) {
        bos.close();
      }
      if (cos != null) {
        cos.close();
      }
      if (secKeyFile != null) {
        secKeyFile.close();
      }
    }
    LOGGER.info("OUT process( - - -)");
    return null;

  }
}


This is MainDecrypt.java file having the source code to execute business logic.



 

    
package com.cv.java.enc;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import org.apache.log4j.Logger;

/**
 @author Chandra Vardhan
 */

public class MainDecrypt {

  private static final Logger LOGGER = Logger.getLogger(MainDecrypt.class);

  private static final String REG_EX1 = "##$#";

  private static final String REG_EX2 = "$$#$";

  public static void main(String[] args) {
    
    LOGGER.info("IN main(-)");
    ReadFiles readFiles = new ReadFiles();
    String encFileDirectory = ReadFiles.getEncFileDirectory();
    File encFile =  new File(encFileDirectory);
    if(encFile != null) {
      if(!encFile.exists()) {
        encFile.mkdirs();
      }
    }
    List<String> latestDaysUpdatedFiles = readFiles.getLatestDaysUpdatedFiles(
        new File(encFileDirectory), Integer.parseInt(ReadFiles.getLastDaysToUpdate()));
    LOGGER.info("Size of the files for decryption : : "+ latestDaysUpdatedFiles.size());
    for (String latestUpdatedFile : latestDaysUpdatedFiles) {
      File file = new File(latestUpdatedFile);
      BufferedReader br = null;
      PrintWriter pw = null;
      try {
        StringBuffer sb = new StringBuffer();
        br = new BufferedReader(new FileReader(file));
        String line = "";
        do {
          sb.append(line);
          sb.append("\n");
        while ((line = br.readLine()) != null);

        String plainText = CryptoUtils.process(sb.toString()"AES""dec");
        if (plainText != null) {

          plainText = plainText.substring(plainText.lastIndexOf(REG_EX1+ REG_EX1.length(),
              plainText.indexOf(REG_EX2));
        }
        String plainFileDirectory = ReadFiles.getDecFileDirectory();
        File file2 =  new File(plainFileDirectory);
        if(file2 != null) {
          if(!file2.exists()) {
            file2.mkdirs();
          }
        }
        
        pw = new PrintWriter(new FileWriter(plainFileDirectory+ "\\" + file.getName()));
        
        pw.write(RegExUtils.modifyInformation(plainText));
        pw.flush();
      // end try
      catch (Exception e) {
        LOGGER.info("Problem while decrypting, file name is ::" + file.getAbsolutePath());
        e.printStackTrace();
      // end catch
      finally {
        if (br != null) {
          try {
            br.close();
          catch (IOException e) {
            e.printStackTrace();
          }
        }
        if (pw != null) {
          pw.close();
        }
      }
      LOGGER.info("OUT main(-)");
    }
  }

  
}


This is MainEncrypt.java file having the source code to execute business logic.



 

    
package com.cv.java.enc;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

/**
 @author Chandra Vardhan
 */

public class MainEncrypt {

  private static final Logger LOGGER = Logger.getLogger(MainEncrypt.class);

  private static final String START_STRING = "#$##Starting##$#";

  private static final String END_STRING = "$$#$Ending$#$$";

  public static void main(String[] args) {
    LOGGER.info("IN main(-");
    ReadFiles readFiles = new ReadFiles();
    String plainFileDirectory = ReadFiles.getPlainFileDirectory();
    File plainFile = new File(plainFileDirectory);
    if (plainFile != null) {
      if (!plainFile.exists()) {
        plainFile.mkdirs();
      }
    }

    List<String> resultFileList = readFiles.getResultFileList();
    if (resultFileList != null && !resultFileList.isEmpty()) {
      readFiles.setResultFileList(new ArrayList<String>());
    }
    List<String> latestDaysUpdatedFiles = readFiles.getLatestDaysUpdatedFiles(new File(plainFileDirectory),
        Integer.parseInt(ReadFiles.getLastDaysToUpdate()));
    LOGGER.info("Files count for encryption : : " + latestDaysUpdatedFiles.size());
    for (String latestUpdatedFile : latestDaysUpdatedFiles) {
      File file = new File(latestUpdatedFile);
      BufferedReader br = null;
      PrintWriter pw = null;
      try {
        StringBuffer sb = new StringBuffer();
        br = new BufferedReader(new FileReader(file));
        String line = "";
        sb.append(START_STRING);
        sb.append("\n");
        while ((line = br.readLine()) != null) {
          sb.append(line);
          sb.append("\n");
        }
        String palinText = sb.toString();
        String result = null;
        if (palinText.contains("http"|| palinText.contains("xmlns"||palinText.contains("property")) {
          sb.append(END_STRING);
          sb.append("\n");
          sb.append(END_STRING);
          sb.append("\n");
          sb.append(END_STRING);
          sb.append("\n");
          result = CryptoUtils.process(sb.toString()"AES""enc");
        else {
          if (palinText != null) {
            String res = palinText.substring(START_STRING.length(), palinText.length());
            result = res;
          }
        }
        String encFileDirectory = ReadFiles.getEncFileDirectory();
        File encFile = new File(encFileDirectory);
        if (encFile != null) {
          if (!encFile.exists()) {
            encFile.mkdirs();
          }
        }

        pw = new PrintWriter(new FileWriter(encFile+"/"+file.getName()));
        pw.write(result);
        pw.flush();
      // end try
      catch (Exception e) {
        e.printStackTrace();
      // end catch
      finally {
        if (br != null) {
          try {
            br.close();
          catch (IOException e) {
            e.printStackTrace();
          }
        }
        if (pw != null) {
          pw.close();
        }
      }
    }

  }
}


This is ReadFiles.java file having the source code to execute business logic.



 

    
package com.cv.java.enc;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;

/**
 @author Chandra Vardhan
 */

public class ReadFiles {
  
  private static final Logger LOGGER = Logger.getLogger(ReadFiles.class);

  static Properties readPropertiesFile = new Properties();
  private static String plainFileDirectory = null;
  private static String encFileDirectory = null;
  private static String decFileDirectory = null;
  private static String lastDaysToUpdate = null;
  private static String keyFileLocation = null;
  private static String tagValues = "";
  private static final String USER_DIR = System.getProperty("user.dir");
  private List<String> resultFileList = new ArrayList<String>();

  static {

    readPropertiesFile = readPropertiesFile();
    setValues(readPropertiesFile);

  }

  private static void setValues(Properties readPropertiesFile2) {

    if (readPropertiesFile2 != null) {
      plainFileDirectory = readPropertiesFile2.getProperty("plain.files.location");
      encFileDirectory = readPropertiesFile2.getProperty("encrypted.files.location");
      decFileDirectory = readPropertiesFile2.getProperty("decrypted.files.location");
      lastDaysToUpdate = readPropertiesFile2.getProperty("lastDaysToUpdate");
      keyFileLocation = readPropertiesFile2.getProperty("key.file.location");
      tagValues = readPropertiesFile2.getProperty("ELEMENT_VALUES");
      }

  }

  private static Properties readPropertiesFile() {
    Properties props = new Properties();
    try {
      props.load(ReadFiles.class.getClassLoader().getResourceAsStream("input.properties"));
    catch (Exception e) {
      LOGGER.info("Problem while reading properties file!!!");
    }
    return props;
  }

  

  public List<String> getLatestDaysUpdatedFiles(final File directory, final int lastDays) {

    if (directory != null) {
      File[] listFiles = directory.listFiles();
      if (listFiles != null) {
        for (File file : listFiles) {
          if (file != null) {
            if (file.isDirectory()) {
              getLatestDaysUpdatedFiles(file, lastDays);
            else {
              Calendar calendar = Calendar.getInstance();
              calendar.add(Calendar.DAY_OF_MONTH, -lastDays);
              long diffInDays = getDateDiff(calendar.getTime()new Date(file.lastModified()), TimeUnit.DAYS);
              if (Math.abs(diffInDays1) {
                resultFileList.add(file.getAbsolutePath());
              }
            }

          }

        }
      }
    }
    return resultFileList;
  }

  public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
  }

  public static String getLastDaysToUpdate() {
    return lastDaysToUpdate;
  }

  public static void setLastDaysToUpdate(String lastDaysToUpdate) {
    ReadFiles.lastDaysToUpdate = lastDaysToUpdate;
  }

  public static String getPlainFileDirectory() {
    return USER_DIR+plainFileDirectory;
  }

  public static void setPlainFileDirectory(String plainFileDirectory) {
    ReadFiles.plainFileDirectory = plainFileDirectory;
  }

  public static String getEncFileDirectory() {
    return USER_DIR+encFileDirectory;
  }

  public static void setEncFileDirectory(String encFileDirectory) {
    ReadFiles.encFileDirectory = encFileDirectory;
  }

  public static String getDecFileDirectory() {
    return USER_DIR+decFileDirectory;
  }

  public static void setDecFileDirectory(String decFileDirectory) {
    ReadFiles.decFileDirectory = decFileDirectory;
  }

  public static String getKeyFileLocation() {
    return USER_DIR+keyFileLocation;
  }

  public static void setKeyFileLocation(String keyFileLocation) {
    ReadFiles.keyFileLocation = keyFileLocation;
  }

  public static String getTagValues() {
    return tagValues;
  }

  public static void setTagValues(String tagValues) {
    ReadFiles.tagValues = tagValues;
  }

  public List<String> getResultFileList() {
    return resultFileList;
  }

  public void setResultFileList(List<String> resultFileList) {
    this.resultFileList = resultFileList;
  }

}


This is RegExUtils.java file having the source code to execute business logic.



 

    
package com.cv.java.enc;


import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;

/**
 @author Chandra Vardhan
 */
public class RegExUtils {
  private static final Logger LOGGER = Logger.getLogger(RegExUtils.class);
  private static final String SPECIFIC_REGEX = "(\\b(?:\\d[ -xX]*?){16}\\b)";
  private static final String GENERIC_REGEX = "(\\b\\d{16}\\b)";
  private static Map<String, Pattern> Patterns = new HashMap<String, Pattern>();
  static {
    preparePatterns();
  }
  
  private static void preparePatterns() {
    
    LOGGER.debug("IN preparePatterns()");
    
    String TagValues = ReadFiles.getTagValues();
    if (TagValues != null) {
      String[] values = TagValues.split(",");
      for (String temp : values) {
        final String regEx = "<" + temp + ">" + SPECIFIC_REGEX + "</" + temp + ">";
        final Pattern pattern = Pattern.compile(regEx);
        Patterns.put(temp, pattern);
      }
      final Pattern pattern = Pattern.compile(GENERIC_REGEX);
      Patterns.put("generic", pattern);

    }
    LOGGER.debug("OUT preparePatterns()");

  }
  public static String modifyInformation(String plainText) {
    LOGGER.debug("IN modifyInformation(-)");
    String res = plainText;
    if (plainText != null) {
      for (Entry<String, Pattern> entry : Patterns.entrySet()) {
        final Pattern pattern = entry.getValue();
        Matcher matcher = pattern.matcher(plainText);
        try {
        if(matcher != null && matcher.find()) {
          String grp1 = matcher.group(1);
          if(grp1 != null) {
            res = res.replaceAll(grp1, "XXXXXXXXXXXX");
          }
          
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
    }
    LOGGER.debug("OUT modifyInformation(-)");
    return res;
  }
  public static Map<String, Pattern> getPatterns() {
    return Patterns;
  }

  public static void setPatterns(Map<String, Pattern> Patterns) {
    RegExUtils.Patterns = Patterns;
  }
  
  
  
}


This is pom.xml file having the entries of dependency jars and information to build the application .



	
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cv.java.enc</groupId> <artifactId>EncryptDecryptFiles</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-bundle</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>EncryptDecryptFiles</finalName> </build> </project>


This is log4j.properties file having the entries for logging the information into the console/file.




#By default enabling Console appender
# Root logger option
log4j.rootLogger=INFO, stdout

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p [%c]:%L -->> %m%n

# Redirect log messages to a log file
#log4j.appender.file=org.apache.log4j.RollingFileAppender
#log4j.appender.file.File=C:\servlet-application.log
#log4j.appender.file.MaxFileSize=5MB
#log4j.appender.file.MaxBackupIndex=10
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

No comments:

Post a Comment