From 2d20df2c4f9fb392ffb31bc9c0fa00a5e93d506f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz>
Date: Tue, 4 May 2021 15:05:13 +0200
Subject: [PATCH] Use CipherInput(Output)Stream for RSA Cipher

---
 .gitignore                                    |   1 +
 pom.enc                                       | Bin 0 -> 3472 bytes
 pom.txt                                       |  89 ++++++++++++++++++
 pom.xml                                       |  41 ++++----
 .../java/java2/koz01/lab13/Lab13Decrypt.java  |  50 +++++-----
 .../java/java2/koz01/lab13/Lab13Encrypt.java  |  14 +--
 .../lab13/NoClosingFilterInputStream.java     |  18 ++++
 .../lab13/NoClosingFilterOutputStream.java    |  18 ++++
 .../java2/koz01/lab13/OutputStreamApp.java    |  42 +++++++++
 src/main/java/module-info.java                |   1 +
 10 files changed, 226 insertions(+), 48 deletions(-)
 create mode 100644 pom.enc
 create mode 100644 pom.txt
 create mode 100644 src/main/java/java2/koz01/lab13/NoClosingFilterInputStream.java
 create mode 100644 src/main/java/java2/koz01/lab13/NoClosingFilterOutputStream.java
 create mode 100644 src/main/java/java2/koz01/lab13/OutputStreamApp.java

diff --git a/.gitignore b/.gitignore
index 1ccc1d3..f1bf236 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@
 derby.log
 /db/
 /output/
