diff --git a/pom.xml b/pom.xml index de00545..0314c72 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ tcrypt - ch.n1b.tcrypt.App + ch.n1b.tcrypt.AppDirectContent 1.8 1.8 UTF-8 @@ -36,6 +36,12 @@ + + commons-codec + commons-codec + 1.9 + + org.hamcrest hamcrest-junit @@ -86,6 +92,23 @@ + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + + + package + + shade + + + + + diff --git a/src/main/java/ch/n1b/tcrypt/AppDirectContent.java b/src/main/java/ch/n1b/tcrypt/AppDirectContent.java new file mode 100644 index 0000000..9710266 --- /dev/null +++ b/src/main/java/ch/n1b/tcrypt/AppDirectContent.java @@ -0,0 +1,59 @@ +package ch.n1b.tcrypt; + +import ch.n1b.tcrypt.cryptor.AesGcmCryptor; +import org.apache.commons.codec.binary.Base64; + +public final class AppDirectContent { + + private static final String UNICODE_FORMAT = "UTF8"; + + private static final AesGcmCryptor CRYPTOR = new AesGcmCryptor(); + + public static void main(String[] args) { + + if (args.length != 3) { + printUsage(); + return; + } + + final String mode = args[0]; + final String password = args[1]; + final String data = args[2]; + + if ("encode".equals(mode)) { + System.out.println(encrypt(password, data)); + return; + } + + if ("decode".equals(mode)) { + System.out.println(decrypt(password, data)); + return; + } + + printUsage(); + } + + private static String encrypt(final String password, final String unencryptedString) { + try { + byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT); + byte[] encryptedText = CRYPTOR.encrypt(password.toCharArray(), plainText); + return new String(Base64.encodeBase64(encryptedText)); + } catch (final Exception e) { + throw new RuntimeException("Unable to encrypt!", e); + } + } + + private static String decrypt(final String password, final String data) { + try { + byte[] encryptedText = CRYPTOR.decrypt(password.toCharArray(),Base64.decodeBase64(data)); + return new String(encryptedText); + } catch (final Exception e) { + throw new RuntimeException("Unable to decrypt!", e); + } + } + + + private static void printUsage() { + System.out.printf("Usage: tcrypt ( encode | decode ) [master key / password] [data to encode/decode]%n"); + } +} diff --git a/src/main/java/ch/n1b/tcrypt/cryptor/AesGcmCryptor.java b/src/main/java/ch/n1b/tcrypt/cryptor/AesGcmCryptor.java index e6c98c4..6bf7148 100644 --- a/src/main/java/ch/n1b/tcrypt/cryptor/AesGcmCryptor.java +++ b/src/main/java/ch/n1b/tcrypt/cryptor/AesGcmCryptor.java @@ -141,7 +141,7 @@ public byte[] encrypt(char[] password, byte[] plaintext) // initialise random and generate IV (initialisation vector) SecretKey key = deriveAesKey(password, PBKDF2_SALT, AES_KEY_BITS_LENGTH); final byte[] iv = new byte[GCM_IV_BYTES_LENGTH]; - SecureRandom random = SecureRandom.getInstanceStrong(); + SecureRandom random = new SecureRandom(); random.nextBytes(iv); // encrypt