Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,10 @@

Project: Encryption-Decryption

Go to the *src* directory, change *Crypto.java* and put your *.java* file(s) in it.
Added two methods for encryption/description

Command line support added

Work with files added

New aes algorithm added (13.01.19)
1 change: 1 addition & 0 deletions protected.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
637E771EB77D5BA14AF2E60452B99CCF88D408880DE930CF81F2E7CD57F6C601
1 change: 1 addition & 0 deletions road_to_treasure.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Welcome to hyperskill!
59 changes: 59 additions & 0 deletions src/crypto/AesCryptoAlgorithm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package crypto;import com.sun.org.apache.xerces.internal.impl.dv.util.HexBin;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AesCryptoAlgorithm implements CryptoAlgorithm {

private static final String SECRET_KEY = "JustSecretString";

@Override
public String encryption(String message, String key) {
String encryptedMessage = "";
try {
if (!isValidKey(key)) {
System.out.println("Error: For the aes algorithm, key length must be 16, 24 or 32 symbols(bytes)");
}

IvParameterSpec ivParameter = new IvParameterSpec(SECRET_KEY.getBytes("UTF-8"));
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameter);

byte[] bytes = cipher.doFinal(message.getBytes("UTF-8"));
encryptedMessage = HexBin.encode(bytes);
} catch (Throwable cause) {
System.out.println("Error: " + cause.getMessage());
}
return encryptedMessage;
}

@Override
public String decryption(String encryptedMessage, String key) {
String decryptedMessage = "";
try {
if (!isValidKey(key)) {
System.out.println("Error: For the aes algorithm, key length must be 16, 24 or 32 symbols(bytes)");
}

IvParameterSpec ivParameter = new IvParameterSpec(SECRET_KEY.getBytes("UTF-8"));
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameter);

byte[] bytes = cipher.doFinal(HexBin.decode(encryptedMessage));
decryptedMessage = new String(bytes);
} catch (Throwable cause) {
System.out.println("Error: " + cause.getMessage());
cause.printStackTrace();
}
return decryptedMessage;
}

private static boolean isValidKey(String key) {
return key.length() == 16 || key.length() == 24 || key.length() == 32;
}
}
90 changes: 89 additions & 1 deletion src/crypto/Crypto.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,98 @@
package crypto;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

public class Crypto {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// write your code here
String state = "enc";
String key = "";
String algName = "";
String message = "";
String result = "";
String in = "";
String out = "";

for (int i = 0; i < args.length; i++) {
if ("-mode".equals(args[i])) {
state = args[i + 1];
i++;
} else if ("-key".equals(args[i])) {
key = args[i + 1];
i++;
}else if ("-alg".equals(args[i])) {
algName = args[i + 1];
i++;
} else if ("-data".equals(args[i])) {
message = args[i + 1];
i++;
} else if ("-in".equals(args[i])) {
in = args[i + 1];
i++;
} else if ("-out".equals(args[i])) {
out = args[i + 1];
i++;
}
}

CryptoAlgorithm cryptoAlgorithm = CryptoAlgorithmFactory.getAlgorithm(algName);

if (key.equals("")) {
System.out.print("Enter key: ");
key = scanner.nextLine();
}

if (!in.equals("")) {
File input = new File(in);
if (input.exists()) {
try {
message = new String(Files.readAllBytes(Paths.get(input.getPath())));
} catch (IOException e) {
e.printStackTrace();
}
}
}

if (message.equals("")) {
System.out.print("Enter text: ");
message = scanner.nextLine();
}

if ("enc".equals(state)) {
result = cryptoAlgorithm.encryption(message, key);
}

if ("dec".equals(state)) {
result = cryptoAlgorithm.decryption(message, key);
}

if (out.equals("")) {
System.out.println(result);
} else {
File output = new File(out);
boolean created = true;
if (!output.exists()) {
try {
created = output.createNewFile();
} catch (IOException e) {
created = false;
System.out.println("Cannot create the file: " + output.getPath());
}
}
if (created) {
try {
FileWriter writer = new FileWriter(output);
writer.write(result);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4 changes: 4 additions & 0 deletions src/crypto/CryptoAlgorithm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package crypto;public interface CryptoAlgorithm {
String encryption(String message, String key);
String decryption(String encryptedMessage, String key);
}
9 changes: 9 additions & 0 deletions src/crypto/CryptoAlgorithmFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package crypto;public class CryptoAlgorithmFactory {
public static CryptoAlgorithm getAlgorithm(String algName) {
if (algName.equals("aes")) {
return new AesCryptoAlgorithm();
} else {
return new SimpleCryptoAlgorithm();
}
}
}
47 changes: 47 additions & 0 deletions src/crypto/SimpleCryptoAlgorithm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package crypto;public class SimpleCryptoAlgorithm implements CryptoAlgorithm {

@Override
public String encryption(String message, String key) {
String encrypt = "";
int secretKey = 0;
try {
secretKey = Integer.parseInt(key);
} catch (NumberFormatException ex) {
System.out.println("Error: For the simple algorithm, the key must be a number");
}
for (int i = 0; i < message.length(); i++) {
int index = message.charAt(i);

if (index != -1) {
int newIndex = index + secretKey;
char c = (char) newIndex;
encrypt += c;
} else {
encrypt += String.valueOf(index);;
}
}
return encrypt; }

@Override
public String decryption(String encryptedMessage, String key) {
String encrypt = "";
int secretKey = 0;
try {
secretKey = Integer.parseInt(key);
} catch (NumberFormatException ex) {
System.out.println("Error: For the simple algorithm, the key must be a number");
}
for (int i = 0; i < encryptedMessage.length(); i++) {
int index = encryptedMessage.charAt(i);

if (index != -1) {
int newIndex = index - secretKey;
char c = (char) newIndex;
encrypt += c;
} else {
encrypt += String.valueOf(index);;
}
}
return encrypt;
}
}