+/keys.rsa
diff --git a/pom.enc b/pom.enc
new file mode 100644
index 0000000000000000000000000000000000000000..af311df8b979876ecbaf39c812da821adc49625d
GIT binary patch
literal 3472
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
Qtz<hZAZU%Ij~3(q53owT4gdfE

literal 0
HcmV?d00001

diff --git a/pom.txt b/pom.txt
new file mode 100644
index 0000000..3948263
--- /dev/null
+++ b/pom.txt
@@ -0,0 +1,89 @@
+<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/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>java2.koz01</groupId>
+	<artifactId>lab13</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<packaging>jar</packaging>
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.source>15</maven.compiler.source>
+		<maven.compiler.target>15</maven.compiler.target>
+		<maven.compiler.version>3.8.1</maven.compiler.version>
+		<javafx.version>15.0.1</javafx.version>
+		<junit.version>5.7.1</junit.version>
+		<log4j.version>2.14.1</log4j.version>
+		<lombok.version>1.18.20</lombok.version>
+	</properties>
+	<dependencies>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-controls</artifactId>
+			<version>${javafx.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.openjfx</groupId>
+			<artifactId>javafx-fxml</artifactId>
+			<version>${javafx.version}</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-api</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-engine</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter-params</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
+		<dependency>
+		    <groupId>org.projectlombok</groupId>
+		    <artifactId>lombok</artifactId>
+		    <version>${lombok.version}</version>
+		    <scope>provided</scope>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
+		<dependency>
+		    <groupId>org.apache.logging.log4j</groupId>
+		    <artifactId>log4j-api</artifactId>
+		    <version>${log4j.version}</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
+		<dependency>
+		    <groupId>org.apache.logging.log4j</groupId>
+		    <artifactId>log4j-core</artifactId>
+		    <version>${log4j.version}</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+	            <groupId>org.apache.maven.plugins</groupId>
+	            <artifactId>maven-compiler-plugin</artifactId>
+	            <version>${maven.compiler.version}</version>
+	            <configuration>
+	            	<annotationProcessorPaths>
+						<path>
+							<groupId>org.projectlombok</groupId>
+							<artifactId>lombok</artifactId>
+							<version>${lombok.version}</version>
+						</path>
+					</annotationProcessorPaths>
+	            </configuration>
+	        </plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/pom.xml b/pom.xml
index 3948263..764e23e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,40 +50,47 @@
 		</dependency>
 		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
 		<dependency>
-		    <groupId>org.projectlombok</groupId>
-		    <artifactId>lombok</artifactId>
-		    <version>${lombok.version}</version>
-		    <scope>provided</scope>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>${lombok.version}</version>
+			<scope>provided</scope>
 		</dependency>
 		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
 		<dependency>
-		    <groupId>org.apache.logging.log4j</groupId>
-		    <artifactId>log4j-api</artifactId>
-		    <version>${log4j.version}</version>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>${log4j.version}</version>
 		</dependency>
 		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
 		<dependency>
-		    <groupId>org.apache.logging.log4j</groupId>
-		    <artifactId>log4j-core</artifactId>
-		    <version>${log4j.version}</version>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>${log4j.version}</version>
 		</dependency>
+		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.8.0</version>
+		</dependency>
+
 	</dependencies>
 	<build>
 		<plugins>
 			<plugin>
-	            <groupId>org.apache.maven.plugins</groupId>
-	            <artifactId>maven-compiler-plugin</artifactId>
-	            <version>${maven.compiler.version}</version>
-	            <configuration>
-	            	<annotationProcessorPaths>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>${maven.compiler.version}</version>
+				<configuration>
+					<annotationProcessorPaths>
 						<path>
 							<groupId>org.projectlombok</groupId>
 							<artifactId>lombok</artifactId>
 							<version>${lombok.version}</version>
 						</path>
 					</annotationProcessorPaths>
-	            </configuration>
-	        </plugin>
+				</configuration>
+			</plugin>
 		</plugins>
 	</build>
 </project>
diff --git a/src/main/java/java2/koz01/lab13/Lab13Decrypt.java b/src/main/java/java2/koz01/lab13/Lab13Decrypt.java
index 1af91c7..c7ab5e6 100644
--- a/src/main/java/java2/koz01/lab13/Lab13Decrypt.java
+++ b/src/main/java/java2/koz01/lab13/Lab13Decrypt.java
@@ -1,3 +1,4 @@
+
 package java2.koz01.lab13;
 
 import java.io.FileInputStream;
@@ -10,13 +11,13 @@ import java.security.KeyPair;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 
-import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.CipherInputStream;
-import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.NoSuchPaddingException;
 import javax.crypto.spec.SecretKeySpec;
 
+import org.apache.commons.io.input.BoundedInputStream;
+
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -24,34 +25,35 @@ public class Lab13Decrypt {
 
 	public static void main(String[] args) throws InvalidKeyException,
 		NoSuchAlgorithmException, NoSuchPaddingException, IOException,
-		InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException
+		InvalidKeySpecException
 	{
 
 		KeyPairLoader keyPairLoader = new KeyPairLoader();
 		KeyPair kp = keyPairLoader.load("keys.rsa");
 
-		
-
-		InputStream nis = new FileInputStream(args[0]);
-		Cipher aCipher = Cipher.getInstance("RSA");
-		aCipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());
-		byte[] encrypted = new byte[256];
-		nis.read(encrypted);
-		byte[] keyData = aCipher.doFinal(encrypted);
-		SecretKeySpec skp = new SecretKeySpec(keyData, "AES");
-
-		Cipher cipher = Cipher.getInstance("AES");
-		cipher.init(Cipher.DECRYPT_MODE, skp);
-		
-
-		try (InputStream is = new CipherInputStream(nis,
-			cipher);
-				 OutputStream os = new FileOutputStream(args[1]))
+		try (InputStream nis = new FileInputStream(args[0]);
+				OutputStream os = new FileOutputStream(args[1]))
 		{
-			byte [] buffer = new byte[1024];
-			int len;
-			while (-1 != (len = is.read(buffer))) {
-				os.write(buffer, 0, len);
+			Cipher cipher = Cipher.getInstance("AES");
+			Cipher aCipher = Cipher.getInstance("RSA");
+			aCipher.init(Cipher.DECRYPT_MODE, kp.getPrivate());
+			try (InputStream rsaIs = new CipherInputStream(
+				new NoClosingFilterInputStream(new BoundedInputStream(nis, 256)),
+				aCipher))
+			{
+				byte[] keyData = new byte[32];
+				rsaIs.read(keyData);
+				SecretKeySpec skp = new SecretKeySpec(keyData, "AES");
+				cipher.init(Cipher.DECRYPT_MODE, skp);
+			}
+			try (InputStream is = new CipherInputStream(
+				new NoClosingFilterInputStream(nis), cipher);)
+			{
+				byte[] buffer = new byte[1024];
+				int len;
+				while (-1 != (len = is.read(buffer))) {
+					os.write(buffer, 0, len);
+				}
 			}
 		}
 		log.info("decrypted");
diff --git a/src/main/java/java2/koz01/lab13/Lab13Encrypt.java b/src/main/java/java2/koz01/lab13/Lab13Encrypt.java
index 6acb767..46ae590 100644
--- a/src/main/java/java2/koz01/lab13/Lab13Encrypt.java
+++ b/src/main/java/java2/koz01/lab13/Lab13Encrypt.java
@@ -10,10 +10,8 @@ import java.security.KeyPair;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 
-import javax.crypto.BadPaddingException;
 import javax.crypto.Cipher;
 import javax.crypto.CipherOutputStream;
-import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.KeyGenerator;
 import javax.crypto.NoSuchPaddingException;
 import javax.crypto.SecretKey;
@@ -25,7 +23,7 @@ public class Lab13Encrypt {
 
 	public static void main(String[] args) throws NoSuchAlgorithmException,
 		IOException, NoSuchPaddingException, InvalidKeyException,
-		InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException
+		InvalidKeySpecException
 	{
 
 		KeyPairLoader keyPairLoader = new KeyPairLoader();
@@ -54,10 +52,12 @@ public class Lab13Encrypt {
 			Cipher aCipher = Cipher.getInstance("RSA");
 			aCipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
 			log.info("size of key {}", sk.getEncoded().length);
-			byte[] encrypted = aCipher.doFinal(sk.getEncoded());
-			log.info("size of encrypted {}", encrypted.length);
-			nos.write(encrypted);
-			nos.flush();
+
+			try (OutputStream rsaOs = new CipherOutputStream(
+				new NoClosingFilterOutputStream(nos), aCipher))
+			{
+				rsaOs.write(sk.getEncoded());
+			}
 			int len;
 			while (-1 != (len = is.read(buffer))) {
 				os.write(buffer, 0, len);
diff --git a/src/main/java/java2/koz01/lab13/NoClosingFilterInputStream.java b/src/main/java/java2/koz01/lab13/NoClosingFilterInputStream.java
new file mode 100644
index 0000000..9966243
--- /dev/null
+++ b/src/main/java/java2/koz01/lab13/NoClosingFilterInputStream.java
@@ -0,0 +1,18 @@
+package java2.koz01.lab13;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+class NoClosingFilterInputStream extends FilterInputStream {
+
+	public NoClosingFilterInputStream(InputStream in) {
+		super(in);
+	}
+
+	@Override
+	public void close() throws IOException {
+
+	}
+
+}
diff --git a/src/main/java/java2/koz01/lab13/NoClosingFilterOutputStream.java b/src/main/java/java2/koz01/lab13/NoClosingFilterOutputStream.java
new file mode 100644
index 0000000..eeef692
--- /dev/null
+++ b/src/main/java/java2/koz01/lab13/NoClosingFilterOutputStream.java
@@ -0,0 +1,18 @@
+package java2.koz01.lab13;
+
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+class NoClosingFilterOutputStream extends FilterOutputStream {
+
+	public NoClosingFilterOutputStream(OutputStream out) {
+		super(out);
+	}
+
+	@Override
+	public void close() throws IOException {
+		flush();
+	}
+
+}
diff --git a/src/main/java/java2/koz01/lab13/OutputStreamApp.java b/src/main/java/java2/koz01/lab13/OutputStreamApp.java
new file mode 100644
index 0000000..f321e10
--- /dev/null
+++ b/src/main/java/java2/koz01/lab13/OutputStreamApp.java
@@ -0,0 +1,42 @@
+package java2.koz01.lab13;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.Cipher;
+import javax.crypto.CipherOutputStream;
+import javax.crypto.NoSuchPaddingException;
+
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+public class OutputStreamApp {
+
+	public static void main(String[] args) throws NoSuchAlgorithmException,
+		NoSuchPaddingException, FileNotFoundException, IOException,
+		InvalidKeyException
+	{
+		KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
+		kpg.initialize(2048);
+		KeyPair kp = kpg.generateKeyPair();
+
+		log.info("private: {}", kp.getPrivate());
+		log.info("public: {}", kp.getPublic());
+		Cipher cipher = Cipher.getInstance("RSA");
+		cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
+		for (int i = 200; i < 257; i++) {
+			try (OutputStream os = new CipherOutputStream(new FileOutputStream("out" +
+				i + ".enc"), cipher))
+			{
+				byte[] data = new byte[i];
+				os.write(data);
+			}
+		}
+	}
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index b9bed9f..415a9ea 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -3,4 +3,5 @@ module java2.koz01.lab13 {
 
 		requires lombok;
 		requires org.apache.logging.log4j;
+		requires org.apache.commons.io;
 }
\ No newline at end of file
-- 
GitLab