Repository: commons-crypto Updated Branches: refs/heads/master 82821524d -> d0fd391d1
CRYPTO-73 Create example Java source code Examples created. TODO feed these into the user guide Project: http://git-wip-us.apache.org/repos/asf/commons-crypto/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-crypto/commit/d0fd391d Tree: http://git-wip-us.apache.org/repos/asf/commons-crypto/tree/d0fd391d Diff: http://git-wip-us.apache.org/repos/asf/commons-crypto/diff/d0fd391d Branch: refs/heads/master Commit: d0fd391d1cb4b236b6c4a1db589ebe8508f994d1 Parents: 8282152 Author: Sebb <s...@apache.org> Authored: Wed Jun 22 00:11:40 2016 +0100 Committer: Sebb <s...@apache.org> Committed: Wed Jun 22 00:11:40 2016 +0100 ---------------------------------------------------------------------- .../crypto/examples/CipherByteArrayExample.java | 57 +++++++++++++++ .../examples/CipherByteBufferExample.java | 75 ++++++++++++++++++++ .../commons/crypto/examples/RandomExample.java | 35 +++++++++ .../commons/crypto/examples/StreamExample.java | 61 ++++++++++++++++ 4 files changed, 228 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/d0fd391d/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java b/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java new file mode 100644 index 0000000..af2b658 --- /dev/null +++ b/src/main/java/org/apache/commons/crypto/examples/CipherByteArrayExample.java @@ -0,0 +1,57 @@ +package org.apache.commons.crypto.examples; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Properties; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.crypto.cipher.CipherTransformation; +import org.apache.commons.crypto.cipher.CryptoCipher; +import org.apache.commons.crypto.utils.Utils; + +public class CipherByteArrayExample { + + private static byte[] getUTF8Bytes(String input) { + return input.getBytes(StandardCharsets.UTF_8); + } + + public static void main(String[] args) throws Exception { + final SecretKeySpec key = new SecretKeySpec(getUTF8Bytes("1234567890123456"),"AES"); + final IvParameterSpec iv = new IvParameterSpec(getUTF8Bytes("1234567890123456")); + Properties properties = new Properties(); + //Creates a CryptoCipher instance with the transformation and properties. + final CipherTransformation transform = CipherTransformation.AES_CBC_PKCS5PADDING; + CryptoCipher encipher = Utils.getCipherInstance(transform, properties); + + final String sampleInput = "hello world!"; + System.out.println("input: " + sampleInput); + + byte[] input = getUTF8Bytes(sampleInput); + byte[] output = new byte[32]; + + //Initializes the cipher with ENCRYPT_MODE, key and iv. + encipher.init(Cipher.ENCRYPT_MODE, key, iv); + //Continues a multiple-part encryption/decryption operation for byte array. + int updateBytes = encipher.update(input, 0, input.length, output, 0); + System.out.println(updateBytes); + //We should call do final at the end of encryption/decryption. + int finalBytes = encipher.doFinal(input, 0, 0, output, updateBytes); + System.out.println(finalBytes); + //Closes the cipher. + encipher.close(); + + System.out.println(Arrays.toString(Arrays.copyOf(output, updateBytes+finalBytes))); + + // Now reverse the process + CryptoCipher decipher = Utils.getCipherInstance(transform, properties); + decipher.init(Cipher.DECRYPT_MODE, key, iv); + byte [] decoded = new byte[32]; + decipher.doFinal(output, 0, updateBytes + finalBytes, decoded, 0); + + System.out.println("output: " + new String(decoded, StandardCharsets.UTF_8)); + } + +} http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/d0fd391d/src/main/java/org/apache/commons/crypto/examples/CipherByteBufferExample.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/examples/CipherByteBufferExample.java b/src/main/java/org/apache/commons/crypto/examples/CipherByteBufferExample.java new file mode 100644 index 0000000..5b2c1fb --- /dev/null +++ b/src/main/java/org/apache/commons/crypto/examples/CipherByteBufferExample.java @@ -0,0 +1,75 @@ +package org.apache.commons.crypto.examples; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Properties; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.crypto.cipher.CipherTransformation; +import org.apache.commons.crypto.cipher.CryptoCipher; +import org.apache.commons.crypto.utils.Utils; + +public class CipherByteBufferExample { + + private static byte[] getUTF8Bytes(String input) { + return input.getBytes(StandardCharsets.UTF_8); + } + + private static String asString(ByteBuffer buffer, boolean flip) { + final ByteBuffer copy = buffer.duplicate(); + if (flip) { + copy.flip(); + } + final byte[] bytes = new byte[Math.min(copy.remaining(),50)]; + copy.get(bytes); + return new String(bytes, StandardCharsets.UTF_8); + } + + public static void main(String[] args) throws Exception { + final SecretKeySpec key = new SecretKeySpec(getUTF8Bytes("1234567890123456"), "AES"); + final IvParameterSpec iv = new IvParameterSpec(getUTF8Bytes("1234567890123456")); + Properties properties = new Properties(); + //Creates a CryptoCipher instance with the transformation and properties. + final CipherTransformation transform = CipherTransformation.AES_CBC_PKCS5PADDING; + CryptoCipher encipher = Utils.getCipherInstance(transform, properties); + + final int bufferSize = 1024; + + ByteBuffer inBuffer = ByteBuffer.allocateDirect(bufferSize); + ByteBuffer outBuffer = ByteBuffer.allocateDirect(bufferSize); + inBuffer.put(getUTF8Bytes("hello world!")); + // Show the data is there + System.out.println("inBuffer="+asString(inBuffer, true)); + + inBuffer.flip(); // ready for the cipher to read it + // Initializes the cipher with ENCRYPT_MODE,key and iv. + encipher.init(Cipher.ENCRYPT_MODE, key, iv); + // Continues a multiple-part encryption/decryption operation for byte buffer. + final int updateBytes = encipher.update(inBuffer, outBuffer); + System.out.println(updateBytes); + + // We should call do final at the end of encryption/decryption. + final int finalBytes = encipher.doFinal(inBuffer, outBuffer); + System.out.println(finalBytes); + encipher.close(); + + outBuffer.flip(); // ready for use as decrypt + byte [] encoded = new byte[updateBytes + finalBytes]; + outBuffer.duplicate().get(encoded); + System.out.println(Arrays.toString(encoded)); + + // Now reverse the process + CryptoCipher decipher = Utils.getCipherInstance(transform, properties); + decipher.init(Cipher.DECRYPT_MODE, key, iv); + ByteBuffer decoded = ByteBuffer.allocateDirect(bufferSize); + decipher.update(outBuffer, decoded); + decipher.doFinal(outBuffer, decoded); + decipher.close(); + System.out.println("decoded="+asString(decoded, true)); + } + +} http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/d0fd391d/src/main/java/org/apache/commons/crypto/examples/RandomExample.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/examples/RandomExample.java b/src/main/java/org/apache/commons/crypto/examples/RandomExample.java new file mode 100644 index 0000000..bab54d3 --- /dev/null +++ b/src/main/java/org/apache/commons/crypto/examples/RandomExample.java @@ -0,0 +1,35 @@ +package org.apache.commons.crypto.examples; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Properties; + +import org.apache.commons.crypto.conf.ConfigurationKeys; +import org.apache.commons.crypto.random.CryptoRandom; +import org.apache.commons.crypto.random.CryptoRandomFactory; + +public class RandomExample { + + public static void main(String []args) throws GeneralSecurityException, IOException { + //Constructs a byte array to store random data. + byte[] key = new byte[16]; + byte[] iv = new byte[16]; + Properties properties = new Properties(); + properties.put(ConfigurationKeys.COMMONS_CRYPTO_SECURE_RANDOM_CLASSES_KEY, + "org.apache.commons.crypto.random.OpensslCryptoRandom"); // TODO replace with alias + //Gets the 'CryptoRandom' instance. + CryptoRandom random = CryptoRandomFactory.getCryptoRandom(properties); + System.out.println(random.getClass().getCanonicalName()); + + //Generates random bytes and places them into the byte array. + random.nextBytes(key); + random.nextBytes(iv); + //Closes the CryptoRandom. + random.close(); + + // Show the output + System.out.println(Arrays.toString(key)); + System.out.println(Arrays.toString(iv)); + } +} http://git-wip-us.apache.org/repos/asf/commons-crypto/blob/d0fd391d/src/main/java/org/apache/commons/crypto/examples/StreamExample.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/crypto/examples/StreamExample.java b/src/main/java/org/apache/commons/crypto/examples/StreamExample.java new file mode 100644 index 0000000..eac4e9e --- /dev/null +++ b/src/main/java/org/apache/commons/crypto/examples/StreamExample.java @@ -0,0 +1,61 @@ +package org.apache.commons.crypto.examples; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; +import java.util.Arrays; +import java.util.Properties; + +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.crypto.cipher.CipherTransformation; +import org.apache.commons.crypto.stream.CryptoInputStream; +import org.apache.commons.crypto.stream.CryptoOutputStream; + +/** + * Example showing how to use stream encryption and decryption. + */ +public class StreamExample { + + private static byte[] getUTF8Bytes(String input) { + return input.getBytes(StandardCharsets.UTF_8); + } + + public static void main(String []args) throws GeneralSecurityException, IOException { + final SecretKeySpec key = new SecretKeySpec(getUTF8Bytes("1234567890123456"),"AES"); + final IvParameterSpec iv = new IvParameterSpec(getUTF8Bytes("1234567890123456")); + Properties properties = new Properties(); + final CipherTransformation transform = CipherTransformation.AES_CBC_PKCS5PADDING; + + String input = "hello world!"; + //Encryption with CryptoOutputStream. + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + CryptoOutputStream cos = new CryptoOutputStream(transform, properties, outputStream, key, iv); + cos.write(getUTF8Bytes(input)); + cos.flush(); + cos.close(); + + // The encrypted data: + System.out.println("Encrypted: "+Arrays.toString(outputStream.toByteArray())); + + // Decryption with CryptoInputStream. + InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); + + CryptoInputStream cis = new CryptoInputStream(transform, properties, inputStream, key, iv); + + byte[] decryptedData = new byte[1024]; + int decryptedLen = 0; + int i; + while((i = cis.read(decryptedData, decryptedLen, decryptedData.length - decryptedLen)) > -1 ) { + decryptedLen += i; + } + cis.close(); + System.out.println("Decrypted: "+new String(decryptedData, 0, decryptedLen, StandardCharsets.UTF_8)); + } +}