package org.foo.bar;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringWriter;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class FcUtil {
private static final String UTF8 = "utf-8";
private static SecretKey getKey(String alg, String pass) {
try {
KeyGenerator keyGen = KeyGenerator.getInstance("Rijndael");
keyGen.init(new SecureRandom(pass.getBytes(UTF8)));
return keyGen.generateKey();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static Cipher getCipher(String alg, String pass) {
try {
Cipher cipher = Cipher.getInstance(alg);
cipher.init(Cipher.ENCRYPT_MODE, getKey(alg, pass));
return cipher;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void encrypt(Cipher cipher, InputStream is, OutputStream os) {
try {
byte[] buffer = new byte[1024 * 1024];
CipherOutputStream cos = new CipherOutputStream(os, cipher);
int read = -1;
int count = 10;
while ( (read = is.read(buffer) ) > 0 ) {
cos.write(buffer, 0, read);
if ( --count < 0 ) {
count = 10;
cos.flush();
}
} // endwhile
is.close();
cos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String rev(String str) {
char[] chars = str.toCharArray();
int l = chars.length, n = l >> 1;
char c;
for (int i = 0; i < n; i++ ) {
c = chars[(b = l-i)];
chars[b] = chars[i];
chars[i] = c;
}
return new String(chars);
}
private static byte[] processText(File file) {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(file), UTF8));
ArrayList<String> list = new ArrayList<String>();
StringBuilder b = new StringBuilder();
String buf = null;
while ( (buf = br.readLine()) != null ) {
b.delete(0, b.length());
list.add(b.insert(0, buf).reverse().toString());
}
Collections.reverse(list);
br.close();
int count = 10;
StringWriter sw = new StringWriter();
for (String s : list) {
sw.write(s);
sw.write('\n');
if ( --count < 0 ) {
count = 10;
sw.flush();
}
}
sw.close();
return sw.getBuffer().toString().getBytes(UTF8);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ByteArrayInputStream processText(InputStream is) {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(is, UTF8));
ArrayList<String> list = new ArrayList<String>();
StringBuilder b = new StringBuilder();
String buf = null;
while ( (buf = br.readLine()) != null ) {
b.delete(0, b.length());
list.add(b.insert(0, buf).reverse().toString());
}
Collections.reverse(list);
br.close();
int count = 10;
StringWriter sw = new StringWriter();
for (String s : list) {
sw.write(s);
sw.write('\n');
if ( --count < 0 ) {
count = 10;
sw.flush();
}
}
sw.close();
return new ByteArrayInputStream(sw.getBuffer().toString().getBytes(UTF8));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static ByteArrayInputStream readFully(File file) {
try {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 1024];
int read = -1;
while ( (read = fis.read(buffer)) > 0 ) {
baos.write(buffer, 0, read);
}
fis.close();
baos.close();
return new ByteArrayInputStream(baos.toByteArray());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void transferFully(InputStream is, OutputStream os) {
try {
byte[] buffer = new byte[1024 * 1024];
int read = -1;
int count = 10;
while ( (read = is.read(buffer)) > 0 ) {
os.write(buffer, 0, read);
if ( --count < 0 ) {
count = 10;
os.flush();
}
}
is.close();
os.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void process(Cipher cipher, File file) {
if ( file.isDirectory() ) {
return;
}
HashSet<String> textExt = new HashSet<String>() {{
add("txt");
add("java");
add("properties");
add("xml");
add("bat");
add("sh");
add("jsp");
add("html");
add("tld");
add("js");
add("css");
add("dtd");
add("xsd");
add("sql");
add("ddl");
}};
try {
String ext = file.getName().substring(file.getName().lastIndexOf('.')+1).toLowerCase();
if ( textExt.contains(ext) ) {
// encrypt
ByteArrayInputStream bis = new ByteArrayInputStream(processText(file));
encrypt(cipher, bis, new FileOutputStream(file));
// decrypt
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// encrypt(cipher, readFully(file), baos);
// transferFully(processText(new ByteArrayInputStream(
// baos.toByteArray())), new FileOutputStream(file));
} else {
// encrypt & decrypt
ByteArrayInputStream bis = readFully(file);
encrypt(cipher, bis, new FileOutputStream(file));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void handleDir(Cipher cipher, File dir) {
long start = System.currentTimeMillis();
FileFilter fileFilter = new FileFilter() {
HashSet<String> encExt = new HashSet<String>() {{
add("txt");
add("java");
add("properties");
add("xml");
add("bat");
add("sh");
add("jsp");
add("html");
add("tld");
add("js");
add("css");
add("dtd");
add("xsd");
add("sql");
add("ddl");
add("doc");
add("xls");
add("ppt");
add("pps");
add("pdf");
add("pst");
}};
public boolean accept(File pathname) {
String ext = pathname.getName().substring(pathname.getName().lastIndexOf('.')+1).toLowerCase();
return pathname.isFile() && encExt.contains(ext);
}
};
FileFilter dirFilter = new FileFilter() {
HashSet<String> exclude = new HashSet<String>() {{
add(".svn");
add("cvs");
add(".hg");
}};
public boolean accept(File pathname) {
return pathname.isDirectory() && !exclude.contains(pathname.getName().toLowerCase()) && pathname.getName().indexOf('.') != 0;
}
};
File[] files = dir.listFiles(fileFilter);
for (File file : files) {
// System.out.println(file.getAbsolutePath());
process(cipher, file);
}
File[] dirs = dir.listFiles(dirFilter);
handleDirs(cipher, dirs);
// System.out.println(dir.getAbsolutePath() + "[" + (System.currentTimeMillis() - start) + "ms]");
}
private static void handleDirs(Cipher cipher, File[] dirs) {
for (File dir : dirs) {
handleDir(cipher, dir);
}
}
public static void main(String[] args) {
final String alg = "Rijndael";
if ( args.length != 2 ) {
System.out.println("error");
return;
}
final String key = args[0];
try {
Cipher cipher = getCipher(alg, key);
// cipher.init(Cipher.DECRYPT_MODE, getKey(alg, key));
final File file = new File(args[1]);
handleDir(cipher, file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Thursday, February 28, 2008
Java Encryption
I was working on a project that required some encryption. So, I had some time to play around with the javax.crypto api. Here is a small utility which plays around with text files before encryption.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment