From c0aaed7474a01ccac78a71a82b9448856408d3a2 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Sun, 1 Jul 2018 21:05:28 +0200 Subject: [PATCH 1/3] [BAEL-1930] Encryption and decryption of files using JDK --- .gitmodules | 3 - .../encrypt/FileEncrypterDecrypter.java | 61 +++++++++++++++++++ ...FileEncrypterDecrypterIntegrationTest.java | 33 ++++++++++ 3 files changed, 94 insertions(+), 3 deletions(-) delete mode 100644 .gitmodules create mode 100644 core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java create mode 100644 core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 9c5cdb8f2d..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "testgitrepo"] - path = testgitrepo - url = /home/prd/Development/projects/idea/tutorials/spring-boot/src/main/resources/testgitrepo/ diff --git a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java new file mode 100644 index 0000000000..aad2089d8b --- /dev/null +++ b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java @@ -0,0 +1,61 @@ +package com.baeldung.encrypt; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +class FileEncrypterDecrypter { + + private SecretKey secretKey; + private Cipher cipher; + + FileEncrypterDecrypter(SecretKey secretKey, String cipher) throws NoSuchPaddingException, NoSuchAlgorithmException { + this.secretKey = secretKey; + this.cipher = Cipher.getInstance(cipher); + } + + void encrypt(String content, String fileName) throws InvalidKeyException, IOException { + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + byte[] iv = cipher.getIV(); + + try ( + FileOutputStream fileOut = new FileOutputStream(fileName); + CipherOutputStream cipherOut = new CipherOutputStream(fileOut, cipher) + ) { + fileOut.write(iv); + cipherOut.write(content.getBytes()); + } + + } + + String decrypt(String fileName) throws InvalidAlgorithmParameterException, InvalidKeyException, IOException { + + String content; + + try (FileInputStream fileIn = new FileInputStream(fileName)) { + byte[] fileIv = new byte[16]; + fileIn.read(fileIv); + cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(fileIv)); + + try (CipherInputStream cipherIn = new CipherInputStream(fileIn, cipher)) { + InputStreamReader inReader = new InputStreamReader(cipherIn); + + StringBuilder sb = new StringBuilder(); + int c = inReader.read(); + while (c != -1) { + sb.append((char) c); + c = inReader.read(); + } + content = sb.toString(); + } + + } + return content; + } +} diff --git a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java new file mode 100644 index 0000000000..6cadfcde1d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.encrypt; + +import org.junit.Test; + +import javax.crypto.KeyGenerator; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import java.io.File; +import java.io.IOException; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class FileEncrypterDecrypterIntegrationTest { + + @Test + public void givenStringAndFilename_whenEncryptingIntoFile_andDecryptingFileAgain_thenOriginalStringIsReturned() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException, InvalidAlgorithmParameterException { + String originalContent = "foobar"; + SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey(); + + FileEncrypterDecrypter fileEncrypterDecrypter = new FileEncrypterDecrypter(secretKey, "AES/CBC/PKCS5Padding"); + fileEncrypterDecrypter.encrypt(originalContent, "baz.enc"); + + String decryptedContent = fileEncrypterDecrypter.decrypt("baz.enc"); + assertThat(decryptedContent, is(originalContent)); + + new File("baz.enc").delete(); // cleanup + } + +} \ No newline at end of file From 4615e1653b5c6a5e3980bab76444cbec9ec1dd34 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Wed, 4 Jul 2018 13:50:06 +0200 Subject: [PATCH 2/3] Use BufferedReader when decrypting --- .../encrypt/FileEncrypterDecrypter.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java index aad2089d8b..b557ccf31a 100644 --- a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java +++ b/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java @@ -2,10 +2,7 @@ package com.baeldung.encrypt; import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -43,14 +40,16 @@ class FileEncrypterDecrypter { fileIn.read(fileIv); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(fileIv)); - try (CipherInputStream cipherIn = new CipherInputStream(fileIn, cipher)) { - InputStreamReader inReader = new InputStreamReader(cipherIn); + try ( + CipherInputStream cipherIn = new CipherInputStream(fileIn, cipher); + InputStreamReader inputReader = new InputStreamReader(cipherIn); + BufferedReader reader = new BufferedReader(inputReader) + ) { StringBuilder sb = new StringBuilder(); - int c = inReader.read(); - while (c != -1) { - sb.append((char) c); - c = inReader.read(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line); } content = sb.toString(); } From da1db70aad90c23335a1a02eb3420f65018c6de4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 7 Jul 2018 15:40:12 +0300 Subject: [PATCH 3/3] Update FileEncrypterDecrypterIntegrationTest.java --- .../encrypt/FileEncrypterDecrypterIntegrationTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java index 6cadfcde1d..b767a24b16 100644 --- a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java +++ b/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java @@ -29,5 +29,4 @@ public class FileEncrypterDecrypterIntegrationTest { new File("baz.enc").delete(); // cleanup } - -} \ No newline at end of file +}