From 5c833127344f4e9ecd9fbe1e6b5d05991f144c48 Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 17 Dec 2024 15:20:24 +0100 Subject: [PATCH 01/77] branch to delete --- .idea/misc.xml | 1 - src/VigenereAlgo.java | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/VigenereAlgo.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 31e1ebc..104fe35 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/src/VigenereAlgo.java b/src/VigenereAlgo.java new file mode 100644 index 0000000..5805c59 --- /dev/null +++ b/src/VigenereAlgo.java @@ -0,0 +1,3 @@ +public class VigenereAlgo { + +} From 26ba4f54c893aa4b55d32a2ababd993849751fec Mon Sep 17 00:00:00 2001 From: lucas Date: Tue, 17 Dec 2024 16:48:07 +0100 Subject: [PATCH 02/77] Vigenere Algo development --- src/VigenereAlgo.java | 132 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/src/VigenereAlgo.java b/src/VigenereAlgo.java index 5805c59..2e7e043 100644 --- a/src/VigenereAlgo.java +++ b/src/VigenereAlgo.java @@ -1,3 +1,133 @@ +import java.util.Scanner; + public class VigenereAlgo { - + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + // Ask user to type their phrase + System.out.print("Enter a phrase to encrypt: "); + String plainText = scanner.nextLine(); + + // Ask user to type their key and validate it + String key; + while (true) { + System.out.print("Enter your key (no numbers allowed): "); + key = scanner.nextLine(); + if (isValidKey(key)) { + break; + } else { + System.out.println("Invalid key. The key must not contain numbers. Please try again."); + } + } + + // Call encryption function and display the result + String encryptedText = encrypt(plainText, key); + System.out.println("Encrypted text: " + encryptedText); + + // Call decryption function and display the result + String decryptedText = decrypt(encryptedText, key); + System.out.println("Decrypted text: " + decryptedText); + + scanner.close(); + } + + // Validate that the key does not contain numbers + private static boolean isValidKey(String key) { + for (char c : key.toCharArray()) { + if (Character.isDigit(c)) { + return false; // Reject if the key contains any digit + } + } + return true; // Key is valid if it contains no digits + } + + // Encrypt the plaintext using the Vigenere cipher algorithm + public static String encrypt(String plainText, String key) { + StringBuilder encryptedText = new StringBuilder(); + + // Clean the key to contain only alphabetical characters + key = cleanKey(key); + // Generate a full-length key that matches the length of the plaintext + key = generateFullKey(plainText, key); + + for (int i = 0, keyIndex = 0; i < plainText.length(); i++) { + char pi = plainText.charAt(i); + + // Only encrypt alphabetic characters + if (Character.isLetter(pi)) { + boolean isUpperCase = Character.isUpperCase(pi); + char normalizedPi = Character.toLowerCase(pi); + char ki = key.charAt(keyIndex++); + + // Encryption formula: Ci = (Pi + Ki) mod 26 + char ci = (char) (((normalizedPi - 'a' + ki - 'a') % 26) + 'a'); + encryptedText.append(isUpperCase ? Character.toUpperCase(ci) : ci); + } else { + // Keep non-alphabetic characters unchanged + encryptedText.append(pi); + } + } + + return encryptedText.toString(); + } + + // Decrypt the ciphertext using the Vigenere cipher algorithm + public static String decrypt(String encryptedText, String key) { + StringBuilder decryptedText = new StringBuilder(); + + // Clean the key to contain only alphabetical characters + key = cleanKey(key); + // Generate a full-length key that matches the length of the ciphertext + key = generateFullKey(encryptedText, key); + + for (int i = 0, keyIndex = 0; i < encryptedText.length(); i++) { + char ci = encryptedText.charAt(i); + + // Only decrypt alphabetic characters + if (Character.isLetter(ci)) { + boolean isUpperCase = Character.isUpperCase(ci); + char normalizedCi = Character.toLowerCase(ci); + char ki = key.charAt(keyIndex++); + + // Decryption formula: Pi = (Ci - Ki + 26) mod 26 + char pi = (char) (((normalizedCi - ki + 26) % 26) + 'a'); + decryptedText.append(isUpperCase ? Character.toUpperCase(pi) : pi); + } else { + // Keep non-alphabetic characters unchanged + decryptedText.append(ci); + } + } + + return decryptedText.toString(); + } + + // Generate a full-length key matching the text length, ignoring non-alphabetic characters + private static String generateFullKey(String text, String key) { + StringBuilder fullKey = new StringBuilder(); + int keyLength = key.length(); + int keyIndex = 0; + + for (char c : text.toCharArray()) { + if (Character.isLetter(c)) { + fullKey.append(key.charAt(keyIndex % keyLength)); + keyIndex++; + } + } + + return fullKey.toString(); + } + + // Remove non-alphabetical characters from the key + private static String cleanKey(String key) { + StringBuilder cleanedKey = new StringBuilder(); + + for (char c : key.toCharArray()) { + if (Character.isLetter(c)) { + cleanedKey.append(Character.toLowerCase(c)); + } + } + + return cleanedKey.toString(); + } } From 8196d482643ab298f0405b670e02ddeaac6d9c50 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:25 +0100 Subject: [PATCH 03/77] feat : Ajout des classes MD5 et RC4 pour le hachage et le chiffrement --- src/Classes/MD5.java | 56 +++++++++++++++++++++++ src/Classes/RC4.java | 105 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 src/Classes/MD5.java create mode 100644 src/Classes/RC4.java diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java new file mode 100644 index 0000000..34d2b90 --- /dev/null +++ b/src/Classes/MD5.java @@ -0,0 +1,56 @@ +package Classes; + +import java.security.MessageDigest; +import java.nio.charset.StandardCharsets; + +public class MD5 { + /** + * Calcule le hash MD5 d'une chaîne de caractères. + * @param input La chaîne à hasher + * @return Le hash MD5 en hexadécimal (32 caractères) + * @throws IllegalArgumentException si input est null + * @throws RuntimeException si une erreur survient pendant le hachage + */ + public static String hash(String input) { + if (input == null) { + throw new IllegalArgumentException("Input cannot be null"); + } + + try { + // Obtention d'une instance de MessageDigest configurée pour MD5 + // MessageDigest est une classe qui implémente l'algorithme de hachage + MessageDigest md = MessageDigest.getInstance("MD5"); + + // Conversion de la chaîne d'entrée en tableau de bytes avec l'encodage UTF-8 + // puis calcul du hash MD5 sur ces bytes + // Le résultat est un tableau de 16 bytes (128 bits, taille standard MD5) + byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); + + // Création d'un StringBuilder pour construire la représentation hexadécimale + // Il sera plus efficace qu'une simple String pour les concaténations + StringBuilder hexString = new StringBuilder(); + + // Pour chaque byte du hash MD5 + for (byte b : messageDigest) { + // String.format("%02x", b & 0xff) fait plusieurs choses : + // 1. b & 0xff : convertit le byte en un entier non signé (0-255) + // car les bytes en Java sont signés (-128 à 127) + // 2. %02x : formate l'entier en hexadécimal sur 2 positions + // - % indique le début du format + // - 0 indique de remplir avec des zéros + // - 2 indique la largeur minimale + // - x indique la notation hexadécimale en minuscules + hexString.append(String.format("%02x", b & 0xff)); + } + + // Conversion finale du StringBuilder en String + // Le résultat sera une chaîne de 32 caractères hexadécimaux + return hexString.toString(); + + } catch (Exception e) { + // En cas d'erreur (très rare car MD5 est un algorithme standard) + // on encapsule l'exception dans une RuntimeException + throw new RuntimeException("Error computing MD5 hash", e); + } + } +} \ No newline at end of file diff --git a/src/Classes/RC4.java b/src/Classes/RC4.java new file mode 100644 index 0000000..1ab7a15 --- /dev/null +++ b/src/Classes/RC4.java @@ -0,0 +1,105 @@ +package Classes; + +public class RC4 { + + private int[] S = new int[256]; + private int[] T = new int[256]; + public String key = ""; + + // Initialisation du tableau S et du tableau T avec la clé + public void init(String key) { + if (key == null || key.isEmpty()) { + throw new IllegalArgumentException("La clé ne peut pas être nulle ou vide"); + } + this.key = key; + + // Initialisation des tableaux S et T + for (int i = 0; i < 256; i++) { + S[i] = i; + T[i] = key.charAt(i % key.length()); + } + + // Permutation initiale de S + int j = 0; + for (int i = 0; i < 256; i++) { + j = (j + S[i] + T[i]) & 0xFF; + swap(i, j); + } + } + + // Chiffrement du texte clair + public String encrypt(String clearText) { + if (clearText == null || clearText.isEmpty()) { + throw new IllegalArgumentException("Le texte à chiffrer ne peut pas être nul ou vide"); + } + + // Réinitialisation pour assurer un état propre + init(this.key); + + StringBuilder encrypted = new StringBuilder(); + int i = 0, j = 0; + + // Pour chaque caractère du texte clair + for (int n = 0; n < clearText.length(); n++) { + char c = clearText.charAt(n); + // On incrémente i modulo 256 + i = (i + 1) & 0xFF; + // On incrémente j modulo 256 + j = (j + S[i]) & 0xFF; + // On échange S[i] et S[j] + swap(i, j); + // On calcule t + int t = (S[i] + S[j]) & 0xFF; + // On récupère la valeur de S[t] + int k = S[t]; + // On chiffre le caractère + int encryptedByte = c ^ k; + + // Conversion en binaire avec padding de 0 + encrypted.append(String.format("%8s", + Integer.toBinaryString(encryptedByte & 0xFF)) + .replace(' ', '0')); + + // Ajout d'espace sauf pour le dernier caractère + if (n < clearText.length() - 1) { + encrypted.append(" "); + } + } + + return encrypted.toString(); + } + + // Déchiffrement du texte chiffré + public String decrypt(String encryptedText) { + if (encryptedText == null || encryptedText.isEmpty()) { + throw new IllegalArgumentException("Le texte chiffré ne peut pas être nul ou vide"); + } + + // Réinitialisation pour assurer un état propre + init(this.key); + + StringBuilder decrypted = new StringBuilder(); + String[] binaryStrings = encryptedText.split(" "); + int i = 0, j = 0; + + // Pour chaque octet du texte chiffré + for (String binaryString : binaryStrings) { + char c = (char) Integer.parseInt(binaryString, 2); + i = (i + 1) & 0xFF; + j = (j + S[i]) & 0xFF; + swap(i, j); + int t = (S[i] + S[j]) & 0xFF; + int k = S[t]; + decrypted.append((char) (c ^ k)); + } + + return decrypted.toString(); + } + + // Fonction d'échange de deux éléments dans le tableau S + private void swap(int i, int j) { + int temp = S[i]; + S[i] = S[j]; + S[j] = temp; + } +} \ No newline at end of file From ccec8c6bae25f6406793dfb822df24e29b8c1b9a Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:33 +0100 Subject: [PATCH 04/77] feat : Ajout de tests unitaires pour les classes MD5 et RC4 --- src/Tests/MD5Test.java | 74 ++++++++++++++++++++++++ src/Tests/RC4Test.java | 128 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 src/Tests/MD5Test.java create mode 100644 src/Tests/RC4Test.java diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java new file mode 100644 index 0000000..7eb8f58 --- /dev/null +++ b/src/Tests/MD5Test.java @@ -0,0 +1,74 @@ +package Tests; + +import org.junit.Test; +import org.junit.Assert; +import Classes.MD5; + +public class MD5Test { + + @Test + public void testEmptyString() { + String result = MD5.hash(""); + Assert.assertEquals("d41d8cd98f00b204e9800998ecf8427e", result); + } + + @Test + public void testSimpleString() { + String result = MD5.hash("test"); + Assert.assertEquals("098f6bcd4621d373cade4e832627b4f6", result); + } + + @Test + public void testLongString() { + String result = MD5.hash("The quick brown fox jumps over the lazy dog"); + Assert.assertEquals("9e107d9d372bb6826bd81d3542a419d6", result); + } + + @Test + public void testSpecialCharacters() { + String result = MD5.hash("!@#$%^&*()_+"); + Assert.assertEquals("04dde9f462255fe14b5160bbf2acffe8", result); + } + + @Test + public void testUnicodeCharacters() { + String result = MD5.hash("héllo wörld"); + Assert.assertEquals("ed0c22cc110ede12327851863c078138", result); + } + + @Test + public void testConsistency() { + String input = "test123"; + String firstHash = MD5.hash(input); + String secondHash = MD5.hash(input); + Assert.assertEquals("Le même input devrait produire le même hash", firstHash, secondHash); + } + + @Test(expected = RuntimeException.class) + public void testNullInput() { + MD5.hash(null); + } + + @Test + public void testCaseSensitivity() { + String lowerCase = MD5.hash("hello"); + String upperCase = MD5.hash("HELLO"); + Assert.assertNotEquals("Les hashs de différentes casses devraient être différents", + lowerCase, upperCase); + } + + @Test + public void testHashLength() { + String result = MD5.hash("test"); + Assert.assertEquals("La longueur du hash MD5 devrait être de 32 caractères", + 32, result.length()); + } + + @Test + public void testWhitespaceHandling() { + String withSpaces = MD5.hash("test test"); + String withoutSpaces = MD5.hash("testtest"); + Assert.assertNotEquals("Les espaces devraient affecter le hash", + withSpaces, withoutSpaces); + } +} \ No newline at end of file diff --git a/src/Tests/RC4Test.java b/src/Tests/RC4Test.java new file mode 100644 index 0000000..4e8fc2c --- /dev/null +++ b/src/Tests/RC4Test.java @@ -0,0 +1,128 @@ +package Tests; + +import org.junit.Test; +import org.junit.Before; +import org.junit.Assert; +import Classes.RC4; + +public class RC4Test { + private RC4 rc4; + private static final String KEY = "1234"; + private static final String CLEAR_TEXT = "Hello World"; + private static final String ENCRYPTED_TEXT = "01001101 00101100 00011101 11000011 10011100 11001100 01010000 01100010 01111101 01110111 01100100"; + + @Before + public void setUp() { + rc4 = new RC4(); + rc4.key = KEY; + rc4.init(KEY); + } + + @Test + public void testInit() { + RC4 testRc4 = new RC4(); + testRc4.init(KEY); + Assert.assertNotNull("L'initialisation ne devrait pas produire un tableau nul", testRc4); + } + + @Test(expected = IllegalArgumentException.class) + public void testInitWithNullKey() { + rc4.init(null); + } + + @Test(expected = IllegalArgumentException.class) + public void testInitWithEmptyKey() { + rc4.init(""); + } + + @Test + public void testEncrypt() { + String encrypted = rc4.encrypt(CLEAR_TEXT); + Assert.assertEquals("Le texte chiffré ne correspond pas au résultat attendu", + ENCRYPTED_TEXT, encrypted); + } + + @Test + public void testEncryptEmptyString() { + try { + rc4.encrypt(""); + Assert.fail("Une chaîne vide devrait lever une exception"); + } catch (IllegalArgumentException e) { + Assert.assertTrue(true); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testEncryptNull() { + rc4.encrypt(null); + } + + @Test + public void testDecrypt() { + String decrypted = rc4.decrypt(ENCRYPTED_TEXT); + Assert.assertEquals("Le texte déchiffré ne correspond pas au texte original", + CLEAR_TEXT, decrypted); + } + + @Test + public void testDecryptEmptyString() { + try { + rc4.decrypt(""); + Assert.fail("Une chaîne vide devrait lever une exception"); + } catch (IllegalArgumentException e) { + Assert.assertTrue(true); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testDecryptNull() { + rc4.decrypt(null); + } + + @Test + public void testFullCycle() { + String encrypted = rc4.encrypt(CLEAR_TEXT); + rc4.init(KEY); // Réinitialisation nécessaire pour le déchiffrement + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le cycle complet de chiffrement/déchiffrement a échoué", + CLEAR_TEXT, decrypted); + } + + @Test + public void testDifferentKeys() { + String encrypted1 = rc4.encrypt(CLEAR_TEXT); + rc4.init("5678"); // Utilisation d'une clé différente + String encrypted2 = rc4.encrypt(CLEAR_TEXT); + Assert.assertNotEquals("Des clés différentes devraient produire des chiffrements différents", + encrypted1, encrypted2); + } + + @Test + public void testConsistentEncryption() { + String encrypted1 = rc4.encrypt(CLEAR_TEXT); + rc4.init(KEY); + String encrypted2 = rc4.encrypt(CLEAR_TEXT); + Assert.assertEquals("Le même texte avec la même clé devrait produire le même chiffrement", + encrypted1, encrypted2); + } + + @Test + public void testLongText() { + String longText = "This is a longer text that should also work properly with RC4 encryption!"; + String encrypted = rc4.encrypt(longText); + rc4.init(KEY); + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le chiffrement/déchiffrement d'un texte long a échoué", + longText, decrypted); + } + + @Test + public void testSpecialCharacters() { + String specialText = "Hello! @#$%^&*()_+ World"; + String encrypted = rc4.encrypt(specialText); + rc4.init(KEY); + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le chiffrement/déchiffrement avec caractères spéciaux a échoué", + specialText, decrypted); + } +} \ No newline at end of file From 78321e20f2659810244aaf08dd36de3461a6941a Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:42 +0100 Subject: [PATCH 05/77] =?UTF-8?q?feat=20:=20Ajout=20d'un=20workflow=20GitH?= =?UTF-8?q?ub=20Actions=20pour=20ex=C3=A9cuter=20des=20tests=20JUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 56 +++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 57 insertions(+) create mode 100644 .github/workflows/tests.yml create mode 100644 README.md diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..cfc8b1e --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,56 @@ +name: Java CI with JUnit Tests + +on: + push: + branches: [ "main", "master" ] + pull_request: + branches: [ "main", "master" ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + + - name: Download Dependencies + run: | + mkdir -p lib + wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ + wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ + + - name: Compile + run: | + mkdir -p out + # Compile main classes + javac -cp "lib/*" -d out src/main/Classes/*.java + # Compile test classes + javac -cp "out:lib/*" -d out src/tests/Tests/*.java + + - name: Run tests + run: | + # Trouve tous les fichiers *Test.java, les convertit en noms de classes et les exécute + TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + + - name: Generate Test Report + if: always() + run: | + echo "# Test Results" > test-report.md + echo "\`\`\`" >> test-report.md + TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + echo "\`\`\`" >> test-report.md + + - name: Upload Test Report + if: always() + uses: actions/upload-artifact@v3 + with: + name: test-report + path: test-report.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef3791f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +![Tests](https://github.com/Bilnaa/ByteWarden/actions/workflows/tests.yml/badge.svg) \ No newline at end of file From 4ae035660913371734c37518b1386ea6c2e524a5 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Tue, 17 Dec 2024 22:03:25 +0100 Subject: [PATCH 06/77] Add LFSR class Add Lfsr class with 2 operating modes: fibonacci, galois galois for shifting generating fibonacci for binary parity generating --- src/Classes/Lfsr.java | 78 +++++++++++++++++++++++++++++++++++++++++++ src/Main.java | 12 +++++-- 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/Classes/Lfsr.java diff --git a/src/Classes/Lfsr.java b/src/Classes/Lfsr.java new file mode 100644 index 0000000..be71b8f --- /dev/null +++ b/src/Classes/Lfsr.java @@ -0,0 +1,78 @@ +package Classes; + +public class Lfsr { + char state; + char taps; + + public Lfsr(char state, char taps) { + this.state = state; //représente l'état actuel du LFSR sous forme d'un entier (char sur 16 bits) + this.taps = taps; //mask indiquant les positions (bits) pour la rétroactio + } + //méthode calculant la parité d'un nombre (nombre de bits à 1) pour déterminer le bit de rétroaction + static int parity(int mask) { + int p = 0; + for ( ; mask > 0 ; mask >>>= 1) + p ^= mask & 1; + return p; + } + //méthode convertissant un entier en chaîne convertoraire de 16 bits. + static String convertor(int registers) { + return String.format("%16s", + Integer.toBinaryString(registers)).replace(" ", "0"); //affiche un chaine de 16bits en laissant le bit de point fort s'il est égale à 0 + } + + public String fibonacci(int loops) { + String alea = ""; + for (int i = 0 ; i < loops ; i++) { + System.out.println("Debug info: state = " + convertor(this.state)); + int bit = Lfsr.parity(this.state & this.taps); //calcul le mask à partir du XOR + System.out.println("bit = " + bit); + alea += this.state & 1; // recupère le bit de poids faible + this.state >>= 1; //decalage des bits sur la droite + this.state |= bit << 15; //remet le bit de poids faible 15 positions à gauche (dernier bit) + } + return alea; + } + + public String galois(int loops) { + String alea = ""; + for (int i = 0 ; i < loops ; i++) { + System.out.println("Debug info: state = " + convertor(this.state)); + int bit = this.state & 1; //récuère le bit de poids faible + alea += bit; + this.state >>= 1; //décalage des bits sur la droite + if (bit == 1) //si le bit de poids faible est 1 on modifie le l'état par la porte Xor + this.state ^= this.taps; + } + return alea; + } + + + /*** + * + * + * @param tapsHex une valeur indiquant la position du bit en hexa + * @param loops nombre de boucle pour les methodes galois et fibonacci + * @param seedHex seed pour l'algorythme + * @param mode choix entre les deux méthodes galois et fibonacci + * @return un resultat (alea) en 16 bits + */ + public String lfsr(String tapsHex, int loops, String seedHex, String mode) { + char taps = (char) Integer.parseInt(tapsHex, 16); + char seed = (char) Integer.parseInt(seedHex, 16); + + this.state = seed; + this.taps = taps; + + String result; + if (mode.equalsIgnoreCase("galois")) { //Execute la méthode en fonctionne du choix de fonction de transformation + result = this.galois(loops); + } else { + result = this.fibonacci(loops); + } + + return result; + } + +} + diff --git a/src/Main.java b/src/Main.java index d5238c9..5a2785e 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,13 @@ +import Classes.Lfsr; + public class Main { - public static void main(String[] args) { - System.out.println("Hello, World!"); + public static void main(String args[]) { + String tapsHex = "8005"; + int loops = 10; + String seedHex = "1"; + String mode = "galois"; + Lfsr lfsr = new Lfsr((char) 0, (char) 0); + String result = lfsr.lfsr(tapsHex, loops, seedHex, mode); + System.out.println(result); } } \ No newline at end of file From c44cebef5bfddf248160dfe57add3002e0f3dccc Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:03:53 +0100 Subject: [PATCH 07/77] feat : Ajout de la branche 'develop' au workflow GitHub Actions pour les tests JUnit --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cfc8b1e..7a48276 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Java CI with JUnit Tests on: push: - branches: [ "main", "master" ] + branches: [ "main", "master", "develop" ] pull_request: - branches: [ "main", "master" ] + branches: [ "main", "master", "develop" ] jobs: test: From e6d4041f9240eeabb8eb6a318e828cbb59b620ee Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:04:12 +0100 Subject: [PATCH 08/77] =?UTF-8?q?feat=20:=20Mise=20=C3=A0=20jour=20des=20b?= =?UTF-8?q?ranches=20surveill=C3=A9es=20dans=20le=20workflow=20GitHub=20Ac?= =?UTF-8?q?tions=20pour=20les=20tests=20JUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7a48276..e5b61c2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Java CI with JUnit Tests on: push: - branches: [ "main", "master", "develop" ] + branches: [ "main", "develop" ] pull_request: - branches: [ "main", "master", "develop" ] + branches: [ "main", "develop" ] jobs: test: From 210a056cf8e33c986c5babb0fb280d2acbe512af Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Tue, 17 Dec 2024 22:12:09 +0100 Subject: [PATCH 09/77] Fix parameter name changed the parameter name --- src/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Main.java b/src/Main.java index 5a2785e..7719247 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,7 +1,7 @@ import Classes.Lfsr; public class Main { - public static void main(String args[]) { + public static void main(String[] args) { String tapsHex = "8005"; int loops = 10; String seedHex = "1"; From 9afe3dc8fac578b5e7543a583681eaea34e9f00e Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:13:14 +0100 Subject: [PATCH 10/77] =?UTF-8?q?feat=20:=20Am=C3=A9lioration=20du=20workf?= =?UTF-8?q?low=20GitHub=20Actions=20pour=20la=20compilation=20et=20l'ex?= =?UTF-8?q?=C3=A9cution=20des=20tests=20JUnit=20avec=20gestion=20des=20fic?= =?UTF-8?q?hiers=20manquants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 46 +++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e5b61c2..8929af4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,6 +19,13 @@ jobs: java-version: '11' distribution: 'temurin' + - name: Show Project Structure + run: | + echo "Current directory:" + pwd + echo "Directory contents:" + ls -R + - name: Download Dependencies run: | mkdir -p lib @@ -28,16 +35,37 @@ jobs: - name: Compile run: | mkdir -p out - # Compile main classes - javac -cp "lib/*" -d out src/main/Classes/*.java - # Compile test classes - javac -cp "out:lib/*" -d out src/tests/Tests/*.java + # Liste et compile les fichiers principaux + MAIN_FILES=$(find src/Classes -name "*.java") + if [ ! -z "$MAIN_FILES" ]; then + echo "Compiling main files:" + echo "$MAIN_FILES" + javac -cp "lib/*" -d out $MAIN_FILES + else + echo "No main files found" + fi + + # Liste et compile les fichiers de test + TEST_FILES=$(find src/Tests -name "*.java") + if [ ! -z "$TEST_FILES" ]; then + echo "Compiling test files:" + echo "$TEST_FILES" + javac -cp "out:lib/*" -d out $TEST_FILES + else + echo "No test files found" + fi - name: Run tests run: | - # Trouve tous les fichiers *Test.java, les convertit en noms de classes et les exécute + # Trouve et exécute tous les tests TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') - java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + if [ ! -z "$TEST_CLASSES" ]; then + echo "Running test classes:" + echo "$TEST_CLASSES" + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + else + echo "No test classes found" + fi - name: Generate Test Report if: always() @@ -45,7 +73,11 @@ jobs: echo "# Test Results" > test-report.md echo "\`\`\`" >> test-report.md TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') - java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + if [ ! -z "$TEST_CLASSES" ]; then + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + else + echo "No test classes found" >> test-report.md + fi echo "\`\`\`" >> test-report.md - name: Upload Test Report From 7aad04bc8db2a9be68f4f98ad4c4670cf816bac9 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 15:51:25 +0100 Subject: [PATCH 11/77] =?UTF-8?q?feat=20:=20Ajout=20de=20JUnit4=20comme=20?= =?UTF-8?q?biblioth=C3=A8que=20de=20test=20et=20cr=C3=A9ation=20d'un=20tes?= =?UTF-8?q?t=20unitaire=20de=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ByteWarden.iml | 10 ++++++++++ src/Tests/SampleTest.java | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/Tests/SampleTest.java diff --git a/ByteWarden.iml b/ByteWarden.iml index c90834f..c3dc060 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -7,5 +7,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Tests/SampleTest.java b/src/Tests/SampleTest.java new file mode 100644 index 0000000..1172470 --- /dev/null +++ b/src/Tests/SampleTest.java @@ -0,0 +1,11 @@ +package Tests; +import org.junit.Assert; +import org.junit.Test; + +public class SampleTest { + @Test + public void firstTest() { + System.out.println("Les tests se passent bien !"); + Assert.assertTrue(true); + } +} From 81ffd421c863a9b17403dd60ebf1d1f825c570e8 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:22:16 +0100 Subject: [PATCH 12/77] revert : back to init state --- src/Main.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Main.java b/src/Main.java index 7719247..d5238c9 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,13 +1,5 @@ -import Classes.Lfsr; - public class Main { public static void main(String[] args) { - String tapsHex = "8005"; - int loops = 10; - String seedHex = "1"; - String mode = "galois"; - Lfsr lfsr = new Lfsr((char) 0, (char) 0); - String result = lfsr.lfsr(tapsHex, loops, seedHex, mode); - System.out.println(result); + System.out.println("Hello, World!"); } } \ No newline at end of file From 93f8d69e8b967f9cdb703aa16cb6450f51d1f340 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:34:34 +0100 Subject: [PATCH 13/77] chore : make the methods public for tests and future implementations and usage of english --- src/Classes/Lfsr.java | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/Classes/Lfsr.java b/src/Classes/Lfsr.java index be71b8f..4abebe3 100644 --- a/src/Classes/Lfsr.java +++ b/src/Classes/Lfsr.java @@ -5,31 +5,31 @@ public class Lfsr { char taps; public Lfsr(char state, char taps) { - this.state = state; //représente l'état actuel du LFSR sous forme d'un entier (char sur 16 bits) - this.taps = taps; //mask indiquant les positions (bits) pour la rétroactio + this.state = state; //represents the current state of the LFSR as a 16-bit integer (char) + this.taps = taps; //mask indicating the positions (bits) for feedback } - //méthode calculant la parité d'un nombre (nombre de bits à 1) pour déterminer le bit de rétroaction - static int parity(int mask) { + //method calculating the parity of a number (number of bits set to 1) to determine the feedback bit + public static int parity(int mask) { int p = 0; for ( ; mask > 0 ; mask >>>= 1) p ^= mask & 1; return p; } - //méthode convertissant un entier en chaîne convertoraire de 16 bits. - static String convertor(int registers) { + //method converting an integer to a 16-bit binary string + public static String convertor(int registers) { return String.format("%16s", - Integer.toBinaryString(registers)).replace(" ", "0"); //affiche un chaine de 16bits en laissant le bit de point fort s'il est égale à 0 + Integer.toBinaryString(registers)).replace(" ", "0"); //displays a 16-bit string, keeping the leading zero if it is 0 } public String fibonacci(int loops) { String alea = ""; for (int i = 0 ; i < loops ; i++) { System.out.println("Debug info: state = " + convertor(this.state)); - int bit = Lfsr.parity(this.state & this.taps); //calcul le mask à partir du XOR + int bit = Lfsr.parity(this.state & this.taps); //calculates the mask from the XOR System.out.println("bit = " + bit); - alea += this.state & 1; // recupère le bit de poids faible - this.state >>= 1; //decalage des bits sur la droite - this.state |= bit << 15; //remet le bit de poids faible 15 positions à gauche (dernier bit) + alea += this.state & 1; // retrieves the least significant bit + this.state >>= 1; //shifts the bits to the right + this.state |= bit << 15; //sets the least significant bit 15 positions to the left (last bit) } return alea; } @@ -38,10 +38,10 @@ public String galois(int loops) { String alea = ""; for (int i = 0 ; i < loops ; i++) { System.out.println("Debug info: state = " + convertor(this.state)); - int bit = this.state & 1; //récuère le bit de poids faible + int bit = this.state & 1; //retrieves the least significant bit alea += bit; - this.state >>= 1; //décalage des bits sur la droite - if (bit == 1) //si le bit de poids faible est 1 on modifie le l'état par la porte Xor + this.state >>= 1; //shifts the bits to the right + if (bit == 1) //if the least significant bit is 1, modifies the state with the XOR gate this.state ^= this.taps; } return alea; @@ -51,11 +51,11 @@ public String galois(int loops) { /*** * * - * @param tapsHex une valeur indiquant la position du bit en hexa - * @param loops nombre de boucle pour les methodes galois et fibonacci - * @param seedHex seed pour l'algorythme - * @param mode choix entre les deux méthodes galois et fibonacci - * @return un resultat (alea) en 16 bits + * @param tapsHex a value indicating the bit position in hex + * @param loops number of loops for the galois and fibonacci methods + * @param seedHex seed for the algorithm + * @param mode choice between the two methods galois and fibonacci + * @return a result (alea) in 16 bits */ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { char taps = (char) Integer.parseInt(tapsHex, 16); @@ -65,7 +65,7 @@ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { this.taps = taps; String result; - if (mode.equalsIgnoreCase("galois")) { //Execute la méthode en fonctionne du choix de fonction de transformation + if (mode.equalsIgnoreCase("galois")) { //Executes the method based on the chosen transformation function result = this.galois(loops); } else { result = this.fibonacci(loops); @@ -75,4 +75,3 @@ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { } } - From 52010133f091f0caa3caf9f25d864a969b1f70f4 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:35:32 +0100 Subject: [PATCH 14/77] chore : added tests for the lfsr --- src/Tests/LfsrTest.java | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/Tests/LfsrTest.java diff --git a/src/Tests/LfsrTest.java b/src/Tests/LfsrTest.java new file mode 100644 index 0000000..86a58a8 --- /dev/null +++ b/src/Tests/LfsrTest.java @@ -0,0 +1,102 @@ +package Tests; + +import Classes.Lfsr; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +public class LfsrTest { + private Lfsr lfsr; + + @Before + public void setUp() { + lfsr = new Lfsr((char) 0, (char) 0); + } + + @Test + public void testParity() { + // Test the parity (XOR of all bits) + assertEquals(0, Lfsr.parity(0)); // 0000 -> parity 0 + assertEquals(1, Lfsr.parity(1)); // 0001 -> parity 1 + assertEquals(0, Lfsr.parity(3)); // 0011 -> parity 0 (1 XOR 1 = 0) + assertEquals(1, Lfsr.parity(7)); // 0111 -> parity 1 (1 XOR 1 XOR 1 = 1) + assertEquals(0, Lfsr.parity(15)); // 1111 -> parity 0 (1 XOR 1 XOR 1 XOR 1 = 0) + } + + @Test + public void testConvertor() { + assertEquals("0000000000000000", Lfsr.convertor(0)); + assertEquals("0000000000000001", Lfsr.convertor(1)); + assertEquals("0000000000001111", Lfsr.convertor(15)); + } + + @Test + public void testFibonacciBasic() { + lfsr = new Lfsr((char) 1, (char) 1); // Simple initial state + String result = lfsr.fibonacci(4); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testGaloisBasic() { + lfsr = new Lfsr((char) 1, (char) 1); // Simple initial state + String result = lfsr.galois(4); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testLfsrBasicOperation() { + // Test with simple values + String result = lfsr.lfsr("1", 4, "1", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testDifferentModes() { + String galoisResult = lfsr.lfsr("1", 4, "1", "galois"); + String fibonacciResult = lfsr.lfsr("1", 4, "1", "fibonacci"); + // The results should be different for the two modes + assertNotEquals(galoisResult, fibonacciResult); + } + + @Test + public void testOutputLength() { + String result4 = lfsr.lfsr("1", 4, "1", "galois"); + String result8 = lfsr.lfsr("1", 8, "1", "galois"); + assertEquals(4, result4.length()); + assertEquals(8, result8.length()); + } + + @Test + public void testConsistency() { + // The same input should give the same output + String result1 = lfsr.lfsr("1", 4, "1", "galois"); + String result2 = lfsr.lfsr("1", 4, "1", "galois"); + assertEquals(result1, result2); + } + + @Test + public void testModeInsensitiveCase() { + String result1 = lfsr.lfsr("1", 4, "1", "GALOIS"); + String result2 = lfsr.lfsr("1", 4, "1", "galois"); + assertEquals(result1, result2); + } + + @Test + public void testWithZeroTaps() { + String result = lfsr.lfsr("0", 4, "1", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testWithZeroSeed() { + String result = lfsr.lfsr("1", 4, "0", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + assertEquals("0000", result); // With seed 0, the output should be all 0s + } +} \ No newline at end of file From 7c8766700e8ccf09ee21b46553eb202d554c324b Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:39:30 +0100 Subject: [PATCH 15/77] chore : usage of english is mandatory --- src/Classes/MD5.java | 50 +++++++++++++++++++++--------------------- src/Classes/RC4.java | 42 +++++++++++++++++------------------ src/Tests/MD5Test.java | 8 +++---- src/Tests/RC4Test.java | 24 ++++++++++---------- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java index 34d2b90..4e6a6ae 100644 --- a/src/Classes/MD5.java +++ b/src/Classes/MD5.java @@ -5,11 +5,11 @@ public class MD5 { /** - * Calcule le hash MD5 d'une chaîne de caractères. - * @param input La chaîne à hasher - * @return Le hash MD5 en hexadécimal (32 caractères) - * @throws IllegalArgumentException si input est null - * @throws RuntimeException si une erreur survient pendant le hachage + * Computes the MD5 hash of a string. + * @param input The string to hash + * @return The MD5 hash in hexadecimal (32 characters) + * @throws IllegalArgumentException if input is null + * @throws RuntimeException if an error occurs during hashing */ public static String hash(String input) { if (input == null) { @@ -17,39 +17,39 @@ public static String hash(String input) { } try { - // Obtention d'une instance de MessageDigest configurée pour MD5 - // MessageDigest est une classe qui implémente l'algorithme de hachage + // Get an instance of MessageDigest configured for MD5 + // MessageDigest is a class that implements the hashing algorithm MessageDigest md = MessageDigest.getInstance("MD5"); - // Conversion de la chaîne d'entrée en tableau de bytes avec l'encodage UTF-8 - // puis calcul du hash MD5 sur ces bytes - // Le résultat est un tableau de 16 bytes (128 bits, taille standard MD5) + // Convert the input string to a byte array using UTF-8 encoding + // then compute the MD5 hash of these bytes + // The result is a 16-byte array (128 bits, standard MD5 size) byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); - // Création d'un StringBuilder pour construire la représentation hexadécimale - // Il sera plus efficace qu'une simple String pour les concaténations + // Create a StringBuilder to build the hexadecimal representation + // It will be more efficient than a simple String for concatenations StringBuilder hexString = new StringBuilder(); - // Pour chaque byte du hash MD5 + // For each byte of the MD5 hash for (byte b : messageDigest) { - // String.format("%02x", b & 0xff) fait plusieurs choses : - // 1. b & 0xff : convertit le byte en un entier non signé (0-255) - // car les bytes en Java sont signés (-128 à 127) - // 2. %02x : formate l'entier en hexadécimal sur 2 positions - // - % indique le début du format - // - 0 indique de remplir avec des zéros - // - 2 indique la largeur minimale - // - x indique la notation hexadécimale en minuscules + // String.format("%02x", b & 0xff) does several things: + // 1. b & 0xff: converts the byte to an unsigned integer (0-255) + // because bytes in Java are signed (-128 to 127) + // 2. %02x: formats the integer in hexadecimal with 2 positions + // - % indicates the start of the format + // - 0 indicates to pad with zeros + // - 2 indicates the minimum width + // - x indicates lowercase hexadecimal notation hexString.append(String.format("%02x", b & 0xff)); } - // Conversion finale du StringBuilder en String - // Le résultat sera une chaîne de 32 caractères hexadécimaux + // Final conversion of the StringBuilder to a String + // The result will be a 32-character hexadecimal string return hexString.toString(); } catch (Exception e) { - // En cas d'erreur (très rare car MD5 est un algorithme standard) - // on encapsule l'exception dans une RuntimeException + // In case of an error (very rare as MD5 is a standard algorithm) + // we encapsulate the exception in a RuntimeException throw new RuntimeException("Error computing MD5 hash", e); } } diff --git a/src/Classes/RC4.java b/src/Classes/RC4.java index 1ab7a15..dd9f3c7 100644 --- a/src/Classes/RC4.java +++ b/src/Classes/RC4.java @@ -6,20 +6,20 @@ public class RC4 { private int[] T = new int[256]; public String key = ""; - // Initialisation du tableau S et du tableau T avec la clé + // Initialization of S and T arrays with the key public void init(String key) { if (key == null || key.isEmpty()) { - throw new IllegalArgumentException("La clé ne peut pas être nulle ou vide"); + throw new IllegalArgumentException("The key cannot be null or empty"); } this.key = key; - // Initialisation des tableaux S et T + // Initialize S and T arrays for (int i = 0; i < 256; i++) { S[i] = i; T[i] = key.charAt(i % key.length()); } - // Permutation initiale de S + // Initial permutation of S int j = 0; for (int i = 0; i < 256; i++) { j = (j + S[i] + T[i]) & 0xFF; @@ -27,40 +27,40 @@ public void init(String key) { } } - // Chiffrement du texte clair + // Encrypt the plaintext public String encrypt(String clearText) { if (clearText == null || clearText.isEmpty()) { - throw new IllegalArgumentException("Le texte à chiffrer ne peut pas être nul ou vide"); + throw new IllegalArgumentException("The text to encrypt cannot be null or empty"); } - // Réinitialisation pour assurer un état propre + // Reinitialize to ensure a clean state init(this.key); StringBuilder encrypted = new StringBuilder(); int i = 0, j = 0; - // Pour chaque caractère du texte clair + // For each character in the plaintext for (int n = 0; n < clearText.length(); n++) { char c = clearText.charAt(n); - // On incrémente i modulo 256 + // Increment i modulo 256 i = (i + 1) & 0xFF; - // On incrémente j modulo 256 + // Increment j modulo 256 j = (j + S[i]) & 0xFF; - // On échange S[i] et S[j] + // Swap S[i] and S[j] swap(i, j); - // On calcule t + // Calculate t int t = (S[i] + S[j]) & 0xFF; - // On récupère la valeur de S[t] + // Get the value of S[t] int k = S[t]; - // On chiffre le caractère + // Encrypt the character int encryptedByte = c ^ k; - // Conversion en binaire avec padding de 0 + // Convert to binary with zero padding encrypted.append(String.format("%8s", Integer.toBinaryString(encryptedByte & 0xFF)) .replace(' ', '0')); - // Ajout d'espace sauf pour le dernier caractère + // Add space except for the last character if (n < clearText.length() - 1) { encrypted.append(" "); } @@ -69,20 +69,20 @@ public String encrypt(String clearText) { return encrypted.toString(); } - // Déchiffrement du texte chiffré + // Decrypt the encrypted text public String decrypt(String encryptedText) { if (encryptedText == null || encryptedText.isEmpty()) { - throw new IllegalArgumentException("Le texte chiffré ne peut pas être nul ou vide"); + throw new IllegalArgumentException("The encrypted text cannot be null or empty"); } - // Réinitialisation pour assurer un état propre + // Reinitialize to ensure a clean state init(this.key); StringBuilder decrypted = new StringBuilder(); String[] binaryStrings = encryptedText.split(" "); int i = 0, j = 0; - // Pour chaque octet du texte chiffré + // For each byte in the encrypted text for (String binaryString : binaryStrings) { char c = (char) Integer.parseInt(binaryString, 2); i = (i + 1) & 0xFF; @@ -96,7 +96,7 @@ public String decrypt(String encryptedText) { return decrypted.toString(); } - // Fonction d'échange de deux éléments dans le tableau S + // Swap function to exchange two elements in the S array private void swap(int i, int j) { int temp = S[i]; S[i] = S[j]; diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java index 7eb8f58..208c99a 100644 --- a/src/Tests/MD5Test.java +++ b/src/Tests/MD5Test.java @@ -41,7 +41,7 @@ public void testConsistency() { String input = "test123"; String firstHash = MD5.hash(input); String secondHash = MD5.hash(input); - Assert.assertEquals("Le même input devrait produire le même hash", firstHash, secondHash); + Assert.assertEquals("The same input should produce the same hash", firstHash, secondHash); } @Test(expected = RuntimeException.class) @@ -53,14 +53,14 @@ public void testNullInput() { public void testCaseSensitivity() { String lowerCase = MD5.hash("hello"); String upperCase = MD5.hash("HELLO"); - Assert.assertNotEquals("Les hashs de différentes casses devraient être différents", + Assert.assertNotEquals("Hashes of different cases should be different", lowerCase, upperCase); } @Test public void testHashLength() { String result = MD5.hash("test"); - Assert.assertEquals("La longueur du hash MD5 devrait être de 32 caractères", + Assert.assertEquals("The length of the MD5 hash should be 32 characters", 32, result.length()); } @@ -68,7 +68,7 @@ public void testHashLength() { public void testWhitespaceHandling() { String withSpaces = MD5.hash("test test"); String withoutSpaces = MD5.hash("testtest"); - Assert.assertNotEquals("Les espaces devraient affecter le hash", + Assert.assertNotEquals("Spaces should affect the hash", withSpaces, withoutSpaces); } } \ No newline at end of file diff --git a/src/Tests/RC4Test.java b/src/Tests/RC4Test.java index 4e8fc2c..558e41f 100644 --- a/src/Tests/RC4Test.java +++ b/src/Tests/RC4Test.java @@ -22,7 +22,7 @@ public void setUp() { public void testInit() { RC4 testRc4 = new RC4(); testRc4.init(KEY); - Assert.assertNotNull("L'initialisation ne devrait pas produire un tableau nul", testRc4); + Assert.assertNotNull("Initialization should not produce a null array", testRc4); } @Test(expected = IllegalArgumentException.class) @@ -38,7 +38,7 @@ public void testInitWithEmptyKey() { @Test public void testEncrypt() { String encrypted = rc4.encrypt(CLEAR_TEXT); - Assert.assertEquals("Le texte chiffré ne correspond pas au résultat attendu", + Assert.assertEquals("The encrypted text does not match the expected result", ENCRYPTED_TEXT, encrypted); } @@ -46,7 +46,7 @@ public void testEncrypt() { public void testEncryptEmptyString() { try { rc4.encrypt(""); - Assert.fail("Une chaîne vide devrait lever une exception"); + Assert.fail("An empty string should throw an exception"); } catch (IllegalArgumentException e) { Assert.assertTrue(true); } @@ -60,7 +60,7 @@ public void testEncryptNull() { @Test public void testDecrypt() { String decrypted = rc4.decrypt(ENCRYPTED_TEXT); - Assert.assertEquals("Le texte déchiffré ne correspond pas au texte original", + Assert.assertEquals("The decrypted text does not match the original text", CLEAR_TEXT, decrypted); } @@ -68,7 +68,7 @@ public void testDecrypt() { public void testDecryptEmptyString() { try { rc4.decrypt(""); - Assert.fail("Une chaîne vide devrait lever une exception"); + Assert.fail("An empty string should throw an exception"); } catch (IllegalArgumentException e) { Assert.assertTrue(true); } @@ -82,18 +82,18 @@ public void testDecryptNull() { @Test public void testFullCycle() { String encrypted = rc4.encrypt(CLEAR_TEXT); - rc4.init(KEY); // Réinitialisation nécessaire pour le déchiffrement + rc4.init(KEY); // Reinitialization needed for decryption String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le cycle complet de chiffrement/déchiffrement a échoué", + Assert.assertEquals("The full encryption/decryption cycle failed", CLEAR_TEXT, decrypted); } @Test public void testDifferentKeys() { String encrypted1 = rc4.encrypt(CLEAR_TEXT); - rc4.init("5678"); // Utilisation d'une clé différente + rc4.init("5678"); // Using a different key String encrypted2 = rc4.encrypt(CLEAR_TEXT); - Assert.assertNotEquals("Des clés différentes devraient produire des chiffrements différents", + Assert.assertNotEquals("Different keys should produce different encryptions", encrypted1, encrypted2); } @@ -102,7 +102,7 @@ public void testConsistentEncryption() { String encrypted1 = rc4.encrypt(CLEAR_TEXT); rc4.init(KEY); String encrypted2 = rc4.encrypt(CLEAR_TEXT); - Assert.assertEquals("Le même texte avec la même clé devrait produire le même chiffrement", + Assert.assertEquals("The same text with the same key should produce the same encryption", encrypted1, encrypted2); } @@ -112,7 +112,7 @@ public void testLongText() { String encrypted = rc4.encrypt(longText); rc4.init(KEY); String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le chiffrement/déchiffrement d'un texte long a échoué", + Assert.assertEquals("Encryption/decryption of a long text failed", longText, decrypted); } @@ -122,7 +122,7 @@ public void testSpecialCharacters() { String encrypted = rc4.encrypt(specialText); rc4.init(KEY); String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le chiffrement/déchiffrement avec caractères spéciaux a échoué", + Assert.assertEquals("Encryption/decryption with special characters failed", specialText, decrypted); } } \ No newline at end of file From 77c32ce03cf5dd0b010fe67d611e5e4257742cd0 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:25 +0100 Subject: [PATCH 16/77] feat : Ajout des classes MD5 et RC4 pour le hachage et le chiffrement --- src/Classes/MD5.java | 56 +++++++++++++++++++++++ src/Classes/RC4.java | 105 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 src/Classes/MD5.java create mode 100644 src/Classes/RC4.java diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java new file mode 100644 index 0000000..34d2b90 --- /dev/null +++ b/src/Classes/MD5.java @@ -0,0 +1,56 @@ +package Classes; + +import java.security.MessageDigest; +import java.nio.charset.StandardCharsets; + +public class MD5 { + /** + * Calcule le hash MD5 d'une chaîne de caractères. + * @param input La chaîne à hasher + * @return Le hash MD5 en hexadécimal (32 caractères) + * @throws IllegalArgumentException si input est null + * @throws RuntimeException si une erreur survient pendant le hachage + */ + public static String hash(String input) { + if (input == null) { + throw new IllegalArgumentException("Input cannot be null"); + } + + try { + // Obtention d'une instance de MessageDigest configurée pour MD5 + // MessageDigest est une classe qui implémente l'algorithme de hachage + MessageDigest md = MessageDigest.getInstance("MD5"); + + // Conversion de la chaîne d'entrée en tableau de bytes avec l'encodage UTF-8 + // puis calcul du hash MD5 sur ces bytes + // Le résultat est un tableau de 16 bytes (128 bits, taille standard MD5) + byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); + + // Création d'un StringBuilder pour construire la représentation hexadécimale + // Il sera plus efficace qu'une simple String pour les concaténations + StringBuilder hexString = new StringBuilder(); + + // Pour chaque byte du hash MD5 + for (byte b : messageDigest) { + // String.format("%02x", b & 0xff) fait plusieurs choses : + // 1. b & 0xff : convertit le byte en un entier non signé (0-255) + // car les bytes en Java sont signés (-128 à 127) + // 2. %02x : formate l'entier en hexadécimal sur 2 positions + // - % indique le début du format + // - 0 indique de remplir avec des zéros + // - 2 indique la largeur minimale + // - x indique la notation hexadécimale en minuscules + hexString.append(String.format("%02x", b & 0xff)); + } + + // Conversion finale du StringBuilder en String + // Le résultat sera une chaîne de 32 caractères hexadécimaux + return hexString.toString(); + + } catch (Exception e) { + // En cas d'erreur (très rare car MD5 est un algorithme standard) + // on encapsule l'exception dans une RuntimeException + throw new RuntimeException("Error computing MD5 hash", e); + } + } +} \ No newline at end of file diff --git a/src/Classes/RC4.java b/src/Classes/RC4.java new file mode 100644 index 0000000..1ab7a15 --- /dev/null +++ b/src/Classes/RC4.java @@ -0,0 +1,105 @@ +package Classes; + +public class RC4 { + + private int[] S = new int[256]; + private int[] T = new int[256]; + public String key = ""; + + // Initialisation du tableau S et du tableau T avec la clé + public void init(String key) { + if (key == null || key.isEmpty()) { + throw new IllegalArgumentException("La clé ne peut pas être nulle ou vide"); + } + this.key = key; + + // Initialisation des tableaux S et T + for (int i = 0; i < 256; i++) { + S[i] = i; + T[i] = key.charAt(i % key.length()); + } + + // Permutation initiale de S + int j = 0; + for (int i = 0; i < 256; i++) { + j = (j + S[i] + T[i]) & 0xFF; + swap(i, j); + } + } + + // Chiffrement du texte clair + public String encrypt(String clearText) { + if (clearText == null || clearText.isEmpty()) { + throw new IllegalArgumentException("Le texte à chiffrer ne peut pas être nul ou vide"); + } + + // Réinitialisation pour assurer un état propre + init(this.key); + + StringBuilder encrypted = new StringBuilder(); + int i = 0, j = 0; + + // Pour chaque caractère du texte clair + for (int n = 0; n < clearText.length(); n++) { + char c = clearText.charAt(n); + // On incrémente i modulo 256 + i = (i + 1) & 0xFF; + // On incrémente j modulo 256 + j = (j + S[i]) & 0xFF; + // On échange S[i] et S[j] + swap(i, j); + // On calcule t + int t = (S[i] + S[j]) & 0xFF; + // On récupère la valeur de S[t] + int k = S[t]; + // On chiffre le caractère + int encryptedByte = c ^ k; + + // Conversion en binaire avec padding de 0 + encrypted.append(String.format("%8s", + Integer.toBinaryString(encryptedByte & 0xFF)) + .replace(' ', '0')); + + // Ajout d'espace sauf pour le dernier caractère + if (n < clearText.length() - 1) { + encrypted.append(" "); + } + } + + return encrypted.toString(); + } + + // Déchiffrement du texte chiffré + public String decrypt(String encryptedText) { + if (encryptedText == null || encryptedText.isEmpty()) { + throw new IllegalArgumentException("Le texte chiffré ne peut pas être nul ou vide"); + } + + // Réinitialisation pour assurer un état propre + init(this.key); + + StringBuilder decrypted = new StringBuilder(); + String[] binaryStrings = encryptedText.split(" "); + int i = 0, j = 0; + + // Pour chaque octet du texte chiffré + for (String binaryString : binaryStrings) { + char c = (char) Integer.parseInt(binaryString, 2); + i = (i + 1) & 0xFF; + j = (j + S[i]) & 0xFF; + swap(i, j); + int t = (S[i] + S[j]) & 0xFF; + int k = S[t]; + decrypted.append((char) (c ^ k)); + } + + return decrypted.toString(); + } + + // Fonction d'échange de deux éléments dans le tableau S + private void swap(int i, int j) { + int temp = S[i]; + S[i] = S[j]; + S[j] = temp; + } +} \ No newline at end of file From 4c4bf57ebc9d84e368aa703ea5c844e692d711c2 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:33 +0100 Subject: [PATCH 17/77] feat : Ajout de tests unitaires pour les classes MD5 et RC4 --- src/Tests/MD5Test.java | 74 ++++++++++++++++++++++++ src/Tests/RC4Test.java | 128 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 src/Tests/MD5Test.java create mode 100644 src/Tests/RC4Test.java diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java new file mode 100644 index 0000000..7eb8f58 --- /dev/null +++ b/src/Tests/MD5Test.java @@ -0,0 +1,74 @@ +package Tests; + +import org.junit.Test; +import org.junit.Assert; +import Classes.MD5; + +public class MD5Test { + + @Test + public void testEmptyString() { + String result = MD5.hash(""); + Assert.assertEquals("d41d8cd98f00b204e9800998ecf8427e", result); + } + + @Test + public void testSimpleString() { + String result = MD5.hash("test"); + Assert.assertEquals("098f6bcd4621d373cade4e832627b4f6", result); + } + + @Test + public void testLongString() { + String result = MD5.hash("The quick brown fox jumps over the lazy dog"); + Assert.assertEquals("9e107d9d372bb6826bd81d3542a419d6", result); + } + + @Test + public void testSpecialCharacters() { + String result = MD5.hash("!@#$%^&*()_+"); + Assert.assertEquals("04dde9f462255fe14b5160bbf2acffe8", result); + } + + @Test + public void testUnicodeCharacters() { + String result = MD5.hash("héllo wörld"); + Assert.assertEquals("ed0c22cc110ede12327851863c078138", result); + } + + @Test + public void testConsistency() { + String input = "test123"; + String firstHash = MD5.hash(input); + String secondHash = MD5.hash(input); + Assert.assertEquals("Le même input devrait produire le même hash", firstHash, secondHash); + } + + @Test(expected = RuntimeException.class) + public void testNullInput() { + MD5.hash(null); + } + + @Test + public void testCaseSensitivity() { + String lowerCase = MD5.hash("hello"); + String upperCase = MD5.hash("HELLO"); + Assert.assertNotEquals("Les hashs de différentes casses devraient être différents", + lowerCase, upperCase); + } + + @Test + public void testHashLength() { + String result = MD5.hash("test"); + Assert.assertEquals("La longueur du hash MD5 devrait être de 32 caractères", + 32, result.length()); + } + + @Test + public void testWhitespaceHandling() { + String withSpaces = MD5.hash("test test"); + String withoutSpaces = MD5.hash("testtest"); + Assert.assertNotEquals("Les espaces devraient affecter le hash", + withSpaces, withoutSpaces); + } +} \ No newline at end of file diff --git a/src/Tests/RC4Test.java b/src/Tests/RC4Test.java new file mode 100644 index 0000000..4e8fc2c --- /dev/null +++ b/src/Tests/RC4Test.java @@ -0,0 +1,128 @@ +package Tests; + +import org.junit.Test; +import org.junit.Before; +import org.junit.Assert; +import Classes.RC4; + +public class RC4Test { + private RC4 rc4; + private static final String KEY = "1234"; + private static final String CLEAR_TEXT = "Hello World"; + private static final String ENCRYPTED_TEXT = "01001101 00101100 00011101 11000011 10011100 11001100 01010000 01100010 01111101 01110111 01100100"; + + @Before + public void setUp() { + rc4 = new RC4(); + rc4.key = KEY; + rc4.init(KEY); + } + + @Test + public void testInit() { + RC4 testRc4 = new RC4(); + testRc4.init(KEY); + Assert.assertNotNull("L'initialisation ne devrait pas produire un tableau nul", testRc4); + } + + @Test(expected = IllegalArgumentException.class) + public void testInitWithNullKey() { + rc4.init(null); + } + + @Test(expected = IllegalArgumentException.class) + public void testInitWithEmptyKey() { + rc4.init(""); + } + + @Test + public void testEncrypt() { + String encrypted = rc4.encrypt(CLEAR_TEXT); + Assert.assertEquals("Le texte chiffré ne correspond pas au résultat attendu", + ENCRYPTED_TEXT, encrypted); + } + + @Test + public void testEncryptEmptyString() { + try { + rc4.encrypt(""); + Assert.fail("Une chaîne vide devrait lever une exception"); + } catch (IllegalArgumentException e) { + Assert.assertTrue(true); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testEncryptNull() { + rc4.encrypt(null); + } + + @Test + public void testDecrypt() { + String decrypted = rc4.decrypt(ENCRYPTED_TEXT); + Assert.assertEquals("Le texte déchiffré ne correspond pas au texte original", + CLEAR_TEXT, decrypted); + } + + @Test + public void testDecryptEmptyString() { + try { + rc4.decrypt(""); + Assert.fail("Une chaîne vide devrait lever une exception"); + } catch (IllegalArgumentException e) { + Assert.assertTrue(true); + } + } + + @Test(expected = IllegalArgumentException.class) + public void testDecryptNull() { + rc4.decrypt(null); + } + + @Test + public void testFullCycle() { + String encrypted = rc4.encrypt(CLEAR_TEXT); + rc4.init(KEY); // Réinitialisation nécessaire pour le déchiffrement + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le cycle complet de chiffrement/déchiffrement a échoué", + CLEAR_TEXT, decrypted); + } + + @Test + public void testDifferentKeys() { + String encrypted1 = rc4.encrypt(CLEAR_TEXT); + rc4.init("5678"); // Utilisation d'une clé différente + String encrypted2 = rc4.encrypt(CLEAR_TEXT); + Assert.assertNotEquals("Des clés différentes devraient produire des chiffrements différents", + encrypted1, encrypted2); + } + + @Test + public void testConsistentEncryption() { + String encrypted1 = rc4.encrypt(CLEAR_TEXT); + rc4.init(KEY); + String encrypted2 = rc4.encrypt(CLEAR_TEXT); + Assert.assertEquals("Le même texte avec la même clé devrait produire le même chiffrement", + encrypted1, encrypted2); + } + + @Test + public void testLongText() { + String longText = "This is a longer text that should also work properly with RC4 encryption!"; + String encrypted = rc4.encrypt(longText); + rc4.init(KEY); + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le chiffrement/déchiffrement d'un texte long a échoué", + longText, decrypted); + } + + @Test + public void testSpecialCharacters() { + String specialText = "Hello! @#$%^&*()_+ World"; + String encrypted = rc4.encrypt(specialText); + rc4.init(KEY); + String decrypted = rc4.decrypt(encrypted); + Assert.assertEquals("Le chiffrement/déchiffrement avec caractères spéciaux a échoué", + specialText, decrypted); + } +} \ No newline at end of file From ed831b0ad548af44222041dbc550fb1bcf60dd8c Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:01:42 +0100 Subject: [PATCH 18/77] =?UTF-8?q?feat=20:=20Ajout=20d'un=20workflow=20GitH?= =?UTF-8?q?ub=20Actions=20pour=20ex=C3=A9cuter=20des=20tests=20JUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 56 +++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 57 insertions(+) create mode 100644 .github/workflows/tests.yml create mode 100644 README.md diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..cfc8b1e --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,56 @@ +name: Java CI with JUnit Tests + +on: + push: + branches: [ "main", "master" ] + pull_request: + branches: [ "main", "master" ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + + - name: Download Dependencies + run: | + mkdir -p lib + wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ + wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ + + - name: Compile + run: | + mkdir -p out + # Compile main classes + javac -cp "lib/*" -d out src/main/Classes/*.java + # Compile test classes + javac -cp "out:lib/*" -d out src/tests/Tests/*.java + + - name: Run tests + run: | + # Trouve tous les fichiers *Test.java, les convertit en noms de classes et les exécute + TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + + - name: Generate Test Report + if: always() + run: | + echo "# Test Results" > test-report.md + echo "\`\`\`" >> test-report.md + TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + echo "\`\`\`" >> test-report.md + + - name: Upload Test Report + if: always() + uses: actions/upload-artifact@v3 + with: + name: test-report + path: test-report.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef3791f --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +![Tests](https://github.com/Bilnaa/ByteWarden/actions/workflows/tests.yml/badge.svg) \ No newline at end of file From 1e26be05c86976067f0d885cf1385e8249e5eb52 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:03:53 +0100 Subject: [PATCH 19/77] feat : Ajout de la branche 'develop' au workflow GitHub Actions pour les tests JUnit --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cfc8b1e..7a48276 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Java CI with JUnit Tests on: push: - branches: [ "main", "master" ] + branches: [ "main", "master", "develop" ] pull_request: - branches: [ "main", "master" ] + branches: [ "main", "master", "develop" ] jobs: test: From f61c5f7c13f9f6315143726517c78d870aa56e09 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:04:12 +0100 Subject: [PATCH 20/77] =?UTF-8?q?feat=20:=20Mise=20=C3=A0=20jour=20des=20b?= =?UTF-8?q?ranches=20surveill=C3=A9es=20dans=20le=20workflow=20GitHub=20Ac?= =?UTF-8?q?tions=20pour=20les=20tests=20JUnit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7a48276..e5b61c2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Java CI with JUnit Tests on: push: - branches: [ "main", "master", "develop" ] + branches: [ "main", "develop" ] pull_request: - branches: [ "main", "master", "develop" ] + branches: [ "main", "develop" ] jobs: test: From ac9961235cd29c346d080ad7b565c541194edb28 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:13:14 +0100 Subject: [PATCH 21/77] =?UTF-8?q?feat=20:=20Am=C3=A9lioration=20du=20workf?= =?UTF-8?q?low=20GitHub=20Actions=20pour=20la=20compilation=20et=20l'ex?= =?UTF-8?q?=C3=A9cution=20des=20tests=20JUnit=20avec=20gestion=20des=20fic?= =?UTF-8?q?hiers=20manquants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/tests.yml | 46 +++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e5b61c2..8929af4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,6 +19,13 @@ jobs: java-version: '11' distribution: 'temurin' + - name: Show Project Structure + run: | + echo "Current directory:" + pwd + echo "Directory contents:" + ls -R + - name: Download Dependencies run: | mkdir -p lib @@ -28,16 +35,37 @@ jobs: - name: Compile run: | mkdir -p out - # Compile main classes - javac -cp "lib/*" -d out src/main/Classes/*.java - # Compile test classes - javac -cp "out:lib/*" -d out src/tests/Tests/*.java + # Liste et compile les fichiers principaux + MAIN_FILES=$(find src/Classes -name "*.java") + if [ ! -z "$MAIN_FILES" ]; then + echo "Compiling main files:" + echo "$MAIN_FILES" + javac -cp "lib/*" -d out $MAIN_FILES + else + echo "No main files found" + fi + + # Liste et compile les fichiers de test + TEST_FILES=$(find src/Tests -name "*.java") + if [ ! -z "$TEST_FILES" ]; then + echo "Compiling test files:" + echo "$TEST_FILES" + javac -cp "out:lib/*" -d out $TEST_FILES + else + echo "No test files found" + fi - name: Run tests run: | - # Trouve tous les fichiers *Test.java, les convertit en noms de classes et les exécute + # Trouve et exécute tous les tests TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') - java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + if [ ! -z "$TEST_CLASSES" ]; then + echo "Running test classes:" + echo "$TEST_CLASSES" + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES + else + echo "No test classes found" + fi - name: Generate Test Report if: always() @@ -45,7 +73,11 @@ jobs: echo "# Test Results" > test-report.md echo "\`\`\`" >> test-report.md TEST_CLASSES=$(find out/Tests -name "*Test.class" | sed 's/out\///' | sed 's/\.class$//' | tr '/' '.') - java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + if [ ! -z "$TEST_CLASSES" ]; then + java -cp "out:lib/*" org.junit.runner.JUnitCore $TEST_CLASSES >> test-report.md 2>&1 || true + else + echo "No test classes found" >> test-report.md + fi echo "\`\`\`" >> test-report.md - name: Upload Test Report From 287233b05fff5050e01c1aacf709bd4dd37d7d43 Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:39:30 +0100 Subject: [PATCH 22/77] chore : usage of english is mandatory --- src/Classes/MD5.java | 50 +++++++++++++++++++++--------------------- src/Classes/RC4.java | 42 +++++++++++++++++------------------ src/Tests/MD5Test.java | 8 +++---- src/Tests/RC4Test.java | 24 ++++++++++---------- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java index 34d2b90..4e6a6ae 100644 --- a/src/Classes/MD5.java +++ b/src/Classes/MD5.java @@ -5,11 +5,11 @@ public class MD5 { /** - * Calcule le hash MD5 d'une chaîne de caractères. - * @param input La chaîne à hasher - * @return Le hash MD5 en hexadécimal (32 caractères) - * @throws IllegalArgumentException si input est null - * @throws RuntimeException si une erreur survient pendant le hachage + * Computes the MD5 hash of a string. + * @param input The string to hash + * @return The MD5 hash in hexadecimal (32 characters) + * @throws IllegalArgumentException if input is null + * @throws RuntimeException if an error occurs during hashing */ public static String hash(String input) { if (input == null) { @@ -17,39 +17,39 @@ public static String hash(String input) { } try { - // Obtention d'une instance de MessageDigest configurée pour MD5 - // MessageDigest est une classe qui implémente l'algorithme de hachage + // Get an instance of MessageDigest configured for MD5 + // MessageDigest is a class that implements the hashing algorithm MessageDigest md = MessageDigest.getInstance("MD5"); - // Conversion de la chaîne d'entrée en tableau de bytes avec l'encodage UTF-8 - // puis calcul du hash MD5 sur ces bytes - // Le résultat est un tableau de 16 bytes (128 bits, taille standard MD5) + // Convert the input string to a byte array using UTF-8 encoding + // then compute the MD5 hash of these bytes + // The result is a 16-byte array (128 bits, standard MD5 size) byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); - // Création d'un StringBuilder pour construire la représentation hexadécimale - // Il sera plus efficace qu'une simple String pour les concaténations + // Create a StringBuilder to build the hexadecimal representation + // It will be more efficient than a simple String for concatenations StringBuilder hexString = new StringBuilder(); - // Pour chaque byte du hash MD5 + // For each byte of the MD5 hash for (byte b : messageDigest) { - // String.format("%02x", b & 0xff) fait plusieurs choses : - // 1. b & 0xff : convertit le byte en un entier non signé (0-255) - // car les bytes en Java sont signés (-128 à 127) - // 2. %02x : formate l'entier en hexadécimal sur 2 positions - // - % indique le début du format - // - 0 indique de remplir avec des zéros - // - 2 indique la largeur minimale - // - x indique la notation hexadécimale en minuscules + // String.format("%02x", b & 0xff) does several things: + // 1. b & 0xff: converts the byte to an unsigned integer (0-255) + // because bytes in Java are signed (-128 to 127) + // 2. %02x: formats the integer in hexadecimal with 2 positions + // - % indicates the start of the format + // - 0 indicates to pad with zeros + // - 2 indicates the minimum width + // - x indicates lowercase hexadecimal notation hexString.append(String.format("%02x", b & 0xff)); } - // Conversion finale du StringBuilder en String - // Le résultat sera une chaîne de 32 caractères hexadécimaux + // Final conversion of the StringBuilder to a String + // The result will be a 32-character hexadecimal string return hexString.toString(); } catch (Exception e) { - // En cas d'erreur (très rare car MD5 est un algorithme standard) - // on encapsule l'exception dans une RuntimeException + // In case of an error (very rare as MD5 is a standard algorithm) + // we encapsulate the exception in a RuntimeException throw new RuntimeException("Error computing MD5 hash", e); } } diff --git a/src/Classes/RC4.java b/src/Classes/RC4.java index 1ab7a15..dd9f3c7 100644 --- a/src/Classes/RC4.java +++ b/src/Classes/RC4.java @@ -6,20 +6,20 @@ public class RC4 { private int[] T = new int[256]; public String key = ""; - // Initialisation du tableau S et du tableau T avec la clé + // Initialization of S and T arrays with the key public void init(String key) { if (key == null || key.isEmpty()) { - throw new IllegalArgumentException("La clé ne peut pas être nulle ou vide"); + throw new IllegalArgumentException("The key cannot be null or empty"); } this.key = key; - // Initialisation des tableaux S et T + // Initialize S and T arrays for (int i = 0; i < 256; i++) { S[i] = i; T[i] = key.charAt(i % key.length()); } - // Permutation initiale de S + // Initial permutation of S int j = 0; for (int i = 0; i < 256; i++) { j = (j + S[i] + T[i]) & 0xFF; @@ -27,40 +27,40 @@ public void init(String key) { } } - // Chiffrement du texte clair + // Encrypt the plaintext public String encrypt(String clearText) { if (clearText == null || clearText.isEmpty()) { - throw new IllegalArgumentException("Le texte à chiffrer ne peut pas être nul ou vide"); + throw new IllegalArgumentException("The text to encrypt cannot be null or empty"); } - // Réinitialisation pour assurer un état propre + // Reinitialize to ensure a clean state init(this.key); StringBuilder encrypted = new StringBuilder(); int i = 0, j = 0; - // Pour chaque caractère du texte clair + // For each character in the plaintext for (int n = 0; n < clearText.length(); n++) { char c = clearText.charAt(n); - // On incrémente i modulo 256 + // Increment i modulo 256 i = (i + 1) & 0xFF; - // On incrémente j modulo 256 + // Increment j modulo 256 j = (j + S[i]) & 0xFF; - // On échange S[i] et S[j] + // Swap S[i] and S[j] swap(i, j); - // On calcule t + // Calculate t int t = (S[i] + S[j]) & 0xFF; - // On récupère la valeur de S[t] + // Get the value of S[t] int k = S[t]; - // On chiffre le caractère + // Encrypt the character int encryptedByte = c ^ k; - // Conversion en binaire avec padding de 0 + // Convert to binary with zero padding encrypted.append(String.format("%8s", Integer.toBinaryString(encryptedByte & 0xFF)) .replace(' ', '0')); - // Ajout d'espace sauf pour le dernier caractère + // Add space except for the last character if (n < clearText.length() - 1) { encrypted.append(" "); } @@ -69,20 +69,20 @@ public String encrypt(String clearText) { return encrypted.toString(); } - // Déchiffrement du texte chiffré + // Decrypt the encrypted text public String decrypt(String encryptedText) { if (encryptedText == null || encryptedText.isEmpty()) { - throw new IllegalArgumentException("Le texte chiffré ne peut pas être nul ou vide"); + throw new IllegalArgumentException("The encrypted text cannot be null or empty"); } - // Réinitialisation pour assurer un état propre + // Reinitialize to ensure a clean state init(this.key); StringBuilder decrypted = new StringBuilder(); String[] binaryStrings = encryptedText.split(" "); int i = 0, j = 0; - // Pour chaque octet du texte chiffré + // For each byte in the encrypted text for (String binaryString : binaryStrings) { char c = (char) Integer.parseInt(binaryString, 2); i = (i + 1) & 0xFF; @@ -96,7 +96,7 @@ public String decrypt(String encryptedText) { return decrypted.toString(); } - // Fonction d'échange de deux éléments dans le tableau S + // Swap function to exchange two elements in the S array private void swap(int i, int j) { int temp = S[i]; S[i] = S[j]; diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java index 7eb8f58..208c99a 100644 --- a/src/Tests/MD5Test.java +++ b/src/Tests/MD5Test.java @@ -41,7 +41,7 @@ public void testConsistency() { String input = "test123"; String firstHash = MD5.hash(input); String secondHash = MD5.hash(input); - Assert.assertEquals("Le même input devrait produire le même hash", firstHash, secondHash); + Assert.assertEquals("The same input should produce the same hash", firstHash, secondHash); } @Test(expected = RuntimeException.class) @@ -53,14 +53,14 @@ public void testNullInput() { public void testCaseSensitivity() { String lowerCase = MD5.hash("hello"); String upperCase = MD5.hash("HELLO"); - Assert.assertNotEquals("Les hashs de différentes casses devraient être différents", + Assert.assertNotEquals("Hashes of different cases should be different", lowerCase, upperCase); } @Test public void testHashLength() { String result = MD5.hash("test"); - Assert.assertEquals("La longueur du hash MD5 devrait être de 32 caractères", + Assert.assertEquals("The length of the MD5 hash should be 32 characters", 32, result.length()); } @@ -68,7 +68,7 @@ public void testHashLength() { public void testWhitespaceHandling() { String withSpaces = MD5.hash("test test"); String withoutSpaces = MD5.hash("testtest"); - Assert.assertNotEquals("Les espaces devraient affecter le hash", + Assert.assertNotEquals("Spaces should affect the hash", withSpaces, withoutSpaces); } } \ No newline at end of file diff --git a/src/Tests/RC4Test.java b/src/Tests/RC4Test.java index 4e8fc2c..558e41f 100644 --- a/src/Tests/RC4Test.java +++ b/src/Tests/RC4Test.java @@ -22,7 +22,7 @@ public void setUp() { public void testInit() { RC4 testRc4 = new RC4(); testRc4.init(KEY); - Assert.assertNotNull("L'initialisation ne devrait pas produire un tableau nul", testRc4); + Assert.assertNotNull("Initialization should not produce a null array", testRc4); } @Test(expected = IllegalArgumentException.class) @@ -38,7 +38,7 @@ public void testInitWithEmptyKey() { @Test public void testEncrypt() { String encrypted = rc4.encrypt(CLEAR_TEXT); - Assert.assertEquals("Le texte chiffré ne correspond pas au résultat attendu", + Assert.assertEquals("The encrypted text does not match the expected result", ENCRYPTED_TEXT, encrypted); } @@ -46,7 +46,7 @@ public void testEncrypt() { public void testEncryptEmptyString() { try { rc4.encrypt(""); - Assert.fail("Une chaîne vide devrait lever une exception"); + Assert.fail("An empty string should throw an exception"); } catch (IllegalArgumentException e) { Assert.assertTrue(true); } @@ -60,7 +60,7 @@ public void testEncryptNull() { @Test public void testDecrypt() { String decrypted = rc4.decrypt(ENCRYPTED_TEXT); - Assert.assertEquals("Le texte déchiffré ne correspond pas au texte original", + Assert.assertEquals("The decrypted text does not match the original text", CLEAR_TEXT, decrypted); } @@ -68,7 +68,7 @@ public void testDecrypt() { public void testDecryptEmptyString() { try { rc4.decrypt(""); - Assert.fail("Une chaîne vide devrait lever une exception"); + Assert.fail("An empty string should throw an exception"); } catch (IllegalArgumentException e) { Assert.assertTrue(true); } @@ -82,18 +82,18 @@ public void testDecryptNull() { @Test public void testFullCycle() { String encrypted = rc4.encrypt(CLEAR_TEXT); - rc4.init(KEY); // Réinitialisation nécessaire pour le déchiffrement + rc4.init(KEY); // Reinitialization needed for decryption String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le cycle complet de chiffrement/déchiffrement a échoué", + Assert.assertEquals("The full encryption/decryption cycle failed", CLEAR_TEXT, decrypted); } @Test public void testDifferentKeys() { String encrypted1 = rc4.encrypt(CLEAR_TEXT); - rc4.init("5678"); // Utilisation d'une clé différente + rc4.init("5678"); // Using a different key String encrypted2 = rc4.encrypt(CLEAR_TEXT); - Assert.assertNotEquals("Des clés différentes devraient produire des chiffrements différents", + Assert.assertNotEquals("Different keys should produce different encryptions", encrypted1, encrypted2); } @@ -102,7 +102,7 @@ public void testConsistentEncryption() { String encrypted1 = rc4.encrypt(CLEAR_TEXT); rc4.init(KEY); String encrypted2 = rc4.encrypt(CLEAR_TEXT); - Assert.assertEquals("Le même texte avec la même clé devrait produire le même chiffrement", + Assert.assertEquals("The same text with the same key should produce the same encryption", encrypted1, encrypted2); } @@ -112,7 +112,7 @@ public void testLongText() { String encrypted = rc4.encrypt(longText); rc4.init(KEY); String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le chiffrement/déchiffrement d'un texte long a échoué", + Assert.assertEquals("Encryption/decryption of a long text failed", longText, decrypted); } @@ -122,7 +122,7 @@ public void testSpecialCharacters() { String encrypted = rc4.encrypt(specialText); rc4.init(KEY); String decrypted = rc4.decrypt(encrypted); - Assert.assertEquals("Le chiffrement/déchiffrement avec caractères spéciaux a échoué", + Assert.assertEquals("Encryption/decryption with special characters failed", specialText, decrypted); } } \ No newline at end of file From 7f50b9d85af207579a32f9604f39d8a35d43a1ae Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Tue, 17 Dec 2024 22:03:25 +0100 Subject: [PATCH 23/77] Add LFSR class Add Lfsr class with 2 operating modes: fibonacci, galois galois for shifting generating fibonacci for binary parity generating --- src/Classes/Lfsr.java | 78 +++++++++++++++++++++++++++++++++++++++++++ src/Main.java | 12 +++++-- 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/Classes/Lfsr.java diff --git a/src/Classes/Lfsr.java b/src/Classes/Lfsr.java new file mode 100644 index 0000000..be71b8f --- /dev/null +++ b/src/Classes/Lfsr.java @@ -0,0 +1,78 @@ +package Classes; + +public class Lfsr { + char state; + char taps; + + public Lfsr(char state, char taps) { + this.state = state; //représente l'état actuel du LFSR sous forme d'un entier (char sur 16 bits) + this.taps = taps; //mask indiquant les positions (bits) pour la rétroactio + } + //méthode calculant la parité d'un nombre (nombre de bits à 1) pour déterminer le bit de rétroaction + static int parity(int mask) { + int p = 0; + for ( ; mask > 0 ; mask >>>= 1) + p ^= mask & 1; + return p; + } + //méthode convertissant un entier en chaîne convertoraire de 16 bits. + static String convertor(int registers) { + return String.format("%16s", + Integer.toBinaryString(registers)).replace(" ", "0"); //affiche un chaine de 16bits en laissant le bit de point fort s'il est égale à 0 + } + + public String fibonacci(int loops) { + String alea = ""; + for (int i = 0 ; i < loops ; i++) { + System.out.println("Debug info: state = " + convertor(this.state)); + int bit = Lfsr.parity(this.state & this.taps); //calcul le mask à partir du XOR + System.out.println("bit = " + bit); + alea += this.state & 1; // recupère le bit de poids faible + this.state >>= 1; //decalage des bits sur la droite + this.state |= bit << 15; //remet le bit de poids faible 15 positions à gauche (dernier bit) + } + return alea; + } + + public String galois(int loops) { + String alea = ""; + for (int i = 0 ; i < loops ; i++) { + System.out.println("Debug info: state = " + convertor(this.state)); + int bit = this.state & 1; //récuère le bit de poids faible + alea += bit; + this.state >>= 1; //décalage des bits sur la droite + if (bit == 1) //si le bit de poids faible est 1 on modifie le l'état par la porte Xor + this.state ^= this.taps; + } + return alea; + } + + + /*** + * + * + * @param tapsHex une valeur indiquant la position du bit en hexa + * @param loops nombre de boucle pour les methodes galois et fibonacci + * @param seedHex seed pour l'algorythme + * @param mode choix entre les deux méthodes galois et fibonacci + * @return un resultat (alea) en 16 bits + */ + public String lfsr(String tapsHex, int loops, String seedHex, String mode) { + char taps = (char) Integer.parseInt(tapsHex, 16); + char seed = (char) Integer.parseInt(seedHex, 16); + + this.state = seed; + this.taps = taps; + + String result; + if (mode.equalsIgnoreCase("galois")) { //Execute la méthode en fonctionne du choix de fonction de transformation + result = this.galois(loops); + } else { + result = this.fibonacci(loops); + } + + return result; + } + +} + diff --git a/src/Main.java b/src/Main.java index d5238c9..5a2785e 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,13 @@ +import Classes.Lfsr; + public class Main { - public static void main(String[] args) { - System.out.println("Hello, World!"); + public static void main(String args[]) { + String tapsHex = "8005"; + int loops = 10; + String seedHex = "1"; + String mode = "galois"; + Lfsr lfsr = new Lfsr((char) 0, (char) 0); + String result = lfsr.lfsr(tapsHex, loops, seedHex, mode); + System.out.println(result); } } \ No newline at end of file From e7b96f24fd7baf21f2c09085c494a145beaef21b Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Tue, 17 Dec 2024 22:12:09 +0100 Subject: [PATCH 24/77] Fix parameter name changed the parameter name --- src/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Main.java b/src/Main.java index 5a2785e..7719247 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,7 +1,7 @@ import Classes.Lfsr; public class Main { - public static void main(String args[]) { + public static void main(String[] args) { String tapsHex = "8005"; int loops = 10; String seedHex = "1"; From fa34c842caec387522a6ad8bff6ded4a6cecbf4e Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:22:16 +0100 Subject: [PATCH 25/77] revert : back to init state --- src/Main.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Main.java b/src/Main.java index 7719247..d5238c9 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,13 +1,5 @@ -import Classes.Lfsr; - public class Main { public static void main(String[] args) { - String tapsHex = "8005"; - int loops = 10; - String seedHex = "1"; - String mode = "galois"; - Lfsr lfsr = new Lfsr((char) 0, (char) 0); - String result = lfsr.lfsr(tapsHex, loops, seedHex, mode); - System.out.println(result); + System.out.println("Hello, World!"); } } \ No newline at end of file From af3d29b73c24ea1d36b4ca5249371ecbd291d34c Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:34:34 +0100 Subject: [PATCH 26/77] chore : make the methods public for tests and future implementations and usage of english --- src/Classes/Lfsr.java | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/Classes/Lfsr.java b/src/Classes/Lfsr.java index be71b8f..4abebe3 100644 --- a/src/Classes/Lfsr.java +++ b/src/Classes/Lfsr.java @@ -5,31 +5,31 @@ public class Lfsr { char taps; public Lfsr(char state, char taps) { - this.state = state; //représente l'état actuel du LFSR sous forme d'un entier (char sur 16 bits) - this.taps = taps; //mask indiquant les positions (bits) pour la rétroactio + this.state = state; //represents the current state of the LFSR as a 16-bit integer (char) + this.taps = taps; //mask indicating the positions (bits) for feedback } - //méthode calculant la parité d'un nombre (nombre de bits à 1) pour déterminer le bit de rétroaction - static int parity(int mask) { + //method calculating the parity of a number (number of bits set to 1) to determine the feedback bit + public static int parity(int mask) { int p = 0; for ( ; mask > 0 ; mask >>>= 1) p ^= mask & 1; return p; } - //méthode convertissant un entier en chaîne convertoraire de 16 bits. - static String convertor(int registers) { + //method converting an integer to a 16-bit binary string + public static String convertor(int registers) { return String.format("%16s", - Integer.toBinaryString(registers)).replace(" ", "0"); //affiche un chaine de 16bits en laissant le bit de point fort s'il est égale à 0 + Integer.toBinaryString(registers)).replace(" ", "0"); //displays a 16-bit string, keeping the leading zero if it is 0 } public String fibonacci(int loops) { String alea = ""; for (int i = 0 ; i < loops ; i++) { System.out.println("Debug info: state = " + convertor(this.state)); - int bit = Lfsr.parity(this.state & this.taps); //calcul le mask à partir du XOR + int bit = Lfsr.parity(this.state & this.taps); //calculates the mask from the XOR System.out.println("bit = " + bit); - alea += this.state & 1; // recupère le bit de poids faible - this.state >>= 1; //decalage des bits sur la droite - this.state |= bit << 15; //remet le bit de poids faible 15 positions à gauche (dernier bit) + alea += this.state & 1; // retrieves the least significant bit + this.state >>= 1; //shifts the bits to the right + this.state |= bit << 15; //sets the least significant bit 15 positions to the left (last bit) } return alea; } @@ -38,10 +38,10 @@ public String galois(int loops) { String alea = ""; for (int i = 0 ; i < loops ; i++) { System.out.println("Debug info: state = " + convertor(this.state)); - int bit = this.state & 1; //récuère le bit de poids faible + int bit = this.state & 1; //retrieves the least significant bit alea += bit; - this.state >>= 1; //décalage des bits sur la droite - if (bit == 1) //si le bit de poids faible est 1 on modifie le l'état par la porte Xor + this.state >>= 1; //shifts the bits to the right + if (bit == 1) //if the least significant bit is 1, modifies the state with the XOR gate this.state ^= this.taps; } return alea; @@ -51,11 +51,11 @@ public String galois(int loops) { /*** * * - * @param tapsHex une valeur indiquant la position du bit en hexa - * @param loops nombre de boucle pour les methodes galois et fibonacci - * @param seedHex seed pour l'algorythme - * @param mode choix entre les deux méthodes galois et fibonacci - * @return un resultat (alea) en 16 bits + * @param tapsHex a value indicating the bit position in hex + * @param loops number of loops for the galois and fibonacci methods + * @param seedHex seed for the algorithm + * @param mode choice between the two methods galois and fibonacci + * @return a result (alea) in 16 bits */ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { char taps = (char) Integer.parseInt(tapsHex, 16); @@ -65,7 +65,7 @@ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { this.taps = taps; String result; - if (mode.equalsIgnoreCase("galois")) { //Execute la méthode en fonctionne du choix de fonction de transformation + if (mode.equalsIgnoreCase("galois")) { //Executes the method based on the chosen transformation function result = this.galois(loops); } else { result = this.fibonacci(loops); @@ -75,4 +75,3 @@ public String lfsr(String tapsHex, int loops, String seedHex, String mode) { } } - From 4c71f04cbdd78035d9e16ed4ca35a97dbf99d55c Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:35:32 +0100 Subject: [PATCH 27/77] chore : added tests for the lfsr --- src/Tests/LfsrTest.java | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/Tests/LfsrTest.java diff --git a/src/Tests/LfsrTest.java b/src/Tests/LfsrTest.java new file mode 100644 index 0000000..86a58a8 --- /dev/null +++ b/src/Tests/LfsrTest.java @@ -0,0 +1,102 @@ +package Tests; + +import Classes.Lfsr; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +public class LfsrTest { + private Lfsr lfsr; + + @Before + public void setUp() { + lfsr = new Lfsr((char) 0, (char) 0); + } + + @Test + public void testParity() { + // Test the parity (XOR of all bits) + assertEquals(0, Lfsr.parity(0)); // 0000 -> parity 0 + assertEquals(1, Lfsr.parity(1)); // 0001 -> parity 1 + assertEquals(0, Lfsr.parity(3)); // 0011 -> parity 0 (1 XOR 1 = 0) + assertEquals(1, Lfsr.parity(7)); // 0111 -> parity 1 (1 XOR 1 XOR 1 = 1) + assertEquals(0, Lfsr.parity(15)); // 1111 -> parity 0 (1 XOR 1 XOR 1 XOR 1 = 0) + } + + @Test + public void testConvertor() { + assertEquals("0000000000000000", Lfsr.convertor(0)); + assertEquals("0000000000000001", Lfsr.convertor(1)); + assertEquals("0000000000001111", Lfsr.convertor(15)); + } + + @Test + public void testFibonacciBasic() { + lfsr = new Lfsr((char) 1, (char) 1); // Simple initial state + String result = lfsr.fibonacci(4); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testGaloisBasic() { + lfsr = new Lfsr((char) 1, (char) 1); // Simple initial state + String result = lfsr.galois(4); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testLfsrBasicOperation() { + // Test with simple values + String result = lfsr.lfsr("1", 4, "1", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testDifferentModes() { + String galoisResult = lfsr.lfsr("1", 4, "1", "galois"); + String fibonacciResult = lfsr.lfsr("1", 4, "1", "fibonacci"); + // The results should be different for the two modes + assertNotEquals(galoisResult, fibonacciResult); + } + + @Test + public void testOutputLength() { + String result4 = lfsr.lfsr("1", 4, "1", "galois"); + String result8 = lfsr.lfsr("1", 8, "1", "galois"); + assertEquals(4, result4.length()); + assertEquals(8, result8.length()); + } + + @Test + public void testConsistency() { + // The same input should give the same output + String result1 = lfsr.lfsr("1", 4, "1", "galois"); + String result2 = lfsr.lfsr("1", 4, "1", "galois"); + assertEquals(result1, result2); + } + + @Test + public void testModeInsensitiveCase() { + String result1 = lfsr.lfsr("1", 4, "1", "GALOIS"); + String result2 = lfsr.lfsr("1", 4, "1", "galois"); + assertEquals(result1, result2); + } + + @Test + public void testWithZeroTaps() { + String result = lfsr.lfsr("0", 4, "1", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + } + + @Test + public void testWithZeroSeed() { + String result = lfsr.lfsr("1", 4, "0", "galois"); + assertNotNull(result); + assertEquals(4, result.length()); + assertEquals("0000", result); // With seed 0, the output should be all 0s + } +} \ No newline at end of file From c1d2294c1de3862693eec8aaedafe197d6ca404d Mon Sep 17 00:00:00 2001 From: Nabil Date: Tue, 17 Dec 2024 22:56:30 +0100 Subject: [PATCH 28/77] chore : move file to classes folder --- src/{ => Classes}/VigenereAlgo.java | 1 + 1 file changed, 1 insertion(+) rename src/{ => Classes}/VigenereAlgo.java (99%) diff --git a/src/VigenereAlgo.java b/src/Classes/VigenereAlgo.java similarity index 99% rename from src/VigenereAlgo.java rename to src/Classes/VigenereAlgo.java index 2e7e043..f025e6a 100644 --- a/src/VigenereAlgo.java +++ b/src/Classes/VigenereAlgo.java @@ -1,3 +1,4 @@ +package Classes; import java.util.Scanner; public class VigenereAlgo { From 3b1408a7c43d08f32128085644ffd6bf44e40162 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 09:48:30 +0100 Subject: [PATCH 29/77] refactor Vigenere Algo in Classes --- src/Classes/VigenereAlgo.java | 26 ++++---------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/src/Classes/VigenereAlgo.java b/src/Classes/VigenereAlgo.java index f025e6a..cbf93a2 100644 --- a/src/Classes/VigenereAlgo.java +++ b/src/Classes/VigenereAlgo.java @@ -3,35 +3,17 @@ public class VigenereAlgo { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - // Ask user to type their phrase - System.out.print("Enter a phrase to encrypt: "); - String plainText = scanner.nextLine(); - - // Ask user to type their key and validate it - String key; - while (true) { - System.out.print("Enter your key (no numbers allowed): "); - key = scanner.nextLine(); - if (isValidKey(key)) { - break; - } else { - System.out.println("Invalid key. The key must not contain numbers. Please try again."); - } - } + String plainText = ""; + + String key = ""; // Call encryption function and display the result String encryptedText = encrypt(plainText, key); - System.out.println("Encrypted text: " + encryptedText); + // Call decryption function and display the result String decryptedText = decrypt(encryptedText, key); - System.out.println("Decrypted text: " + decryptedText); - scanner.close(); - } // Validate that the key does not contain numbers private static boolean isValidKey(String key) { From 4e9765442bfac4f354506964bc006135482cbc66 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:45:35 +0100 Subject: [PATCH 30/77] Add MD5 and SHA256 classes that extend hash Class add two hash methods sha256 and md5 edit md5 tests to handle hash class for MD5 --- ByteWarden.iml | 10 ++++++++++ src/Classes/Hash.java | 11 +++++++++++ src/Classes/MD5.java | 5 +++-- src/Classes/Sha256.java | 26 ++++++++++++++++++++++++++ src/Tests/MD5Test.java | 38 +++++++++++++++++++++++--------------- 5 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 src/Classes/Hash.java create mode 100644 src/Classes/Sha256.java diff --git a/ByteWarden.iml b/ByteWarden.iml index c3dc060..53641d9 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -17,5 +17,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Classes/Hash.java b/src/Classes/Hash.java new file mode 100644 index 0000000..b124c5d --- /dev/null +++ b/src/Classes/Hash.java @@ -0,0 +1,11 @@ +package Classes; + +public abstract class Hash { + public abstract String calculateHash(String input); + + public void printHash(String input) { + System.out.println("Hash de \"" + input + "\": " + calculateHash(input)); + } +} + + diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java index 4e6a6ae..3864484 100644 --- a/src/Classes/MD5.java +++ b/src/Classes/MD5.java @@ -3,7 +3,7 @@ import java.security.MessageDigest; import java.nio.charset.StandardCharsets; -public class MD5 { +public class MD5 extends Hash { /** * Computes the MD5 hash of a string. * @param input The string to hash @@ -11,7 +11,8 @@ public class MD5 { * @throws IllegalArgumentException if input is null * @throws RuntimeException if an error occurs during hashing */ - public static String hash(String input) { + @Override + public String calculateHash(String input) { if (input == null) { throw new IllegalArgumentException("Input cannot be null"); } diff --git a/src/Classes/Sha256.java b/src/Classes/Sha256.java new file mode 100644 index 0000000..cce7911 --- /dev/null +++ b/src/Classes/Sha256.java @@ -0,0 +1,26 @@ +package Classes; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Sha256 extends Hash { + + @Override + public String calculateHash(String input) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); //create instance of sha256 + byte[] hashBytes = digest.digest(input.getBytes()); //hash input bytes + + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + String hex = Integer.toHexString(0xff & b); //format byte in hex string + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); //concatenate bytes + } + return hexString.toString(); //return hash string + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Error :" + , e); + } + } +} \ No newline at end of file diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java index 208c99a..d5397ff 100644 --- a/src/Tests/MD5Test.java +++ b/src/Tests/MD5Test.java @@ -1,73 +1,81 @@ package Tests; +import Classes.MD5; +import org.junit.Before; import org.junit.Test; import org.junit.Assert; -import Classes.MD5; public class MD5Test { + private MD5 md5; + + @Before + public void setUp() { + md5 = new MD5(); + } @Test public void testEmptyString() { - String result = MD5.hash(""); + + String result = md5.calculateHash(""); Assert.assertEquals("d41d8cd98f00b204e9800998ecf8427e", result); } @Test public void testSimpleString() { - String result = MD5.hash("test"); + String result = md5.calculateHash("test"); Assert.assertEquals("098f6bcd4621d373cade4e832627b4f6", result); } @Test public void testLongString() { - String result = MD5.hash("The quick brown fox jumps over the lazy dog"); + String result = md5.calculateHash("The quick brown fox jumps over the lazy dog"); Assert.assertEquals("9e107d9d372bb6826bd81d3542a419d6", result); } @Test public void testSpecialCharacters() { - String result = MD5.hash("!@#$%^&*()_+"); + String result = md5.calculateHash("!@#$%^&*()_+"); Assert.assertEquals("04dde9f462255fe14b5160bbf2acffe8", result); } @Test public void testUnicodeCharacters() { - String result = MD5.hash("héllo wörld"); + String result = md5.calculateHash("héllo wörld"); Assert.assertEquals("ed0c22cc110ede12327851863c078138", result); } @Test public void testConsistency() { String input = "test123"; - String firstHash = MD5.hash(input); - String secondHash = MD5.hash(input); + String firstHash = md5.calculateHash(input); + String secondHash = md5.calculateHash(input); Assert.assertEquals("The same input should produce the same hash", firstHash, secondHash); } @Test(expected = RuntimeException.class) public void testNullInput() { - MD5.hash(null); + md5.calculateHash(null); } @Test public void testCaseSensitivity() { - String lowerCase = MD5.hash("hello"); - String upperCase = MD5.hash("HELLO"); + String lowerCase = md5.calculateHash("hello"); + String upperCase = md5.calculateHash("HELLO"); Assert.assertNotEquals("Hashes of different cases should be different", lowerCase, upperCase); } @Test public void testHashLength() { - String result = MD5.hash("test"); - Assert.assertEquals("The length of the MD5 hash should be 32 characters", + String result = md5.calculateHash("test"); + Assert.assertEquals("The length of the md5 hash should be 32 characters", 32, result.length()); } @Test public void testWhitespaceHandling() { - String withSpaces = MD5.hash("test test"); - String withoutSpaces = MD5.hash("testtest"); + String withSpaces = md5.calculateHash("test test"); + String withoutSpaces = md5.calculateHash("testtest"); Assert.assertNotEquals("Spaces should affect the hash", withSpaces, withoutSpaces); } From 51f10efada2acb5f5846c6aca2624e35821cd08d Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:56:05 +0100 Subject: [PATCH 31/77] Add tests for hash sha256 implement tests for hash class and sha256 class --- src/Tests/HashTest.java | 29 +++++++++++++++++++++++++++++ src/Tests/SHA256Test.java | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/Tests/HashTest.java create mode 100644 src/Tests/SHA256Test.java diff --git a/src/Tests/HashTest.java b/src/Tests/HashTest.java new file mode 100644 index 0000000..5c7af4d --- /dev/null +++ b/src/Tests/HashTest.java @@ -0,0 +1,29 @@ +package Tests; + +import Classes.Hash; +import org.junit.Test; +import static org.junit.Assert.*; + +public class HashTest { + + private class DummyHash extends Hash { + @Override + public String calculateHash(String input) { + return "dummyhash"; + } + } + + @Test + public void testPrintHash() { + DummyHash dummyHash = new DummyHash(); + dummyHash.printHash("test"); + } + + @Test + public void testCalculateHash() { + DummyHash dummyHash = new DummyHash(); + String result = dummyHash.calculateHash("test"); + assertEquals("dummyhash", result); + } +} + diff --git a/src/Tests/SHA256Test.java b/src/Tests/SHA256Test.java new file mode 100644 index 0000000..2c2bdaa --- /dev/null +++ b/src/Tests/SHA256Test.java @@ -0,0 +1,28 @@ +package Tests; + +import Classes.Sha256; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SHA256Test { + @Test + public void testCalculateHash() { + Sha256 sha256 = new Sha256(); + String input = "test"; + String expectedHash = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"; + + String result = sha256.calculateHash(input); + assertEquals(expectedHash, result); + } + + @Test + public void testEmptyInputHash() { + Sha256 sha256 = new Sha256(); + String input = ""; + String expectedHash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + + String result = sha256.calculateHash(input); + assertEquals(expectedHash, result); + } +} From b4333c85a2fcde43b35a21b332f0561f3cdf8b5e Mon Sep 17 00:00:00 2001 From: Nabil Date: Wed, 18 Dec 2024 11:00:25 +0100 Subject: [PATCH 32/77] feat : added the enigma class with the Rotors, Reflector and Plugboard for the encryption and decryption --- src/Classes/Enigma/Enigma.java | 52 ++++++++++++++++ src/Classes/Enigma/Plugboard.java | 44 ++++++++++++++ src/Classes/Enigma/Reflector.java | 16 +++++ src/Classes/Enigma/Rotors.java | 99 +++++++++++++++++++++++++++++++ 4 files changed, 211 insertions(+) create mode 100644 src/Classes/Enigma/Enigma.java create mode 100644 src/Classes/Enigma/Plugboard.java create mode 100644 src/Classes/Enigma/Reflector.java create mode 100644 src/Classes/Enigma/Rotors.java diff --git a/src/Classes/Enigma/Enigma.java b/src/Classes/Enigma/Enigma.java new file mode 100644 index 0000000..cf548bd --- /dev/null +++ b/src/Classes/Enigma/Enigma.java @@ -0,0 +1,52 @@ +package Classes.Enigma; + +public class Enigma { + private Rotors rotors = new Rotors(); + private Reflector reflector = new Reflector(); + private Plugboard plugboard = new Plugboard(); + + public Enigma() { + } + + public Enigma(Rotors rotors, Reflector reflector, Plugboard plugboard) { + this.rotors = rotors; + this.reflector = reflector; + this.plugboard = plugboard; + } + + public Rotors getRotors() { + return rotors; + } + + public Reflector getReflector() { + return reflector; + } + + public Plugboard getPlugboard() { + return plugboard; + } + + public String encrypt(String message) { + StringBuilder encryptedMessage = new StringBuilder(); + for (char c : message.toCharArray()) { + if (Character.isLetter(c)) { + c = Character.toUpperCase(c); + c = plugboard.swap(c); + c = rotors.rotate(c); + c = reflector.reflect(c); + c = rotors.rotateBack(c); + c = plugboard.swap(c); + if (Character.isLowerCase(message.charAt(encryptedMessage.length()))) { + c = Character.toLowerCase(c); + } + } + encryptedMessage.append(c); + } + return encryptedMessage.toString(); + } + + public String decrypt(String message) { + rotors.resetToInitialPosition(); + return encrypt(message); + } +} \ No newline at end of file diff --git a/src/Classes/Enigma/Plugboard.java b/src/Classes/Enigma/Plugboard.java new file mode 100644 index 0000000..94a3a50 --- /dev/null +++ b/src/Classes/Enigma/Plugboard.java @@ -0,0 +1,44 @@ +package Classes.Enigma; + +import java.util.HashMap; +import java.util.Map; + +public class Plugboard { + // Map to store the letter pairs for swapping + private Map connections; + + public Plugboard() { + connections = new HashMap<>(); + } + + /** + * Connects two letters in the plugboard + * @param a First letter to connect + * @param b Second letter to connect + * @throws IllegalArgumentException if letters are already connected + */ + public void connect(char a, char b) { + // Convert to uppercase for consistency + a = Character.toUpperCase(a); + b = Character.toUpperCase(b); + + // Check if letters are already connected + if (connections.containsKey(a) || connections.containsKey(b)) { + throw new IllegalArgumentException("Letters are already connected"); + } + + // Create bidirectional connection + connections.put(a, b); + connections.put(b, a); + } + + /** + * Swaps a letter according to plugboard connections + * @param c Letter to swap + * @return Swapped letter if connection exists, original letter otherwise + */ + public char swap(char c) { + c = Character.toUpperCase(c); + return connections.getOrDefault(c, c); + } +} \ No newline at end of file diff --git a/src/Classes/Enigma/Reflector.java b/src/Classes/Enigma/Reflector.java new file mode 100644 index 0000000..f112d53 --- /dev/null +++ b/src/Classes/Enigma/Reflector.java @@ -0,0 +1,16 @@ +package Classes.Enigma; + +public class Reflector { + private final String reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; + + public Reflector() { + } + + public String getReflector() { + return reflector; + } + + public char reflect(char c) { + return reflector.charAt(c - 'A'); + } +} diff --git a/src/Classes/Enigma/Rotors.java b/src/Classes/Enigma/Rotors.java new file mode 100644 index 0000000..547a826 --- /dev/null +++ b/src/Classes/Enigma/Rotors.java @@ -0,0 +1,99 @@ +package Classes.Enigma; + +public class Rotors { + private final Rotor[] rotors; + private char[] initialPositions; + + private static class Rotor { + private final String wiring; + private int position; + private final int notchPosition; + + public Rotor(String wiring, int notchPosition) { + this.wiring = wiring; + this.position = 0; + this.notchPosition = notchPosition; + } + + public void rotate() { + position = (position + 1) % 26; + } + + public boolean isAtNotch() { + return position == notchPosition; + } + + public char encrypt(char c) { + int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; + char output = wiring.charAt(inputPos); + return (char)((output - 'A' - position + 26) % 26 + 'A'); + } + + public char encryptBack(char c) { + int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; + int outputPos = wiring.indexOf((char)(inputPos + 'A')); + return (char)((outputPos - position + 26) % 26 + 'A'); + } + } + + public Rotors() { + rotors = new Rotor[3]; + rotors[0] = new Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ", 16); + rotors[1] = new Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE", 4); + rotors[2] = new Rotor("BDFHJLCPRTXVZNYEIWGAKMUSQO", 21); + } + + private void step() { + boolean middleAtNotch = rotors[1].isAtNotch(); + + if (middleAtNotch) { + rotors[0].rotate(); + rotors[1].rotate(); + } + + if (rotors[2].isAtNotch()) { + rotors[1].rotate(); + } + + rotors[2].rotate(); + } + + public char rotate(char c) { + step(); + char result = c; + for (int i = rotors.length - 1; i >= 0; i--) { + result = rotors[i].encrypt(result); + } + return result; + } + + public char rotateBack(char c) { + char result = c; + for (int i = 0; i < rotors.length; i++) { + result = rotors[i].encryptBack(result); + } + return result; + } + + public void setPositions(char[] positions) { + if (positions.length != 3) { + throw new IllegalArgumentException("Must provide exactly 3 positions"); + } + this.initialPositions = positions.clone(); + for (int i = 0; i < 3; i++) { + rotors[i].position = Character.toUpperCase(positions[i]) - 'A'; + } + } + + public void resetToInitialPosition() { + if (initialPositions != null) { + for (int i = 0; i < 3; i++) { + rotors[i].position = Character.toUpperCase(initialPositions[i]) - 'A'; + } + } else { + for (int i = 0; i < 3; i++) { + rotors[i].position = 0; + } + } + } +} \ No newline at end of file From 9d9eead7c6e0057bc1044e03827eaff05f9814d4 Mon Sep 17 00:00:00 2001 From: Nabil Date: Wed, 18 Dec 2024 11:00:42 +0100 Subject: [PATCH 33/77] test : added the tests for the whole enigma package --- src/Tests/EnigmaTest.java | 155 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/Tests/EnigmaTest.java diff --git a/src/Tests/EnigmaTest.java b/src/Tests/EnigmaTest.java new file mode 100644 index 0000000..8066df6 --- /dev/null +++ b/src/Tests/EnigmaTest.java @@ -0,0 +1,155 @@ +package Tests; + +import Classes.Enigma.Enigma; +import Classes.Enigma.Plugboard; +import Classes.Enigma.Reflector; +import Classes.Enigma.Rotors; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class EnigmaTest { + + @Test + public void testPlugboardConnection() { + Plugboard plugboard = new Plugboard(); + // Test basic connection + plugboard.connect('A', 'B'); + assertEquals('B', plugboard.swap('A')); + assertEquals('A', plugboard.swap('B')); + assertEquals('C', plugboard.swap('C')); // Unconnected letter should return itself + } + + @Test(expected = IllegalArgumentException.class) + public void testPlugboardDoubleConnection() { + Plugboard plugboard = new Plugboard(); + plugboard.connect('A', 'B'); + plugboard.connect('A', 'C'); // Should throw exception + } + + @Test + public void testRotorStepping() { + Rotors rotors = new Rotors(); + char[] initialPositions = {'A', 'A', 'A'}; + rotors.setPositions(initialPositions); + + // Test basic rotation + char result = rotors.rotate('A'); + assertNotEquals('A', result); + + // Test multiple characters to ensure proper stepping + String input = "HELLO"; + StringBuilder output = new StringBuilder(); + for (char c : input.toCharArray()) { + output.append(rotors.rotate(c)); + } + assertNotEquals(input, output.toString()); + } + + @Test + public void testCompleteEnigmaEncryption() { + // Create Enigma machine components + Rotors rotors = new Rotors(); + Reflector reflector = new Reflector(); + Plugboard plugboard = new Plugboard(); + + // Set up plugboard connections + plugboard.connect('A', 'M'); + plugboard.connect('B', 'N'); + plugboard.connect('C', 'O'); + + // Create Enigma machine + Enigma enigma = new Enigma(rotors, reflector, plugboard); + + // Test encryption + String message = "HELLO WORLD"; + String encrypted = enigma.encrypt(message); + + // Test that encryption changes the message + assertNotEquals(message, encrypted); + + // Test that decryption returns the original message + String decrypted = enigma.decrypt(encrypted); + assertEquals(message, decrypted); + } + + @Test + public void testRotorPosition() { + Rotors rotors = new Rotors(); + char[] positions = {'B', 'C', 'D'}; + rotors.setPositions(positions); + + // Encrypt same letter multiple times to test different rotor positions + String input = "AAAAA"; + StringBuilder output = new StringBuilder(); + for (char c : input.toCharArray()) { + output.append(rotors.rotate(c)); + } + + // Each 'A' should encrypt to a different letter due to rotor movement + String result = output.toString(); + for (int i = 1; i < result.length(); i++) { + assertNotEquals(result.charAt(i-1), result.charAt(i)); + } + } + + @Test + public void testReflector() { + Reflector reflector = new Reflector(); + char input = 'A'; + char reflected = reflector.reflect(input); + + // Test that reflection is consistent + assertEquals(reflected, reflector.reflect(input)); + + // Test that reflection is reciprocal + assertEquals(input, reflector.reflect(reflected)); + } + + @Test + public void testLongMessage() { + Enigma enigma = new Enigma(); + // Set initial rotor positions + char[] initialPositions = {'A', 'A', 'A'}; + enigma.getRotors().setPositions(initialPositions); + + String longMessage = "THIS IS A VERY LONG MESSAGE THAT SHOULD TEST THE FULL FUNCTIONALITY " + + "OF THE ENIGMA MACHINE INCLUDING MULTIPLE ROTOR ROTATIONS AND STEPPING"; + + String encrypted = enigma.encrypt(longMessage); + String decrypted = enigma.decrypt(encrypted); + + // Test that encryption changes the message + assertNotEquals(longMessage, encrypted); + + // Test that decryption recovers the original message + assertEquals(longMessage, decrypted); + } + + @Test + public void testNonAlphabeticCharacters() { + Enigma enigma = new Enigma(); + String message = "HELLO, WORLD! 123"; + String encrypted = enigma.encrypt(message); + String decrypted = enigma.decrypt(encrypted); + + // Test that non-alphabetic characters remain unchanged + assertTrue(encrypted.contains(",")); + assertTrue(encrypted.contains("!")); + assertTrue(encrypted.contains("123")); + + // Test that the original message is recovered + assertEquals(message, decrypted); + } + + @Test + public void testCaseSensitivity() { + Enigma enigma = new Enigma(); + String message = "Hello World"; + String encrypted = enigma.encrypt(message); + String decrypted = enigma.decrypt(encrypted); + + // Test that the case of the original message is preserved + assertEquals(message, decrypted); + } +} \ No newline at end of file From 0a48e507980148630fdc27d4aa80d71460baf8c1 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 11:16:07 +0100 Subject: [PATCH 34/77] VigenereAlgo tests --- src/Classes/VigenereAlgo.java | 27 +++++++-- src/Tests/VigenereTest.java | 100 ++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 src/Tests/VigenereTest.java diff --git a/src/Classes/VigenereAlgo.java b/src/Classes/VigenereAlgo.java index cbf93a2..c43039e 100644 --- a/src/Classes/VigenereAlgo.java +++ b/src/Classes/VigenereAlgo.java @@ -1,12 +1,12 @@ package Classes; -import java.util.Scanner; + public class VigenereAlgo { - String plainText = ""; + String plainText = "TEST"; - String key = ""; + String key = "LONGKEY"; // Call encryption function and display the result String encryptedText = encrypt(plainText, key); @@ -27,6 +27,10 @@ private static boolean isValidKey(String key) { // Encrypt the plaintext using the Vigenere cipher algorithm public static String encrypt(String plainText, String key) { + if (!isValidKey(key)) { + throw new IllegalArgumentException("Key must contain only alphabetic characters."); + } + StringBuilder encryptedText = new StringBuilder(); // Clean the key to contain only alphabetical characters @@ -57,6 +61,10 @@ public static String encrypt(String plainText, String key) { // Decrypt the ciphertext using the Vigenere cipher algorithm public static String decrypt(String encryptedText, String key) { + if (!isValidKey(key)) { + throw new IllegalArgumentException("Key must contain only alphabetic characters."); + } + StringBuilder decryptedText = new StringBuilder(); // Clean the key to contain only alphabetical characters @@ -85,14 +93,18 @@ public static String decrypt(String encryptedText, String key) { return decryptedText.toString(); } + // Generate a full-length key matching the text length, ignoring non-alphabetic characters - private static String generateFullKey(String text, String key) { + public static String generateFullKey(String text, String key) { StringBuilder fullKey = new StringBuilder(); int keyLength = key.length(); int keyIndex = 0; - for (char c : text.toCharArray()) { - if (Character.isLetter(c)) { + // go threw the text length + for (int i = 0; i < text.length(); i++) { + char currentChar = text.charAt(i); + if (Character.isLetter(currentChar)) { + // if keyLength > KeyIndex : troncate the keyLength to keyIndex fullKey.append(key.charAt(keyIndex % keyLength)); keyIndex++; } @@ -101,6 +113,9 @@ private static String generateFullKey(String text, String key) { return fullKey.toString(); } + + + // Remove non-alphabetical characters from the key private static String cleanKey(String key) { StringBuilder cleanedKey = new StringBuilder(); diff --git a/src/Tests/VigenereTest.java b/src/Tests/VigenereTest.java new file mode 100644 index 0000000..7f95117 --- /dev/null +++ b/src/Tests/VigenereTest.java @@ -0,0 +1,100 @@ +package Tests; + +import Classes.VigenereAlgo; +import org.junit.Test; +import static org.junit.Assert.*; + +public class VigenereTest { + + private final VigenereAlgo vigenere = new VigenereAlgo(); + + @Test + public void testEncrypt_basic() { + String plainText = "HELLO"; + String key = "KEY"; + String expectedCipherText = "RIJVS"; + assertEquals(expectedCipherText, vigenere.encrypt(plainText, key)); + } + + @Test + public void testDecrypt_basic() { + String cipherText = "RIJVS"; + String key = "KEY"; + String expectedPlainText = "HELLO"; + assertEquals(expectedPlainText, vigenere.decrypt(cipherText, key)); + } + + + @Test + public void testEncrypt_withLowercase() { + String plainText = "hello"; + String key = "key"; + String expectedCipherText = "RIJVS"; + assertEquals(expectedCipherText, vigenere.encrypt(plainText.toUpperCase(), key.toUpperCase())); + } + + @Test + public void testDecrypt_withLowercase() { + String cipherText = "rijvs"; + String key = "key"; + String expectedPlainText = "HELLO"; + assertEquals(expectedPlainText, vigenere.decrypt(cipherText.toUpperCase(), key.toUpperCase())); + } + + @Test + public void testEncrypt_emptyString() { + String plainText = ""; + String key = "KEY"; + assertEquals("", vigenere.encrypt(plainText, key)); + } + + @Test + public void testDecrypt_emptyString() { + String cipherText = ""; + String key = "KEY"; + assertEquals("", vigenere.decrypt(cipherText, key)); + } + + @Test + public void testGenerateFullKey() { + String text = "TEST"; + String key = "LONGKEY"; + String expectedKey = "LONG"; // Doit être exactement de la longueur de "TEST" + String result = VigenereAlgo.generateFullKey(text, key); + + assertEquals(expectedKey, result); + } + + @Test + public void testEncrypt_keyLongerThanText() { + String plainText = "TEST"; + String key = "LONGKEY"; + String expectedCipherText = "ULPG"; + String result = VigenereAlgo.encrypt(plainText, key); + + assertEquals(expectedCipherText, result); + } + + + @Test + public void testDecrypt_keyLongerThanText() { + String cipherText = "ULPG"; + String key = "LONGKEY"; + String expectedPlainText = "TEST"; + assertEquals(expectedPlainText, vigenere.decrypt(cipherText, key)); + } + + @Test(expected = IllegalArgumentException.class) + public void testEncrypt_nonAlphabeticKey() { + String plainText = "HELLO"; + String key = "K3Y!"; // Non-alphabetic characters in key + vigenere.encrypt(plainText, key); + } + + @Test(expected = IllegalArgumentException.class) + public void testDecrypt_nonAlphabeticKey() { + String cipherText = "RIJVS"; + String key = "K3Y!"; // Non-alphabetic characters in key + vigenere.decrypt(cipherText, key); + } +} From fa8e338154f5f91061de23446afea9be5999ae54 Mon Sep 17 00:00:00 2001 From: Nabil Date: Wed, 18 Dec 2024 11:32:05 +0100 Subject: [PATCH 35/77] chore : correct hard coded values --- src/Tests/VigenereTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tests/VigenereTest.java b/src/Tests/VigenereTest.java index 7f95117..94c17da 100644 --- a/src/Tests/VigenereTest.java +++ b/src/Tests/VigenereTest.java @@ -69,7 +69,7 @@ public void testGenerateFullKey() { public void testEncrypt_keyLongerThanText() { String plainText = "TEST"; String key = "LONGKEY"; - String expectedCipherText = "ULPG"; + String expectedCipherText = "ESFZ"; String result = VigenereAlgo.encrypt(plainText, key); assertEquals(expectedCipherText, result); @@ -78,7 +78,7 @@ public void testEncrypt_keyLongerThanText() { @Test public void testDecrypt_keyLongerThanText() { - String cipherText = "ULPG"; + String cipherText = "ESFZ"; String key = "LONGKEY"; String expectedPlainText = "TEST"; assertEquals(expectedPlainText, vigenere.decrypt(cipherText, key)); From d6fe9307e2309c55e566ba7a69873dcf20b93051 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:45:35 +0100 Subject: [PATCH 36/77] Add MD5 and SHA256 classes that extend hash Class add two hash methods sha256 and md5 edit md5 tests to handle hash class for MD5 --- ByteWarden.iml | 10 ++++++++++ src/Classes/Hash.java | 11 +++++++++++ src/Classes/MD5.java | 5 +++-- src/Classes/Sha256.java | 26 ++++++++++++++++++++++++++ src/Tests/MD5Test.java | 38 +++++++++++++++++++++++--------------- 5 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 src/Classes/Hash.java create mode 100644 src/Classes/Sha256.java diff --git a/ByteWarden.iml b/ByteWarden.iml index c3dc060..53641d9 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -17,5 +17,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/Classes/Hash.java b/src/Classes/Hash.java new file mode 100644 index 0000000..b124c5d --- /dev/null +++ b/src/Classes/Hash.java @@ -0,0 +1,11 @@ +package Classes; + +public abstract class Hash { + public abstract String calculateHash(String input); + + public void printHash(String input) { + System.out.println("Hash de \"" + input + "\": " + calculateHash(input)); + } +} + + diff --git a/src/Classes/MD5.java b/src/Classes/MD5.java index 4e6a6ae..3864484 100644 --- a/src/Classes/MD5.java +++ b/src/Classes/MD5.java @@ -3,7 +3,7 @@ import java.security.MessageDigest; import java.nio.charset.StandardCharsets; -public class MD5 { +public class MD5 extends Hash { /** * Computes the MD5 hash of a string. * @param input The string to hash @@ -11,7 +11,8 @@ public class MD5 { * @throws IllegalArgumentException if input is null * @throws RuntimeException if an error occurs during hashing */ - public static String hash(String input) { + @Override + public String calculateHash(String input) { if (input == null) { throw new IllegalArgumentException("Input cannot be null"); } diff --git a/src/Classes/Sha256.java b/src/Classes/Sha256.java new file mode 100644 index 0000000..cce7911 --- /dev/null +++ b/src/Classes/Sha256.java @@ -0,0 +1,26 @@ +package Classes; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Sha256 extends Hash { + + @Override + public String calculateHash(String input) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); //create instance of sha256 + byte[] hashBytes = digest.digest(input.getBytes()); //hash input bytes + + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + String hex = Integer.toHexString(0xff & b); //format byte in hex string + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); //concatenate bytes + } + return hexString.toString(); //return hash string + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Error :" + , e); + } + } +} \ No newline at end of file diff --git a/src/Tests/MD5Test.java b/src/Tests/MD5Test.java index 208c99a..d5397ff 100644 --- a/src/Tests/MD5Test.java +++ b/src/Tests/MD5Test.java @@ -1,73 +1,81 @@ package Tests; +import Classes.MD5; +import org.junit.Before; import org.junit.Test; import org.junit.Assert; -import Classes.MD5; public class MD5Test { + private MD5 md5; + + @Before + public void setUp() { + md5 = new MD5(); + } @Test public void testEmptyString() { - String result = MD5.hash(""); + + String result = md5.calculateHash(""); Assert.assertEquals("d41d8cd98f00b204e9800998ecf8427e", result); } @Test public void testSimpleString() { - String result = MD5.hash("test"); + String result = md5.calculateHash("test"); Assert.assertEquals("098f6bcd4621d373cade4e832627b4f6", result); } @Test public void testLongString() { - String result = MD5.hash("The quick brown fox jumps over the lazy dog"); + String result = md5.calculateHash("The quick brown fox jumps over the lazy dog"); Assert.assertEquals("9e107d9d372bb6826bd81d3542a419d6", result); } @Test public void testSpecialCharacters() { - String result = MD5.hash("!@#$%^&*()_+"); + String result = md5.calculateHash("!@#$%^&*()_+"); Assert.assertEquals("04dde9f462255fe14b5160bbf2acffe8", result); } @Test public void testUnicodeCharacters() { - String result = MD5.hash("héllo wörld"); + String result = md5.calculateHash("héllo wörld"); Assert.assertEquals("ed0c22cc110ede12327851863c078138", result); } @Test public void testConsistency() { String input = "test123"; - String firstHash = MD5.hash(input); - String secondHash = MD5.hash(input); + String firstHash = md5.calculateHash(input); + String secondHash = md5.calculateHash(input); Assert.assertEquals("The same input should produce the same hash", firstHash, secondHash); } @Test(expected = RuntimeException.class) public void testNullInput() { - MD5.hash(null); + md5.calculateHash(null); } @Test public void testCaseSensitivity() { - String lowerCase = MD5.hash("hello"); - String upperCase = MD5.hash("HELLO"); + String lowerCase = md5.calculateHash("hello"); + String upperCase = md5.calculateHash("HELLO"); Assert.assertNotEquals("Hashes of different cases should be different", lowerCase, upperCase); } @Test public void testHashLength() { - String result = MD5.hash("test"); - Assert.assertEquals("The length of the MD5 hash should be 32 characters", + String result = md5.calculateHash("test"); + Assert.assertEquals("The length of the md5 hash should be 32 characters", 32, result.length()); } @Test public void testWhitespaceHandling() { - String withSpaces = MD5.hash("test test"); - String withoutSpaces = MD5.hash("testtest"); + String withSpaces = md5.calculateHash("test test"); + String withoutSpaces = md5.calculateHash("testtest"); Assert.assertNotEquals("Spaces should affect the hash", withSpaces, withoutSpaces); } From 9f36b09828f7064e5f7b355d8b3a9abf45325e31 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Wed, 18 Dec 2024 10:56:05 +0100 Subject: [PATCH 37/77] Add tests for hash sha256 implement tests for hash class and sha256 class --- src/Tests/HashTest.java | 29 +++++++++++++++++++++++++++++ src/Tests/SHA256Test.java | 28 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/Tests/HashTest.java create mode 100644 src/Tests/SHA256Test.java diff --git a/src/Tests/HashTest.java b/src/Tests/HashTest.java new file mode 100644 index 0000000..5c7af4d --- /dev/null +++ b/src/Tests/HashTest.java @@ -0,0 +1,29 @@ +package Tests; + +import Classes.Hash; +import org.junit.Test; +import static org.junit.Assert.*; + +public class HashTest { + + private class DummyHash extends Hash { + @Override + public String calculateHash(String input) { + return "dummyhash"; + } + } + + @Test + public void testPrintHash() { + DummyHash dummyHash = new DummyHash(); + dummyHash.printHash("test"); + } + + @Test + public void testCalculateHash() { + DummyHash dummyHash = new DummyHash(); + String result = dummyHash.calculateHash("test"); + assertEquals("dummyhash", result); + } +} + diff --git a/src/Tests/SHA256Test.java b/src/Tests/SHA256Test.java new file mode 100644 index 0000000..2c2bdaa --- /dev/null +++ b/src/Tests/SHA256Test.java @@ -0,0 +1,28 @@ +package Tests; + +import Classes.Sha256; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SHA256Test { + @Test + public void testCalculateHash() { + Sha256 sha256 = new Sha256(); + String input = "test"; + String expectedHash = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"; + + String result = sha256.calculateHash(input); + assertEquals(expectedHash, result); + } + + @Test + public void testEmptyInputHash() { + Sha256 sha256 = new Sha256(); + String input = ""; + String expectedHash = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + + String result = sha256.calculateHash(input); + assertEquals(expectedHash, result); + } +} From 469c3a25a6dd7eff062bac4c8abe6f4d5fee71e6 Mon Sep 17 00:00:00 2001 From: Nabil Date: Wed, 18 Dec 2024 11:48:32 +0100 Subject: [PATCH 38/77] docs : added comments for the whole enigma package --- src/Classes/Enigma/Enigma.java | 32 ++++++++--------- src/Classes/Enigma/Plugboard.java | 18 ++++------ src/Classes/Enigma/Reflector.java | 6 ++-- src/Classes/Enigma/Rotors.java | 60 +++++++++++++++---------------- 4 files changed, 56 insertions(+), 60 deletions(-) diff --git a/src/Classes/Enigma/Enigma.java b/src/Classes/Enigma/Enigma.java index cf548bd..39aa0fe 100644 --- a/src/Classes/Enigma/Enigma.java +++ b/src/Classes/Enigma/Enigma.java @@ -1,9 +1,9 @@ package Classes.Enigma; public class Enigma { - private Rotors rotors = new Rotors(); - private Reflector reflector = new Reflector(); - private Plugboard plugboard = new Plugboard(); + private Rotors rotors = new Rotors(); // Rotors component + private Reflector reflector = new Reflector(); // Reflector component + private Plugboard plugboard = new Plugboard(); // Plugboard component public Enigma() { } @@ -15,38 +15,38 @@ public Enigma(Rotors rotors, Reflector reflector, Plugboard plugboard) { } public Rotors getRotors() { - return rotors; + return rotors; // Return the rotors component } public Reflector getReflector() { - return reflector; + return reflector; // Return the reflector component } public Plugboard getPlugboard() { - return plugboard; + return plugboard; // Return the plugboard component } public String encrypt(String message) { StringBuilder encryptedMessage = new StringBuilder(); for (char c : message.toCharArray()) { if (Character.isLetter(c)) { - c = Character.toUpperCase(c); - c = plugboard.swap(c); - c = rotors.rotate(c); - c = reflector.reflect(c); - c = rotors.rotateBack(c); - c = plugboard.swap(c); + c = Character.toUpperCase(c); // Convert to uppercase + c = plugboard.swap(c); // Swap using plugboard + c = rotors.rotate(c); // Rotate through rotors + c = reflector.reflect(c); // Reflect the character + c = rotors.rotateBack(c); // Rotate back through rotors + c = plugboard.swap(c); // Swap using plugboard again if (Character.isLowerCase(message.charAt(encryptedMessage.length()))) { - c = Character.toLowerCase(c); + c = Character.toLowerCase(c); // Convert back to lowercase if needed } } - encryptedMessage.append(c); + encryptedMessage.append(c); // Append the encrypted character } return encryptedMessage.toString(); } public String decrypt(String message) { - rotors.resetToInitialPosition(); - return encrypt(message); + rotors.resetToInitialPosition(); // Reset rotors to initial positions + return encrypt(message); // Decrypt by re-encrypting } } \ No newline at end of file diff --git a/src/Classes/Enigma/Plugboard.java b/src/Classes/Enigma/Plugboard.java index 94a3a50..d867041 100644 --- a/src/Classes/Enigma/Plugboard.java +++ b/src/Classes/Enigma/Plugboard.java @@ -4,11 +4,10 @@ import java.util.Map; public class Plugboard { - // Map to store the letter pairs for swapping - private Map connections; + private Map connections; // Map to store the letter pairs for swapping public Plugboard() { - connections = new HashMap<>(); + connections = new HashMap<>(); // Initialize the connections map } /** @@ -18,17 +17,14 @@ public Plugboard() { * @throws IllegalArgumentException if letters are already connected */ public void connect(char a, char b) { - // Convert to uppercase for consistency - a = Character.toUpperCase(a); + a = Character.toUpperCase(a); // Convert to uppercase for consistency b = Character.toUpperCase(b); - // Check if letters are already connected if (connections.containsKey(a) || connections.containsKey(b)) { - throw new IllegalArgumentException("Letters are already connected"); + throw new IllegalArgumentException("Letters are already connected"); // Check if letters are already connected } - // Create bidirectional connection - connections.put(a, b); + connections.put(a, b); // Create bidirectional connection connections.put(b, a); } @@ -38,7 +34,7 @@ public void connect(char a, char b) { * @return Swapped letter if connection exists, original letter otherwise */ public char swap(char c) { - c = Character.toUpperCase(c); - return connections.getOrDefault(c, c); + c = Character.toUpperCase(c); // Convert to uppercase for consistency + return connections.getOrDefault(c, c); // Swap the letter if connection exists } } \ No newline at end of file diff --git a/src/Classes/Enigma/Reflector.java b/src/Classes/Enigma/Reflector.java index f112d53..83b5bf6 100644 --- a/src/Classes/Enigma/Reflector.java +++ b/src/Classes/Enigma/Reflector.java @@ -1,16 +1,16 @@ package Classes.Enigma; public class Reflector { - private final String reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; + private final String reflector = "YRUHQSLDPXNGOKMIEBFZCWVJAT"; // Reflector wiring public Reflector() { } public String getReflector() { - return reflector; + return reflector; // Return the reflector wiring } public char reflect(char c) { - return reflector.charAt(c - 'A'); + return reflector.charAt(c - 'A'); // Reflect the character } } diff --git a/src/Classes/Enigma/Rotors.java b/src/Classes/Enigma/Rotors.java index 547a826..3f476f9 100644 --- a/src/Classes/Enigma/Rotors.java +++ b/src/Classes/Enigma/Rotors.java @@ -1,13 +1,13 @@ package Classes.Enigma; public class Rotors { - private final Rotor[] rotors; - private char[] initialPositions; + private final Rotor[] rotors; // Array of Rotor objects + private char[] initialPositions; // Initial positions of the rotors private static class Rotor { - private final String wiring; - private int position; - private final int notchPosition; + private final String wiring; // Wiring configuration of the rotor + private int position; // Current position of the rotor + private final int notchPosition; // Position of the notch public Rotor(String wiring, int notchPosition) { this.wiring = wiring; @@ -16,53 +16,53 @@ public Rotor(String wiring, int notchPosition) { } public void rotate() { - position = (position + 1) % 26; + position = (position + 1) % 26; // Rotate the rotor by one position } public boolean isAtNotch() { - return position == notchPosition; + return position == notchPosition; // Check if the rotor is at the notch position } public char encrypt(char c) { - int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; - char output = wiring.charAt(inputPos); - return (char)((output - 'A' - position + 26) % 26 + 'A'); + int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; // Calculate input position + char output = wiring.charAt(inputPos); // Get the output character from the wiring + return (char)((output - 'A' - position + 26) % 26 + 'A'); // Return the encrypted character } public char encryptBack(char c) { - int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; - int outputPos = wiring.indexOf((char)(inputPos + 'A')); - return (char)((outputPos - position + 26) % 26 + 'A'); + int inputPos = (Character.toUpperCase(c) - 'A' + position) % 26; // Calculate input position + int outputPos = wiring.indexOf((char)(inputPos + 'A')); // Get the output position from the wiring + return (char)((outputPos - position + 26) % 26 + 'A'); // Return the decrypted character } } public Rotors() { - rotors = new Rotor[3]; - rotors[0] = new Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ", 16); - rotors[1] = new Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE", 4); - rotors[2] = new Rotor("BDFHJLCPRTXVZNYEIWGAKMUSQO", 21); + rotors = new Rotor[3]; // Initialize the array of rotors + rotors[0] = new Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ", 16); // Rotor I + rotors[1] = new Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE", 4); // Rotor II + rotors[2] = new Rotor("BDFHJLCPRTXVZNYEIWGAKMUSQO", 21); // Rotor III } private void step() { - boolean middleAtNotch = rotors[1].isAtNotch(); + boolean middleAtNotch = rotors[1].isAtNotch(); // Check if the middle rotor is at the notch if (middleAtNotch) { - rotors[0].rotate(); - rotors[1].rotate(); + rotors[0].rotate(); // Rotate the left rotor + rotors[1].rotate(); // Rotate the middle rotor } if (rotors[2].isAtNotch()) { - rotors[1].rotate(); + rotors[1].rotate(); // Rotate the middle rotor if the right rotor is at the notch } - rotors[2].rotate(); + rotors[2].rotate(); // Always rotate the right rotor } public char rotate(char c) { - step(); + step(); // Step the rotors char result = c; for (int i = rotors.length - 1; i >= 0; i--) { - result = rotors[i].encrypt(result); + result = rotors[i].encrypt(result); // Encrypt the character through the rotors } return result; } @@ -70,29 +70,29 @@ public char rotate(char c) { public char rotateBack(char c) { char result = c; for (int i = 0; i < rotors.length; i++) { - result = rotors[i].encryptBack(result); + result = rotors[i].encryptBack(result); // Decrypt the character through the rotors } return result; } public void setPositions(char[] positions) { if (positions.length != 3) { - throw new IllegalArgumentException("Must provide exactly 3 positions"); + throw new IllegalArgumentException("Must provide exactly 3 positions"); // Validate input } - this.initialPositions = positions.clone(); + this.initialPositions = positions.clone(); // Store initial positions for (int i = 0; i < 3; i++) { - rotors[i].position = Character.toUpperCase(positions[i]) - 'A'; + rotors[i].position = Character.toUpperCase(positions[i]) - 'A'; // Set rotor positions } } public void resetToInitialPosition() { if (initialPositions != null) { for (int i = 0; i < 3; i++) { - rotors[i].position = Character.toUpperCase(initialPositions[i]) - 'A'; + rotors[i].position = Character.toUpperCase(initialPositions[i]) - 'A'; // Reset to initial positions } } else { for (int i = 0; i < 3; i++) { - rotors[i].position = 0; + rotors[i].position = 0; // Reset to position 0 if no initial positions are set } } } From 469c4801addb9b36d7a6beb9f703c570c2ab48db Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 11:54:50 +0100 Subject: [PATCH 39/77] ROT(X) algorithm with tests --- src/Classes/ROTX.java | 30 ++++++++++++++++++++ src/Tests/ROTXTest.java | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/Classes/ROTX.java create mode 100644 src/Tests/ROTXTest.java diff --git a/src/Classes/ROTX.java b/src/Classes/ROTX.java new file mode 100644 index 0000000..e717d6c --- /dev/null +++ b/src/Classes/ROTX.java @@ -0,0 +1,30 @@ +package Classes; + +public class ROTX { + + public static String encryptROT(String input, int x) { + StringBuilder encryptedString = new StringBuilder(); + + // Normalisation of X to be in the interval [0, 25] + x = x % 26; // ensure that x is in [0, 25] + if (x < 0) { + x += 26; // IF X is negative we adjust it to be positive + } + // Iterate through each character of the string + for (char character : input.toCharArray()) { + // Check if the character is a letter (uppercase or lowercase) + if (Character.isLetter(character)) { + // Determine the base depending on whether the letter is uppercase or lowercase + char base = Character.isLowerCase(character) ? 'a' : 'A'; + // Apply ROT(X) encryption + char encryptedChar = (char) ((character - base + x) % 26 + base); + encryptedString.append(encryptedChar); + } else { + // Append non-alphabetic characters without changing them + encryptedString.append(character); + } + } + + return encryptedString.toString(); + } +} diff --git a/src/Tests/ROTXTest.java b/src/Tests/ROTXTest.java new file mode 100644 index 0000000..778a575 --- /dev/null +++ b/src/Tests/ROTXTest.java @@ -0,0 +1,62 @@ +package Tests; + +import org.junit.Test; +import static org.junit.Assert.*; +import Classes.ROTX; + +public class ROTXTest { + + // Test de base avec une rotation classique + @Test + public void testRotationPositive() { + String input = "abc"; + int shift = 3; + String expected = "def"; // "abc" avec ROT(3) devient "def" + String result = ROTX.encryptROT(input, shift); + assertEquals("Le texte n'est pas correctement transformé", expected, result); + } + + // Test avec une rotation nulle + @Test + public void testRotationZero() { + String input = "abc"; + int shift = 0; + String expected = "abc"; // ROT(0) ne modifie pas le texte + String result = ROTX.encryptROT(input, shift); + assertEquals("La rotation nulle n'a pas fonctionné comme prévu", expected, result); + } + + // Test avec une rotation négative + @Test + public void testRotationNegative() { + String input = "abc"; + int shift = -3; + String expected = "xyz"; // "abc" avec ROT(-3) devient "xyz" + String result = ROTX.encryptROT(input, shift); + assertEquals("La rotation négative ne donne pas le bon résultat", expected, result); + } + + // Test avec des caractères non alphabétiques (espaces et symboles) + @Test + public void testNonAlphabeticCharacters() { + String input = "abc 123!"; + int shift = 3; + String expected = "def 123!"; // Les caractères non alphabétiques ne doivent pas être affectés + String result = ROTX.encryptROT(input, shift); + assertEquals("Les caractères non alphabétiques ne sont pas correctement gérés", expected, result); + } + + + + // Test sur un texte vide + @Test + public void testEmptyString() { + String input = ""; + int shift = 5; + String expected = ""; // La chaîne vide ne doit pas être modifiée + String result = ROTX.encryptROT(input, shift); + assertEquals("La chaîne vide n'a pas été gérée correctement", expected, result); + } + + +} From b9e0b2a4405f88af6a92e290deccd0cdff643112 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 12:06:16 +0100 Subject: [PATCH 40/77] add comments to ROTX Tests --- src/Tests/ROTXTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Tests/ROTXTest.java b/src/Tests/ROTXTest.java index 778a575..4305efc 100644 --- a/src/Tests/ROTXTest.java +++ b/src/Tests/ROTXTest.java @@ -6,49 +6,49 @@ public class ROTXTest { - // Test de base avec une rotation classique + // Base test with classic rotation @Test public void testRotationPositive() { String input = "abc"; int shift = 3; - String expected = "def"; // "abc" avec ROT(3) devient "def" + String expected = "def"; // "abc" with ROT(3) becomes "def" String result = ROTX.encryptROT(input, shift); assertEquals("Le texte n'est pas correctement transformé", expected, result); } - // Test avec une rotation nulle + // Test with a null function @Test public void testRotationZero() { String input = "abc"; int shift = 0; - String expected = "abc"; // ROT(0) ne modifie pas le texte + String expected = "abc"; // ROT(0) don't modify the text String result = ROTX.encryptROT(input, shift); assertEquals("La rotation nulle n'a pas fonctionné comme prévu", expected, result); } - // Test avec une rotation négative + // Test with negative rotation @Test public void testRotationNegative() { String input = "abc"; int shift = -3; - String expected = "xyz"; // "abc" avec ROT(-3) devient "xyz" + String expected = "xyz"; // "abc" with ROT(-3) becomes "xyz" String result = ROTX.encryptROT(input, shift); assertEquals("La rotation négative ne donne pas le bon résultat", expected, result); } - // Test avec des caractères non alphabétiques (espaces et symboles) + // Test with non-alphabetical characters (spaces and symbols) @Test public void testNonAlphabeticCharacters() { String input = "abc 123!"; int shift = 3; - String expected = "def 123!"; // Les caractères non alphabétiques ne doivent pas être affectés + String expected = "def 123!"; // Non-alphabetical characters must not be affected String result = ROTX.encryptROT(input, shift); assertEquals("Les caractères non alphabétiques ne sont pas correctement gérés", expected, result); } - // Test sur un texte vide + // Test on an empty text @Test public void testEmptyString() { String input = ""; From 1845676b1237d86ba81ff54f9dbbb6a495ce547d Mon Sep 17 00:00:00 2001 From: snowsuit321 Date: Wed, 18 Dec 2024 14:30:04 +0100 Subject: [PATCH 41/77] feat : add polyb square encrytion method --- src/Classes/PolybSquareEncrypter.java | 105 +++++++++++++++++++ src/Classes/PolybSquareLayout.java | 8 ++ src/Classes/PolybSquareLayoutCollection.java | 46 ++++++++ 3 files changed, 159 insertions(+) create mode 100644 src/Classes/PolybSquareEncrypter.java create mode 100644 src/Classes/PolybSquareLayout.java create mode 100644 src/Classes/PolybSquareLayoutCollection.java diff --git a/src/Classes/PolybSquareEncrypter.java b/src/Classes/PolybSquareEncrypter.java new file mode 100644 index 0000000..4861d10 --- /dev/null +++ b/src/Classes/PolybSquareEncrypter.java @@ -0,0 +1,105 @@ +package Classes; + +import java.util.ArrayList; +import java.util.List; + +/** + * Class used to encrypt and decrypt string of text using polyb square algorithm. + * @remarks String must be only composed of letters. + * @remarks All space character will not be taken into account. + */ +public class PolybSquareEncrypter { + + // Fields. + /** + * The layout choose by the user for the polyb table encrypter. + */ + private final PolybSquareLayout LayoutChoice; + + /** + * The current polybTable used for this encrypter. + */ + private final char[][] PolybSquareTable; + + /** + * The succession of numbers (XY) recovered according to the characters of the plain text to encode. + */ + private final List polybCodeResults = new ArrayList<>(); + + + // Constructor. + public PolybSquareEncrypter(PolybSquareLayout layoutChoice) { + this.LayoutChoice = layoutChoice; + this.PolybSquareTable = new PolybSquareLayoutCollection().getPolybSquareLayout(layoutChoice); + } + + + /** + * Get all two-digits numbers corresponding to each character of the text to encrypt. + * @param plainText The text to encrypt. + */ + public final void encrypt(String plainText) { + + for (int i = 0;i < plainText.length(); i++){ + // Polyb table contain 25 value. In consequence, we decide to interpret w as two v character. + if (plainText.charAt(i) == 'w'){ + polybCodeResults.add(findPolybSquareCode('v')); + polybCodeResults.add(findPolybSquareCode('v')); + } + else if (Character.isLetter(plainText.charAt(i))) // must be a letter + { + String code = findPolybSquareCode(plainText.charAt(i)); + polybCodeResults.add(code); + } + else // other character such as number, special, space character are ignored. + { + break; + } + } + + // End of encryption. + System.out.println(polybCodeResults); + } + + /** Get the number corresponding to the coordinate of the character in the current polyb table. + * @param characterToFind the character to find in polyb table. + * @return a two digits number. + * @remarks First digit is the X coordinate in the polyb table, second is Y. + */ + private final String findPolybSquareCode(char characterToFind) { + // for each col -> ordinate Y + for (int i = 0; i < PolybSquareTable.length; i++) { + // for each row -> abscyssa X + for (int j = 0; j < PolybSquareTable[i].length; j++) { + // if the character at this position in the table match, get his code + if (PolybSquareTable[i][j] == characterToFind) { + // XY + // Add one to col and row value in order to start to 1 and not 0. + return String.valueOf(j + 1) + String.valueOf(i + 1); + } + } + } + // If no match is found, instead of throwing error, we use a blank character. + System.out.println("Unrecognized character"); + return null; + //return "__"; + } + + + + + + + + + + + + + + + + + + +} diff --git a/src/Classes/PolybSquareLayout.java b/src/Classes/PolybSquareLayout.java new file mode 100644 index 0000000..2b2313f --- /dev/null +++ b/src/Classes/PolybSquareLayout.java @@ -0,0 +1,8 @@ +package Classes; + +public enum PolybSquareLayout { + HORIZONTAL, + VERTICAL, + //CLOCKWISE_SPIRAL, + //COUNTERCLOCKWISE_SPIRAL +} \ No newline at end of file diff --git a/src/Classes/PolybSquareLayoutCollection.java b/src/Classes/PolybSquareLayoutCollection.java new file mode 100644 index 0000000..e9290f4 --- /dev/null +++ b/src/Classes/PolybSquareLayoutCollection.java @@ -0,0 +1,46 @@ +package Classes; + +import java.util.Dictionary; +import java.util.Hashtable; + +/** + * The class managing access to all the possible layout for the polybSquare Encrypter + */ +public class PolybSquareLayoutCollection { + + // Fields. + // All character of the latin alphabet are listed from a to z + private final char[][] horizontal = { + {'a','b','c','d','e'}, + {'f','g','h','i','j'}, + {'k','l','m','n','o'}, + {'p','q','r','s','t'}, + {'u','v','x','y','z'}, + }; + + private final char[][] vertical = { + {'a','f','k','p','u'}, + {'b','g','l','q','v'}, + {'c','h','m','r','x'}, + {'d','i','n','s','y'}, + {'e','j','o','t','z'}, + }; + + private final Dictionary polybSquareTables = new Hashtable<>(); + //{{ + // put(PolybSquareAlphabet.VERTICAL, vertical); + //}} + + // CONSTRUCTOR. + public PolybSquareLayoutCollection() { + polybSquareTables.put(PolybSquareLayout.VERTICAL, vertical); + polybSquareTables.put(PolybSquareLayout.HORIZONTAL, horizontal); + } + + // Functions. + public char[][] getPolybSquareLayout(PolybSquareLayout alphabet) + { + // TODO Add error management + return polybSquareTables.get(alphabet); + } +} From eb20d6d163f67f84b69d572d13a93bccc9601b24 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 14:31:45 +0100 Subject: [PATCH 42/77] main menu development In Progress --- src/Classes/Menu.java | 150 ++++++++++++++++++++++++++++++++++++++++ src/Classes/ROTX.java | 28 ++++++++ src/Tests/ROTXTest.java | 50 +++++++++++++- 3 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 src/Classes/Menu.java diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java new file mode 100644 index 0000000..0dbacb0 --- /dev/null +++ b/src/Classes/Menu.java @@ -0,0 +1,150 @@ +package Classes; + +import java.util.Scanner; +import Classes.ROTX; +import Classes.VigenereAlgo; +import Classes.RC4; +import Classes.Enigma.Enigma; +import Classes.Enigma.Plugboard; +import Classes.Enigma.Reflector; +import Classes.Enigma.Rotors; +public class Menu { + + + ////////////// ENCRYPTION /////////// + // Methods for each encryption algorithm + public static String encryptEnigma(String password) { + // Enigma algorithm implementation + return "Enigma Encryption: " + password; // Simplified example + } + + public static String encryptRC4(String password) { + // RC4 algorithm implementation + return " RC4.encrypt(password);"; // Simplified example + } + + public static String encryptROT(String password, int x) { + // ROT(x) algorithm implementation + return ROTX.encryptROT(password, x); + } + + public static String encryptVigenere(String password, String key) { + // Use the VigenereAlgo class to encrypt with the Vigenère algorithm + return VigenereAlgo.encrypt(password, key); + } + + + /////////// DECRYPTION /////////// + // Methods for each decryption algorithm + public static String decryptEnigma(String encryptedMessage) { + // Enigma algorithm decryption (adapt as per actual algorithm) + return "Enigma Decryption: " + encryptedMessage; // Simplified example + } + + public static String decryptRC4(String encryptedMessage) { + // RC4 algorithm decryption + return "RC4 Decryption: " + encryptedMessage; // Simplified example + } + + public static String decryptROT(String input, int x) { + // ROT(x) algorithm decryption + return ROTX.decryptROT(input, x); + } + + public static String decryptVigenere(String encryptedMessage, String key) { + // Use the VigenereAlgo class to decrypt with the Vigenère algorithm + return VigenereAlgo.decrypt(encryptedMessage, key); + } + + // Main method + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + // Display the main menu + System.out.println("Choose an option:"); + System.out.println("1. Encrypt a password"); + System.out.println("2. Decrypt a password"); + int mainChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline after an integer + + if (mainChoice == 1) { + // Encrypt the password + System.out.println("Enter the password to encrypt:"); + String password = scanner.nextLine(); + + // Menu to choose the algorithm + System.out.println("Choose an encryption algorithm:"); + System.out.println("1. Enigma"); + System.out.println("2. RC4"); + System.out.println("3. ROT(X)"); + System.out.println("4. Vigenère"); + int algoChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline after an integer + + String encryptedPassword = ""; + switch (algoChoice) { + case 1: + encryptedPassword = encryptEnigma(password); + break; + case 2: + encryptedPassword = encryptRC4(password); + break; + case 3: + System.out.println("Enter the value of X for ROT(X):"); + int x = scanner.nextInt(); + encryptedPassword = encryptROT(password, x); + break; + case 4: + System.out.println("Enter the key for Vigenère:"); + String key = scanner.nextLine(); + encryptedPassword = encryptVigenere(password, key); + break; + default: + System.out.println("Invalid choice."); + return; // Exit if invalid choice + } + System.out.println("Encrypted password: " + encryptedPassword); + } else if (mainChoice == 2) { + // Decrypt the message + System.out.println("Enter the password to decrypt:"); + String encryptedMessage = scanner.nextLine(); + + // Menu to choose the decryption algorithm + System.out.println("Choose a decryption algorithm:"); + System.out.println("1. Enigma"); + System.out.println("2. RC4"); + System.out.println("3. ROT(X)"); + System.out.println("4. Vigenère"); + int algoChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline after an integer + + String decryptedMessage = ""; + switch (algoChoice) { + case 1: + decryptedMessage = decryptEnigma(encryptedMessage); + break; + case 2: + decryptedMessage = decryptRC4(encryptedMessage); + break; + case 3: + System.out.println("Enter the value of X for ROT(X):"); + int x = scanner.nextInt(); + decryptedMessage = decryptROT(encryptedMessage, x); + break; + case 4: + System.out.println("Enter the key for Vigenère:"); + String key = scanner.nextLine(); + decryptedMessage = decryptVigenere(encryptedMessage, key); + break; + default: + System.out.println("Invalid choice."); + return; // Exit if invalid choice + } + System.out.println("Decrypted password: " + decryptedMessage); + } else { + System.out.println("Invalid choice."); + } + + scanner.close(); + } +} diff --git a/src/Classes/ROTX.java b/src/Classes/ROTX.java index e717d6c..1f77f24 100644 --- a/src/Classes/ROTX.java +++ b/src/Classes/ROTX.java @@ -2,6 +2,7 @@ public class ROTX { + // Encryption function public static String encryptROT(String input, int x) { StringBuilder encryptedString = new StringBuilder(); @@ -27,4 +28,31 @@ public static String encryptROT(String input, int x) { return encryptedString.toString(); } + + // Decryption function + public static String decryptROT(String input, int x) { + StringBuilder decryptedString = new StringBuilder(); + + // Normalisation of X to be in the interval [0, 25] + x = x % 26; // ensure that x is in [0, 25] + if (x < 0) { + x += 26; // IF X is negative we adjust it to be positive + } + // Iterate through each character of the string + for (char character : input.toCharArray()) { + // Check if the character is a letter (uppercase or lowercase) + if (Character.isLetter(character)) { + // Determine the base depending on whether the letter is uppercase or lowercase + char base = Character.isLowerCase(character) ? 'a' : 'A'; + // Apply ROT(X) decryption (subtract x instead of adding it) + char decryptedChar = (char) ((character - base - x + 26) % 26 + base); + decryptedString.append(decryptedChar); + } else { + // Append non-alphabetic characters without changing them + decryptedString.append(character); + } + } + + return decryptedString.toString(); + } } diff --git a/src/Tests/ROTXTest.java b/src/Tests/ROTXTest.java index 4305efc..87e1401 100644 --- a/src/Tests/ROTXTest.java +++ b/src/Tests/ROTXTest.java @@ -46,8 +46,6 @@ public void testNonAlphabeticCharacters() { assertEquals("Les caractères non alphabétiques ne sont pas correctement gérés", expected, result); } - - // Test on an empty text @Test public void testEmptyString() { @@ -58,5 +56,53 @@ public void testEmptyString() { assertEquals("La chaîne vide n'a pas été gérée correctement", expected, result); } + // Test de décryptage avec une rotation positive + @Test + public void testDecryptionPositive() { + String input = "def"; + int shift = 3; + String expected = "abc"; // "def" avec ROT(-3) devient "abc" + String result = ROTX.decryptROT(input, shift); + assertEquals("Le texte n'a pas été correctement décrypté", expected, result); + } + + // Test de décryptage avec une rotation négative + @Test + public void testDecryptionNegative() { + String input = "xyz"; + int shift = -3; + String expected = "abc"; // "xyz" avec ROT(3) devient "abc" + String result = ROTX.decryptROT(input, shift); + assertEquals("Le texte n'a pas été correctement décrypté", expected, result); + } + // Test de décryptage avec une rotation nulle + @Test + public void testDecryptionZero() { + String input = "abc"; + int shift = 0; + String expected = "abc"; // ROT(0) ne modifie pas le texte + String result = ROTX.decryptROT(input, shift); + assertEquals("La décryptation nulle n'a pas fonctionné comme prévu", expected, result); + } + + // Test de décryptage avec des caractères non alphabétiques + @Test + public void testDecryptionNonAlphabeticCharacters() { + String input = "def 123!"; + int shift = 3; + String expected = "abc 123!"; // Les caractères non alphabétiques ne doivent pas être affectés + String result = ROTX.decryptROT(input, shift); + assertEquals("Les caractères non alphabétiques ne sont pas correctement décryptés", expected, result); + } + + // Test de décryptage avec une chaîne vide + @Test + public void testDecryptionEmptyString() { + String input = ""; + int shift = 5; + String expected = ""; // La chaîne vide ne doit pas être modifiée + String result = ROTX.decryptROT(input, shift); + assertEquals("La chaîne vide n'a pas été décryptée correctement", expected, result); + } } From 2a9d6baf9bd971223870cf52c0b018d3b054a209 Mon Sep 17 00:00:00 2001 From: lucas Date: Wed, 18 Dec 2024 15:35:52 +0100 Subject: [PATCH 43/77] Main Menu bdd setup --- src/Classes/Menu.java | 300 +++++++++++++++++++++++++----------------- 1 file changed, 180 insertions(+), 120 deletions(-) diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 0dbacb0..0034e88 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -1,150 +1,210 @@ package Classes; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Map; import java.util.Scanner; -import Classes.ROTX; -import Classes.VigenereAlgo; -import Classes.RC4; -import Classes.Enigma.Enigma; -import Classes.Enigma.Plugboard; -import Classes.Enigma.Reflector; -import Classes.Enigma.Rotors; + public class Menu { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + // Initial menu + System.out.println("Welcome to the Encryption/Decryption Program"); + System.out.println("Choose an option:"); + System.out.println("1. Choose an existing database"); + System.out.println("2. Create a new database"); + int dbChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline after integer input + + if (dbChoice == 1) { + System.out.println("You selected: Choose an existing database"); + // Add logic to handle existing databases (e.g., load or list databases) + } else if (dbChoice == 2) { + System.out.println("You selected: Create a new database"); + // Add logic to create a new database + } else { + System.out.println("Invalid choice."); + return; // Exit if invalid choice + } + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + Sha256 sha256 = new Sha256(); // For password verification + + System.out.print("Enter the name of the BDD file (without .json extension): "); + String bddFileName = scanner.nextLine() + ".json"; + File bddFile = new File(bddFileName); + + if (!bddFile.exists() || !bddFile.isFile()) { + System.out.println("File does not exist or is not a valid JSON file."); + return; + } + try (FileReader reader = new FileReader(bddFile)) { + Map bddData = gson.fromJson(reader, Map.class); + + // Verify the password + System.out.print("Enter the password for the BDD: "); + String inputPassword = scanner.nextLine(); + String hashedInputPassword = sha256.calculateHash(inputPassword); + + if (!hashedInputPassword.equals(bddData.get("password"))) { + System.out.println("Incorrect password!"); + return; + } + + System.out.println("\nConnected to BDD: " + bddData.get("name")); + + // Display the secondary menu + while (true) { + System.out.println("\nChoose an option:"); + System.out.println("1. Encrypt a password"); + System.out.println("2. Decrypt a password"); + System.out.println("0. Exit"); + int choice = scanner.nextInt(); + scanner.nextLine(); // Consume newline + + if (choice == 0) { + System.out.println("Exiting..."); + break; + } + + switch (choice) { + case 1: // Encrypt + System.out.println("Enter the password to encrypt:"); + String passwordToEncrypt = scanner.nextLine(); + + System.out.println("Choose an encryption algorithm:"); + System.out.println("1. Enigma"); + System.out.println("2. RC4"); + System.out.println("3. ROT(X)"); + System.out.println("4. Vigenère"); + int algoChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline + + String encryptedPassword = ""; + switch (algoChoice) { + case 1: + encryptedPassword = encryptEnigma(passwordToEncrypt); + break; + case 2: + encryptedPassword = encryptRC4(passwordToEncrypt); + break; + case 3: + System.out.println("Enter the value of X for ROT(X):"); + int x = scanner.nextInt(); + scanner.nextLine(); // Consume newline + encryptedPassword = encryptROT(passwordToEncrypt, x); + break; + case 4: + System.out.println("Enter the key for Vigenère:"); + String key = scanner.nextLine(); + encryptedPassword = encryptVigenere(passwordToEncrypt, key); + break; + default: + System.out.println("Invalid algorithm choice."); + continue; + } + + System.out.println("Encrypted password: " + encryptedPassword); + + // Save the encrypted password to the JSON file + bddData.put("encrypted_password", encryptedPassword); + try (FileWriter writer = new FileWriter(bddFile)) { + gson.toJson(bddData, writer); + System.out.println("Encrypted password saved to BDD."); + } catch (IOException e) { + System.out.println("Error saving to BDD file."); + } + break; + + case 2: // Decrypt + String encryptedMessage = bddData.get("encrypted_password"); + if (encryptedMessage == null) { + System.out.println("No encrypted password found in the BDD."); + break; + } + + System.out.println("Choose a decryption algorithm:"); + System.out.println("1. Enigma"); + System.out.println("2. RC4"); + System.out.println("3. ROT(X)"); + System.out.println("4. Vigenère"); + int decryptAlgoChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline + + String decryptedPassword = ""; + switch (decryptAlgoChoice) { + case 1: + decryptedPassword = decryptEnigma(encryptedMessage); + break; + case 2: + decryptedPassword = decryptRC4(encryptedMessage); + break; + case 3: + System.out.println("Enter the value of X for ROT(X):"); + int x = scanner.nextInt(); + scanner.nextLine(); // Consume newline + decryptedPassword = decryptROT(encryptedMessage, x); + break; + case 4: + System.out.println("Enter the key for Vigenère:"); + String key = scanner.nextLine(); + decryptedPassword = decryptVigenere(encryptedMessage, key); + break; + default: + System.out.println("Invalid algorithm choice."); + continue; + } + + System.out.println("Decrypted password: " + decryptedPassword); + break; + + default: + System.out.println("Invalid choice."); + } + } + } catch (IOException e) { + System.out.println("An error occurred while accessing the BDD file."); + e.printStackTrace(); + } + } - ////////////// ENCRYPTION /////////// - // Methods for each encryption algorithm + // Encryption algorithms (simplified implementations) public static String encryptEnigma(String password) { - // Enigma algorithm implementation - return "Enigma Encryption: " + password; // Simplified example + return "Enigma Encryption: " + password; // Replace with actual implementation } public static String encryptRC4(String password) { - // RC4 algorithm implementation - return " RC4.encrypt(password);"; // Simplified example + return "RC4 Encryption: " + password; // Replace with actual implementation } public static String encryptROT(String password, int x) { - // ROT(x) algorithm implementation - return ROTX.encryptROT(password, x); + return ROTX.encryptROT(password, x); // Replace with actual implementation } public static String encryptVigenere(String password, String key) { - // Use the VigenereAlgo class to encrypt with the Vigenère algorithm - return VigenereAlgo.encrypt(password, key); + return VigenereAlgo.encrypt(password, key); // Replace with actual implementation } - - /////////// DECRYPTION /////////// - // Methods for each decryption algorithm + // Decryption algorithms (simplified implementations) public static String decryptEnigma(String encryptedMessage) { - // Enigma algorithm decryption (adapt as per actual algorithm) - return "Enigma Decryption: " + encryptedMessage; // Simplified example + return "Enigma Decryption: " + encryptedMessage; // Replace with actual implementation } public static String decryptRC4(String encryptedMessage) { - // RC4 algorithm decryption - return "RC4 Decryption: " + encryptedMessage; // Simplified example + return "RC4 Decryption: " + encryptedMessage; // Replace with actual implementation } public static String decryptROT(String input, int x) { - // ROT(x) algorithm decryption - return ROTX.decryptROT(input, x); + return ROTX.decryptROT(input, x); // Replace with actual implementation } public static String decryptVigenere(String encryptedMessage, String key) { - // Use the VigenereAlgo class to decrypt with the Vigenère algorithm - return VigenereAlgo.decrypt(encryptedMessage, key); - } - - // Main method - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - // Display the main menu - System.out.println("Choose an option:"); - System.out.println("1. Encrypt a password"); - System.out.println("2. Decrypt a password"); - int mainChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline after an integer - - if (mainChoice == 1) { - // Encrypt the password - System.out.println("Enter the password to encrypt:"); - String password = scanner.nextLine(); - - // Menu to choose the algorithm - System.out.println("Choose an encryption algorithm:"); - System.out.println("1. Enigma"); - System.out.println("2. RC4"); - System.out.println("3. ROT(X)"); - System.out.println("4. Vigenère"); - int algoChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline after an integer - - String encryptedPassword = ""; - switch (algoChoice) { - case 1: - encryptedPassword = encryptEnigma(password); - break; - case 2: - encryptedPassword = encryptRC4(password); - break; - case 3: - System.out.println("Enter the value of X for ROT(X):"); - int x = scanner.nextInt(); - encryptedPassword = encryptROT(password, x); - break; - case 4: - System.out.println("Enter the key for Vigenère:"); - String key = scanner.nextLine(); - encryptedPassword = encryptVigenere(password, key); - break; - default: - System.out.println("Invalid choice."); - return; // Exit if invalid choice - } - System.out.println("Encrypted password: " + encryptedPassword); - } else if (mainChoice == 2) { - // Decrypt the message - System.out.println("Enter the password to decrypt:"); - String encryptedMessage = scanner.nextLine(); - - // Menu to choose the decryption algorithm - System.out.println("Choose a decryption algorithm:"); - System.out.println("1. Enigma"); - System.out.println("2. RC4"); - System.out.println("3. ROT(X)"); - System.out.println("4. Vigenère"); - int algoChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline after an integer - - String decryptedMessage = ""; - switch (algoChoice) { - case 1: - decryptedMessage = decryptEnigma(encryptedMessage); - break; - case 2: - decryptedMessage = decryptRC4(encryptedMessage); - break; - case 3: - System.out.println("Enter the value of X for ROT(X):"); - int x = scanner.nextInt(); - decryptedMessage = decryptROT(encryptedMessage, x); - break; - case 4: - System.out.println("Enter the key for Vigenère:"); - String key = scanner.nextLine(); - decryptedMessage = decryptVigenere(encryptedMessage, key); - break; - default: - System.out.println("Invalid choice."); - return; // Exit if invalid choice - } - System.out.println("Decrypted password: " + decryptedMessage); - } else { - System.out.println("Invalid choice."); - } - - scanner.close(); + return VigenereAlgo.decrypt(encryptedMessage, key); // Replace with actual implementation } } From 0a2d66973a1f7801c61392c4ef28c1cb88bb655d Mon Sep 17 00:00:00 2001 From: snowsuit321 Date: Wed, 18 Dec 2024 16:01:17 +0100 Subject: [PATCH 44/77] feat : add polyb square decryption method --- src/Classes/PolybSquareEncrypter.java | 31 ++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Classes/PolybSquareEncrypter.java b/src/Classes/PolybSquareEncrypter.java index 4861d10..a7f68dc 100644 --- a/src/Classes/PolybSquareEncrypter.java +++ b/src/Classes/PolybSquareEncrypter.java @@ -25,7 +25,7 @@ public class PolybSquareEncrypter { * The succession of numbers (XY) recovered according to the characters of the plain text to encode. */ private final List polybCodeResults = new ArrayList<>(); - + // TODO need to clear this array after sending to the rest of the system; // Constructor. public PolybSquareEncrypter(PolybSquareLayout layoutChoice) { @@ -85,6 +85,35 @@ private final String findPolybSquareCode(char characterToFind) { //return "__"; } + public final String decrypt(String encryptedText) + { + // local + StringBuilder decryptedCharacters = new StringBuilder(""); + + for (int i = 0;i < encryptedText.length(); i+=2) { + char firstChar = encryptedText.charAt(i); + char secondChar = encryptedText.charAt(i+1); + + decryptedCharacters.append(getCharacterFromPolybSquareCode(firstChar, secondChar)); + } + + return decryptedCharacters.toString(); + } + + /** + * @param firstChar X + * @param secondChar Y + * @return code + */ + private final char getCharacterFromPolybSquareCode(char firstChar, char secondChar) { + //System.out.println(firstChar + " " + secondChar); + int x = Character.getNumericValue(firstChar); + int y = Character.getNumericValue(secondChar); + // table are manipulated Y X + // - 1 beccause table index start at 0 and not 1. + return PolybSquareTable[y - 1][x - 1]; + } + From ceff994f0abe44c95344aeb1f9eb0637767589b1 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Wed, 18 Dec 2024 20:37:59 +0100 Subject: [PATCH 45/77] Add Menu Add menu, with navigation, creation database with password and hash register, website creation /mofdify/delete, password generation, and test for new classes, passwordUtils/DatabasesManager/SiteManager --- .idea/libraries/google_code_gson.xml | 11 ++ ByteWarden.iml | 1 + databases.json | 3 + esffs.json | 9 ++ src/Classes/DatabasesManager.java | 57 +++++++ src/Classes/Menu.java | 218 ++++----------------------- src/Classes/PasswordUtils.java | 18 +++ src/Classes/SiteManager.java | 118 +++++++++++++++ src/Tests/DatabasesManagerTest.java | 58 +++++++ src/Tests/PasswordUtilsTest.java | 20 +++ src/Tests/SiteManagerTest.java | 61 ++++++++ test_databases.json | 3 + test_sites.json | 3 + 13 files changed, 393 insertions(+), 187 deletions(-) create mode 100644 .idea/libraries/google_code_gson.xml create mode 100644 databases.json create mode 100644 esffs.json create mode 100644 src/Classes/DatabasesManager.java create mode 100644 src/Classes/PasswordUtils.java create mode 100644 src/Classes/SiteManager.java create mode 100644 src/Tests/DatabasesManagerTest.java create mode 100644 src/Tests/PasswordUtilsTest.java create mode 100644 src/Tests/SiteManagerTest.java create mode 100644 test_databases.json create mode 100644 test_sites.json diff --git a/.idea/libraries/google_code_gson.xml b/.idea/libraries/google_code_gson.xml new file mode 100644 index 0000000..f62abb1 --- /dev/null +++ b/.idea/libraries/google_code_gson.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ByteWarden.iml b/ByteWarden.iml index 53641d9..ac7722e 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -27,5 +27,6 @@ + \ No newline at end of file diff --git a/databases.json b/databases.json new file mode 100644 index 0000000..3f862b5 --- /dev/null +++ b/databases.json @@ -0,0 +1,3 @@ +{ + "esffs": "e4aebaf0f1b173cdf19ae33a5539cc4e52990f37473f6f41623e1a3a346fa713" +} \ No newline at end of file diff --git a/esffs.json b/esffs.json new file mode 100644 index 0000000..0056105 --- /dev/null +++ b/esffs.json @@ -0,0 +1,9 @@ +{ + "sites": [ + { + "siteName": "example.com", + "password": "password1", + "username": "user1" + } + ] +} \ No newline at end of file diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java new file mode 100644 index 0000000..c2404a6 --- /dev/null +++ b/src/Classes/DatabasesManager.java @@ -0,0 +1,57 @@ +package Classes; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +public class DatabasesManager { + private final File databasesFile; + private final Map databases; + + public DatabasesManager(File databasesFile) { + this.databasesFile = databasesFile; + this.databases = loadDatabases(); + } + + public boolean verifyDatabase(String dbName, String password) { + String hashedPassword = PasswordUtils.hashPassword(password); + return databases.containsKey(dbName) && databases.get(dbName).equals(hashedPassword); + } + + public void createDatabase(String dbName, String password) { + if (databases.containsKey(dbName)) { + throw new IllegalArgumentException("Database already exists."); + } + String hashedPassword = PasswordUtils.hashPassword(password); + databases.put(dbName, hashedPassword); + saveDatabases(); + } + + public Map loadDatabases() { + if (!databasesFile.exists()) return new HashMap<>(); + try (FileReader reader = new FileReader(databasesFile)) { + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + return gson.fromJson(reader, type); + } catch (IOException e) { + return new HashMap<>(); + } + } + + private void saveDatabases() { + try (FileWriter writer = new FileWriter(databasesFile)) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + gson.toJson(databases, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 0034e88..a3b8821 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -1,210 +1,54 @@ package Classes; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.Map; import java.util.Scanner; public class Menu { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); + File databasesFile = new File("databases.json"); + DatabasesManager dbManager = new DatabasesManager(databasesFile); - // Initial menu System.out.println("Welcome to the Encryption/Decryption Program"); System.out.println("Choose an option:"); System.out.println("1. Choose an existing database"); System.out.println("2. Create a new database"); int dbChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline after integer input + scanner.nextLine(); if (dbChoice == 1) { - System.out.println("You selected: Choose an existing database"); - // Add logic to handle existing databases (e.g., load or list databases) - } else if (dbChoice == 2) { - System.out.println("You selected: Create a new database"); - // Add logic to create a new database - } else { - System.out.println("Invalid choice."); - return; // Exit if invalid choice - } - Gson gson = new GsonBuilder().setPrettyPrinting().create(); - Sha256 sha256 = new Sha256(); // For password verification - - System.out.print("Enter the name of the BDD file (without .json extension): "); - String bddFileName = scanner.nextLine() + ".json"; - File bddFile = new File(bddFileName); - - if (!bddFile.exists() || !bddFile.isFile()) { - System.out.println("File does not exist or is not a valid JSON file."); - return; - } - - try (FileReader reader = new FileReader(bddFile)) { - Map bddData = gson.fromJson(reader, Map.class); - - // Verify the password - System.out.print("Enter the password for the BDD: "); + System.out.println("Enter the name of the database:"); + String dbName = scanner.nextLine(); + System.out.println("Enter the password:"); String inputPassword = scanner.nextLine(); - String hashedInputPassword = sha256.calculateHash(inputPassword); - if (!hashedInputPassword.equals(bddData.get("password"))) { - System.out.println("Incorrect password!"); - return; + if (dbManager.verifyDatabase(dbName, inputPassword)) { + System.out.println("Successfully connected to the database: " + dbName); + SiteManager siteManager = new SiteManager(new File(dbName + ".json")); + siteManager.manageSites(scanner); + } else { + System.out.println("Incorrect database name or password."); } - - System.out.println("\nConnected to BDD: " + bddData.get("name")); - - // Display the secondary menu - while (true) { - System.out.println("\nChoose an option:"); - System.out.println("1. Encrypt a password"); - System.out.println("2. Decrypt a password"); - System.out.println("0. Exit"); - int choice = scanner.nextInt(); - scanner.nextLine(); // Consume newline - - if (choice == 0) { - System.out.println("Exiting..."); - break; - } - - switch (choice) { - case 1: // Encrypt - System.out.println("Enter the password to encrypt:"); - String passwordToEncrypt = scanner.nextLine(); - - System.out.println("Choose an encryption algorithm:"); - System.out.println("1. Enigma"); - System.out.println("2. RC4"); - System.out.println("3. ROT(X)"); - System.out.println("4. Vigenère"); - int algoChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline - - String encryptedPassword = ""; - switch (algoChoice) { - case 1: - encryptedPassword = encryptEnigma(passwordToEncrypt); - break; - case 2: - encryptedPassword = encryptRC4(passwordToEncrypt); - break; - case 3: - System.out.println("Enter the value of X for ROT(X):"); - int x = scanner.nextInt(); - scanner.nextLine(); // Consume newline - encryptedPassword = encryptROT(passwordToEncrypt, x); - break; - case 4: - System.out.println("Enter the key for Vigenère:"); - String key = scanner.nextLine(); - encryptedPassword = encryptVigenere(passwordToEncrypt, key); - break; - default: - System.out.println("Invalid algorithm choice."); - continue; - } - - System.out.println("Encrypted password: " + encryptedPassword); - - // Save the encrypted password to the JSON file - bddData.put("encrypted_password", encryptedPassword); - try (FileWriter writer = new FileWriter(bddFile)) { - gson.toJson(bddData, writer); - System.out.println("Encrypted password saved to BDD."); - } catch (IOException e) { - System.out.println("Error saving to BDD file."); - } - break; - - case 2: // Decrypt - String encryptedMessage = bddData.get("encrypted_password"); - if (encryptedMessage == null) { - System.out.println("No encrypted password found in the BDD."); - break; - } - - System.out.println("Choose a decryption algorithm:"); - System.out.println("1. Enigma"); - System.out.println("2. RC4"); - System.out.println("3. ROT(X)"); - System.out.println("4. Vigenère"); - int decryptAlgoChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline - - String decryptedPassword = ""; - switch (decryptAlgoChoice) { - case 1: - decryptedPassword = decryptEnigma(encryptedMessage); - break; - case 2: - decryptedPassword = decryptRC4(encryptedMessage); - break; - case 3: - System.out.println("Enter the value of X for ROT(X):"); - int x = scanner.nextInt(); - scanner.nextLine(); // Consume newline - decryptedPassword = decryptROT(encryptedMessage, x); - break; - case 4: - System.out.println("Enter the key for Vigenère:"); - String key = scanner.nextLine(); - decryptedPassword = decryptVigenere(encryptedMessage, key); - break; - default: - System.out.println("Invalid algorithm choice."); - continue; - } - - System.out.println("Decrypted password: " + decryptedPassword); - break; - - default: - System.out.println("Invalid choice."); - } - } - } catch (IOException e) { - System.out.println("An error occurred while accessing the BDD file."); - e.printStackTrace(); + } else if (dbChoice == 2) { + System.out.println("Enter the name of the new database:"); + String dbName = scanner.nextLine(); + System.out.println("Choose a password option:"); + System.out.println("1. Enter a custom password"); + System.out.println("2. Generate a random password"); + int passwordChoice = scanner.nextInt(); + scanner.nextLine(); + + String password = passwordChoice == 1 + ? scanner.nextLine() + : PasswordUtils.generateRandomPassword(12); + + System.out.println("Generated password: " + password); + dbManager.createDatabase(dbName, password); + SiteManager siteManager = new SiteManager(new File(dbName + ".json")); + siteManager.manageSites(scanner); + } else { + System.out.println("Invalid choice."); } } - - // Encryption algorithms (simplified implementations) - public static String encryptEnigma(String password) { - return "Enigma Encryption: " + password; // Replace with actual implementation - } - - public static String encryptRC4(String password) { - return "RC4 Encryption: " + password; // Replace with actual implementation - } - - public static String encryptROT(String password, int x) { - return ROTX.encryptROT(password, x); // Replace with actual implementation - } - - public static String encryptVigenere(String password, String key) { - return VigenereAlgo.encrypt(password, key); // Replace with actual implementation - } - - // Decryption algorithms (simplified implementations) - public static String decryptEnigma(String encryptedMessage) { - return "Enigma Decryption: " + encryptedMessage; // Replace with actual implementation - } - - public static String decryptRC4(String encryptedMessage) { - return "RC4 Decryption: " + encryptedMessage; // Replace with actual implementation - } - - public static String decryptROT(String input, int x) { - return ROTX.decryptROT(input, x); // Replace with actual implementation - } - - public static String decryptVigenere(String encryptedMessage, String key) { - return VigenereAlgo.decrypt(encryptedMessage, key); // Replace with actual implementation - } } diff --git a/src/Classes/PasswordUtils.java b/src/Classes/PasswordUtils.java new file mode 100644 index 0000000..d410d1c --- /dev/null +++ b/src/Classes/PasswordUtils.java @@ -0,0 +1,18 @@ +package Classes; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Random; + +public class PasswordUtils { + + public static String generateRandomPassword(int length) { + String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"; + Random random = new Random(); + StringBuilder password = new StringBuilder(); + for (int i = 0; i < length; i++) { + password.append(chars.charAt(random.nextInt(chars.length()))); + } + return password.toString(); + } +} diff --git a/src/Classes/SiteManager.java b/src/Classes/SiteManager.java new file mode 100644 index 0000000..a5e8bcc --- /dev/null +++ b/src/Classes/SiteManager.java @@ -0,0 +1,118 @@ +package Classes; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.*; + +public class SiteManager { + private final File dbFile; + private final List> sites; + + public SiteManager(File dbFile) { + this.dbFile = dbFile; + this.sites = loadSites(); + } + + public void manageSites(Scanner scanner) { + while (true) { + System.out.println("Choose an action:"); + System.out.println("1. Add a site"); + System.out.println("2. Modify a site"); + System.out.println("3. Delete a site"); + System.out.println("4. Exit"); + int choice = scanner.nextInt(); + scanner.nextLine(); + + switch (choice) { + case 1 -> addSite(scanner); + case 2 -> modifySite(scanner); + case 3 -> deleteSite(scanner); + case 4 -> { return; } + default -> System.out.println("Invalid choice."); + } + } + } + + public void addSite(String siteName, String username, String password) { + Map site = Map.of("siteName", siteName, "username", username, "password", password); + sites.add(site); + saveSites(); + } + + public void addSite(Scanner scanner) { + System.out.println("Enter site name:"); + String siteName = scanner.nextLine(); + System.out.println("Enter username:"); + String username = scanner.nextLine(); + System.out.println("Enter password:"); + String password = scanner.nextLine(); + addSite(siteName, username, password); + } + + public void modifySite(String siteName, String newUsername, String newPassword) { + for (Map site : sites) { + if (site.get("siteName").equals(siteName)) { + if (newUsername != null && !newUsername.isEmpty()) { + site.put("username", newUsername); + } + if (newPassword != null && !newPassword.isEmpty()) { + site.put("password", newPassword); + } + System.out.println("Modified site: " + site); + saveSites(); + return; + } + } + System.out.println("Site not found for modification: " + siteName); + throw new IllegalArgumentException("Site not found: " + siteName); + } + + public void modifySite(Scanner scanner) { + System.out.println("Enter the site name to modify:"); + String siteName = scanner.nextLine(); + System.out.println("Enter the new username (leave empty to keep current):"); + String newUsername = scanner.nextLine(); + System.out.println("Enter the new password (leave empty to keep current):"); + String newPassword = scanner.nextLine(); + modifySite(siteName, newUsername, newPassword); + } + + + public void deleteSite(String siteName) { + sites.removeIf(site -> site.get("siteName").equals(siteName)); + saveSites(); + } + + public void deleteSite(Scanner scanner) { + System.out.println("Enter the site name to delete:"); + String siteName = scanner.nextLine(); + deleteSite(siteName); + } + + + public List> loadSites() { + if (!dbFile.exists()) return new ArrayList<>(); + try (FileReader reader = new FileReader(dbFile)) { + Gson gson = new Gson(); + Map data = gson.fromJson(reader, Map.class); + return (List>) data.get("sites"); + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public void saveSites() { + try (FileWriter writer = new FileWriter(dbFile)) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + Map data = Map.of("sites", sites); + gson.toJson(data, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java new file mode 100644 index 0000000..1593838 --- /dev/null +++ b/src/Tests/DatabasesManagerTest.java @@ -0,0 +1,58 @@ +package Tests; + +import Classes.DatabasesManager; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.Map; + +import static org.junit.Assert.*; + +public class DatabasesManagerTest { + private DatabasesManager dbManager; + private File testFile; + + @Before + public void setUp() { + testFile = new File("test_databases.json"); + dbManager = new DatabasesManager(testFile); + + if (testFile.exists()) { + testFile.delete(); + } + } + + @Test + public void testCreateAndVerifyDatabase() { + String dbName = "testDb"; + String password = "securePassword"; + + dbManager.createDatabase(dbName, password); + + assertTrue(dbManager.verifyDatabase(dbName, password)); + + assertFalse(dbManager.verifyDatabase(dbName, "wrongPassword")); + } + + @Test + public void testDuplicateDatabaseName() { + String dbName = "duplicateDb"; + String password = "password"; + + dbManager.createDatabase(dbName, password); + + try { + dbManager.createDatabase(dbName, password); + fail("Expected IllegalArgumentException for duplicate database name"); + } catch (IllegalArgumentException e) { + assertEquals("Database already exists.", e.getMessage()); + } + } + + @Test + public void testLoadEmptyDatabases() { + Map databases = dbManager.loadDatabases(); + assertTrue(databases.isEmpty()); + } +} diff --git a/src/Tests/PasswordUtilsTest.java b/src/Tests/PasswordUtilsTest.java new file mode 100644 index 0000000..0d59604 --- /dev/null +++ b/src/Tests/PasswordUtilsTest.java @@ -0,0 +1,20 @@ +package Tests; + +import Classes.PasswordUtils; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class PasswordUtilsTest { + + @Test + public void testGenerateRandomPassword() { + String password1 = PasswordUtils.generateRandomPassword(12); + String password2 = PasswordUtils.generateRandomPassword(12); + + assertNotEquals(password1, password2); + + assertEquals(12, password1.length()); + assertEquals(12, password2.length()); + } +} diff --git a/src/Tests/SiteManagerTest.java b/src/Tests/SiteManagerTest.java new file mode 100644 index 0000000..6cf7210 --- /dev/null +++ b/src/Tests/SiteManagerTest.java @@ -0,0 +1,61 @@ +package Tests; + +import Classes.SiteManager; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.*; + +public class SiteManagerTest { + private SiteManager siteManager; + private File testFile; + + @Before + public void setUp() { + testFile = new File("test_sites.json"); + siteManager = new SiteManager(testFile); + + if (testFile.exists()) { + testFile.delete(); + } + } + + @Test + public void testAddSite() { + siteManager.addSite("example.com", "user1", "password1"); + List> sites = siteManager.loadSites(); + + assertEquals(1, sites.size()); + assertEquals("example.com", sites.get(0).get("siteName")); + assertEquals("user1", sites.get(0).get("username")); + assertEquals("password1", sites.get(0).get("password")); + } + + @Test + public void testModifySite() { + siteManager.modifySite("example.com", "newUser", "newPassword"); + + List> sites = siteManager.loadSites(); + + System.out.println("Sites after modification: " + sites); + + assertEquals(1, sites.size()); + assertEquals("newUser", sites.get(0).get("username")); + assertEquals("newPassword", sites.get(0).get("password")); + } + + + @Test + public void testDeleteSite() { + siteManager.addSite("example.com", "user1", "password1"); + siteManager.deleteSite("example.com"); + + List> sites = siteManager.loadSites(); + + assertTrue(sites.isEmpty()); + } +} diff --git a/test_databases.json b/test_databases.json new file mode 100644 index 0000000..ab6298e --- /dev/null +++ b/test_databases.json @@ -0,0 +1,3 @@ +{ + "duplicateDb": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" +} \ No newline at end of file diff --git a/test_sites.json b/test_sites.json new file mode 100644 index 0000000..0f07589 --- /dev/null +++ b/test_sites.json @@ -0,0 +1,3 @@ +{ + "sites": [] +} \ No newline at end of file From fd6d7cfa3dc69cec5adebf0fb5bea2ce8f43fd59 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 00:51:45 +0100 Subject: [PATCH 46/77] chore : added the libs for video stegano --- .idea/libraries/bytedeco_javacv_platform.xml | 284 +++++++++++++++++++ ByteWarden.iml | 1 + 2 files changed, 285 insertions(+) create mode 100644 .idea/libraries/bytedeco_javacv_platform.xml diff --git a/.idea/libraries/bytedeco_javacv_platform.xml b/.idea/libraries/bytedeco_javacv_platform.xml new file mode 100644 index 0000000..53085a2 --- /dev/null +++ b/.idea/libraries/bytedeco_javacv_platform.xml @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ByteWarden.iml b/ByteWarden.iml index c3dc060..578026c 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -17,5 +17,6 @@ + \ No newline at end of file From 784854764941b766e44c9a36540a4599380e5c10 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 00:52:53 +0100 Subject: [PATCH 47/77] feat : added the classes for steganography for the encoding and decoding of data inside texts or images --- src/Classes/Steganography/Image.java | 134 +++++++++++++++++++ src/Classes/Steganography/Steganography.java | 25 ++++ src/Classes/Steganography/Text.java | 76 +++++++++++ 3 files changed, 235 insertions(+) create mode 100644 src/Classes/Steganography/Image.java create mode 100644 src/Classes/Steganography/Steganography.java create mode 100644 src/Classes/Steganography/Text.java diff --git a/src/Classes/Steganography/Image.java b/src/Classes/Steganography/Image.java new file mode 100644 index 0000000..77f0f1c --- /dev/null +++ b/src/Classes/Steganography/Image.java @@ -0,0 +1,134 @@ +package Classes.Steganography; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; + +public class Image extends Steganography { + private BufferedImage image; + private String imagePath; + + public Image(String imagePath) { + this.imagePath = imagePath; + try { + this.image = ImageIO.read(new File(imagePath)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void encode(String message) { + if (image == null || message == null) { + throw new IllegalArgumentException("Image or message is null"); + } + + // Add message length at the beginning + message = message.length() + ":" + message; + + // Convert message to binary + byte[] messageBytes = message.getBytes(); + int messageLength = messageBytes.length; + + // Check if image can hold the message + if (messageLength * 8 > image.getWidth() * image.getHeight()) { + throw new IllegalArgumentException("Message too large for this image"); + } + + int messageIndex = 0; + int bitIndex = 0; + + // Iterate through image pixels + for (int y = 0; y < image.getHeight() && messageIndex < messageLength; y++) { + for (int x = 0; x < image.getWidth() && messageIndex < messageLength; x++) { + int pixel = image.getRGB(x, y); + + if (bitIndex == 8) { + messageIndex++; + bitIndex = 0; + } + + if (messageIndex < messageLength) { + // Get current byte from message + byte currentByte = messageBytes[messageIndex]; + + // Get current bit from byte + int messageBit = (currentByte >> (7 - bitIndex)) & 1; + + // Modify blue channel + int blue = pixel & 0xff; + blue = (blue & 0xfe) | messageBit; + + // Update pixel + pixel = (pixel & 0xffffff00) | blue; + image.setRGB(x, y, pixel); + + bitIndex++; + } + } + } + + // Save encoded image + try { + String outputPath = imagePath.substring(0, imagePath.lastIndexOf('.')) + "_encoded.png"; + ImageIO.write(image, "png", new File(outputPath)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String decode() { + if (image == null) { + throw new IllegalArgumentException("No image loaded"); + } + + StringBuilder binary = new StringBuilder(); + StringBuilder message = new StringBuilder(); + int count = 0; + + // First, extract the message length + StringBuilder lengthStr = new StringBuilder(); + boolean foundDelimiter = false; + + outer: + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + int pixel = image.getRGB(x, y); + int blue = pixel & 0xff; + binary.append(blue & 1); + + if (binary.length() == 8) { + int ascii = Integer.parseInt(binary.toString(), 2); + char character = (char) ascii; + binary.setLength(0); + + if (!foundDelimiter) { + if (character == ':') { + foundDelimiter = true; + count = Integer.parseInt(lengthStr.toString()); + } else { + lengthStr.append(character); + } + } else { + message.append(character); + if (message.length() == count) { + break outer; + } + } + } + } + } + + return message.toString(); + } + + public BufferedImage getImage() { + return image; + } + + public void setImage(BufferedImage image) { + this.image = image; + } +} \ No newline at end of file diff --git a/src/Classes/Steganography/Steganography.java b/src/Classes/Steganography/Steganography.java new file mode 100644 index 0000000..69b89ba --- /dev/null +++ b/src/Classes/Steganography/Steganography.java @@ -0,0 +1,25 @@ +package Classes.Steganography; + +import java.io.IOException; + +public class Steganography { + protected String content; + + public void encode(String message) throws IOException { + } + + public String decode() throws IOException { + return null; + } + + public String getContent() { + return this.content; + } + + public void setContent(String content) { + if (content == null) { + throw new IllegalArgumentException("Content cannot be null"); + } + this.content = content; + } +} \ No newline at end of file diff --git a/src/Classes/Steganography/Text.java b/src/Classes/Steganography/Text.java new file mode 100644 index 0000000..6776d8f --- /dev/null +++ b/src/Classes/Steganography/Text.java @@ -0,0 +1,76 @@ +package Classes.Steganography; + +public class Text extends Steganography { + private String stegoText; + + @Override + public void encode(String message) { + // Check if the message is null or empty + if (message == null || message.isEmpty()) { + throw new IllegalArgumentException("Message cannot be empty"); + } + + StringBuilder binary = new StringBuilder(); + // Convert each character of the message to its binary representation + for (char c : message.toCharArray()) { + String binaryChar = String.format("%8s", Integer.toBinaryString(c)) + .replace(' ', '0'); // Ensure each binary string is 8 bits long + binary.append(binaryChar); + } + + StringBuilder result = new StringBuilder(); + // Split the content into words + String[] words = this.getContent().split("\\s+"); + int binaryIndex = 0; + + // Embed the binary message into the text by adding extra spaces + for (int i = 0; i < words.length - 1 && binaryIndex < binary.length(); i++) { + result.append(words[i]); + result.append(binary.charAt(binaryIndex) == '1' ? " " : " "); // Add double space for '1' and single space for '0' + binaryIndex++; + } + + // Append the remaining words + for (int i = binaryIndex; i < words.length; i++) { + result.append(words[i]); + if (i < words.length - 1) result.append(" "); + } + + // Store the steganographed text + this.stegoText = result.toString(); + } + + @Override + public String decode() { + // Check if there is any steganographed text + if (this.stegoText == null) { + throw new IllegalStateException("No steganographed text found"); + } + + StringBuilder binary = new StringBuilder(); + // Split the steganographed text by non-space characters + String[] words = this.stegoText.split("\\S+"); + + // Convert spaces back to binary representation + for (String space : words) { + if (!space.isEmpty()) { + binary.append(space.length() > 1 ? "1" : "0"); // Double space is '1', single space is '0' + } + } + + StringBuilder message = new StringBuilder(); + // Convert binary string back to characters + for (int i = 0; i < binary.length() - 7; i += 8) { + String byteStr = binary.substring(i, i + 8); + int charCode = Integer.parseInt(byteStr, 2); + message.append((char) charCode); + } + + return message.toString(); + } + + @Override + public String getContent() { + return super.getContent(); + } +} From 5c159dede5e7425472485b0c215bf316fd67d8b1 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 00:53:06 +0100 Subject: [PATCH 48/77] test : added unit tests for image and text steganography encoding and decoding --- src/Tests/SteganographyImageTest.java | 42 ++++++++++++++++++++++++ src/Tests/SteganographyTextTest.java | 45 ++++++++++++++++++++++++++ src/Tests/assets/image.png | Bin 0 -> 277107 bytes src/Tests/assets/image_encoded.png | Bin 0 -> 436569 bytes src/Tests/assets/world_smallest.png | Bin 0 -> 67 bytes 5 files changed, 87 insertions(+) create mode 100644 src/Tests/SteganographyImageTest.java create mode 100644 src/Tests/SteganographyTextTest.java create mode 100644 src/Tests/assets/image.png create mode 100644 src/Tests/assets/image_encoded.png create mode 100644 src/Tests/assets/world_smallest.png diff --git a/src/Tests/SteganographyImageTest.java b/src/Tests/SteganographyImageTest.java new file mode 100644 index 0000000..a8a7c0f --- /dev/null +++ b/src/Tests/SteganographyImageTest.java @@ -0,0 +1,42 @@ +package Tests; + +import Classes.Steganography.Image; +import org.junit.Test; + +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + +public class SteganographyImageTest { + + private static final String IMAGE_PATH = "src/Tests/assets/image.png"; + private static final String IMAGE_PATH_SMALLEST_PNG = "src/Tests/assets/world_smallest.png"; + + @Test + public void testEncodeDecode() throws IOException { + Image image = new Image(IMAGE_PATH); + String message = "Hello"; + image.encode(message); + String decodedMessage = image.decode(); + assertEquals(message, decodedMessage); + } + + @Test + public void testEncodeMessageTooLarge() { + Image image = new Image(IMAGE_PATH_SMALLEST_PNG); + String largeMessage = "This message is too large for the image to hold."; + Exception exception = assertThrows(IllegalArgumentException.class, () -> { + image.encode(largeMessage); + }); + + assertEquals("Message too large for this image", exception.getMessage()); + } + + @Test + public void testDecodeWithoutImage() { + Image image = new Image(null); + Exception exception = assertThrows(NullPointerException.class, image::decode); + assertEquals("No image loaded", exception.getMessage()); + } +} diff --git a/src/Tests/SteganographyTextTest.java b/src/Tests/SteganographyTextTest.java new file mode 100644 index 0000000..7832437 --- /dev/null +++ b/src/Tests/SteganographyTextTest.java @@ -0,0 +1,45 @@ +package Tests; + +import Classes.Steganography.Text; +import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + + +public class SteganographyTextTest { + + @Test + public void testEncodeDecode() { + Text text = new Text(); + text.setContent("This is a simple test content for steganography."); + + String message = "Hello"; + text.encode(message); + String decodedMessage = text.decode(); + + assertEquals(message, decodedMessage); + } + + @Test + public void testEncodeEmptyMessage() { + Text text = new Text(); + text.setContent("This is a simple test content for steganography."); + + Exception exception = assertThrows(IllegalArgumentException.class, () -> { + text.encode(""); + }); + + assertEquals("Message cannot be empty", exception.getMessage()); + } + + @Test + public void testDecodeWithoutEncoding() { + Text text = new Text(); + + Exception exception = assertThrows(IllegalStateException.class, () -> { + text.decode(); + }); + + assertEquals("No steganographed text found", exception.getMessage()); + } +} diff --git a/src/Tests/assets/image.png b/src/Tests/assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f93549d45a28d9bd3a1c5a7b2c485788a3bd6e52 GIT binary patch literal 277107 zcmZ^KcQjnlxA5phCpsZ|@4b`Jdl@Z6CrU&Y(R=U0j2fNMBBG8KT?`_6nCL^4LG=Fl zec!jP9t{B8Jdwh80RTTi0ASAs0FVX)092j@od&W`53udD)PR7;|G?+& zs;nmp+Iw$ZW3;K#fV`(0HeVGpUk6)XM`?R+$EOY;EGR6>CnU@#Bxx)xA}uN;EiA+% zC@3u`XxPeR{XZDqy?1bN3jE(0SoXo2PYj&@^#xy-caA>3w(mUucOKt|j{i*B!qH5_ zNk<33{e7{gMC1JbW1iLto&3MYKaKs*rT)~O zxc^_zXm~05v}6Dcppx;2-|+jucK6pNRPhhP)IJRqq%bMOM3BgPe=tL)xhU6jRvq?W zUyEnB71dZ5W;r0&kfWeb&~`KM8L5F1tx7c6mu!_KofWuRR%g%E#$Wz_u8zzbN+F((iGCLeE4-b#sT_YV2SQMi!tfdD` z5EYT0ALK6w>UzL=qZdWOF(oQV^$oo;qcHXX#ipyENPxhcCYKXYU*8^*f6pTvQuDnptAiZ&9Zulj0A2%mZpc3w}1}?%c1qHa`fp%T(0G9)7-@4A}hht=*J^ zEHe2^BGeNa-a#{GF)@aiYoFhPL#02J{zlN_`;b(eZ5y24OcI@ zymaAki%PGrUZqJ0Nt7yxP0LBuHJpvp%aQYh6>MfaNN%)|s#NFTli9h_7q)=IR+U zA+=4UD{CkytMJaS*vRbBae)(qr2YPUjXN&GmuH|+AS~kJ&4QeDGys9nF-RthEQ8WJq*MHOE2>@VE#@?q zbPDU+L10o}s9->uE0JfN&m5u_6rhq%0rU!W2>-r*FnC(6*kz(-a4ufaZBh(P9dfIG zN7!oTbzQsXZfP{1nS6E+yde2QYe`yYmy1!~YXZH2W_9(D?{eC)vTrv8 za^$*HI0T#Wga+0G{n0Z-d?d3EJkh1#qb^NIqMsoqtOQbd30-$|J_K}c4hk>`0=&Wj zPKq=KyqFvTNNR}*Ri>iQt?`RURZ!_$yP>ZRMdt|02Bfphq> zI}V`Sl^sanf4Qw5|F%OW$;;V^Xk_VkDAm5OfYY(F*wwqKsjFnt-Q&+W=dql1zc3^) zM84~|n6KEe1xT(q1#J^aaPkn~VS`D8q|8^|)l!Bs*5EadZ0w*8958X|fx5br$J8W5 z%$eexYq-UK2;Uu;rtRb5Xi?kcQ_wb=Ypl) zdPT`ZAQBd(Vp;5THawX}@sh!RW^=-?KP1>pkp2Arabjx=1^Es{Cs})DPs~FcQ2)je zx>-JGWT4%m?Z}vlpFy61yQ7<_saX?cgz^T}{HRj~0 z&aQT@4zh1x8ITxA0{mU4Bd_0l9p%ZvoSKz=Oi!bktx*7AclO?JJ$BV(Zz$_WXmLsZ zmE056smO6UogFn_WAdXO?ek>zZ+|Id{sI01Dbt{1#$qDjlUE=30pGz1h0cL7J4R0l z^B1BqZv5 ztE=l_yjlKJInKS1Eo`5;Lbu5o{@Q$*d+>G9i(8f<%9?ZJRw2 z7r+O0CIRrn5nGnGR&vewYMP{xV)k9~zzAIDkH1kV$#)^w5J{`3O_X=v(=M5S`{mjQ z0I>D`+&x9)l&_PP$y}$9OhPFdTDX>^^!{7I+UXsrwvWqd$D=9O2zGQ~ENYJo_X31i4>QH4VGON=r6;p*1q+_Jny_1;1?g!z%+UaBqJbpg@esU0Y;C07)}#%3 z#3wLhXjYCiDah#`?!X%6S1_3akpws|4-0AQ@q8Gc$*;PMTh%WL)S{u2qVt+l)19!1 zi7cE&S(Mp>9W;TkjDR-$CShW>^N?W6z**5CVs=Yahhtq1Wr?7}aGtGW) z6hYz2;G`G*_B%^@@0_3gBkp(WP3CxeePp*meCKPKAe%RlwEl6?gqjIP3LZ$z@>*F1e7#_Pkr5XGJ;b zM&xGs4D>Jd`{B{4nCKKTZH246HJRmTE|oXVPlUEuyT7FgB-2cQu@a;)iUqKkfLg|z zDK`e$2@>8ecY_z~pimD~gQqZu8oR^BU}ktK0#O@eaFFy)O^(r5Vy?udT3)v$50q5P z0UwPXEQsmMZYB|#;$f?KZO{lET3I>#@vIYk?z9nDgc;EJ3ZMV zjg@nj2s<`*G9pe2g34#w$co>(^~O9zBy?UjUzG_?bFzgSQnRGUMH$agZ0v%` zW(aDRrK{j(Y!;3vyg??9(UK^;E?3Dh?0|F=KW|nR)2Xbbo?rUo9^7S19^6LLP!k4Q zI5?ZMBxCrQ;PzR4WzZZ{-QLB*cI^bss>>_U?V@anz>pRR&HdQi_|_ zg{a`#9*>WxqjBk6Q6ks`=OjD%6Cb|A$fZ8;bWW`pfN+!Yl75%mKzAx~R)1|Ed7K_q z{0v|pSm|tqNAwT7S&aDA=9b|54EP-t2gkx<^D8_LQhO=7egg56QP;W_&8)xv zb<0ht%1%V?q1kZh+zOmJJBG}txMJTsmyH8kf8Tg+#BjvW7=hdtZSutn;n0ZZ>R=%& zH<~M@_6%QPLS;yzmg;FmJ!!>12r)9)^X&{x z#(4{UI=%mr?<n@vt$UY+JhtGSdWog+O9 z^=J^Mv(_tmc*sJBy52VjE-++~rhqeb)@9O2{|eiG`f ziC_t88OsAR*@Ktjhw`_SZ$9`8G1n0^zsPD;60+SD=#^BHG(~=34gDR5FcOngdK+sW z;j}9yEHpS6v4BS^1rx%DMB)xk@}+t{^IV>=0L&uatj!SnY~@<6mc%V7zqkZUxoa5r zbtt*Q;8D#7s9EV&Tz6?sNf!Mmy0kF5+B zL(n{kkb#q~a!8Kf>bcdVxuOX>!?-atrDfhuWaWKfc{Xdp&LFc?aA(b~nOjYZqd$Xr zwVwBEeFMWgU6a4_e^uAYZmxS)rzIXZbQ7AO01NN(gp7!S@}ps$)k62m zvh$B~ms}Mtd7AYD`mLMKA9C~P7yx!#?$Jn3z5{mNNi9v6iQvwS%{LzJQX3f0s~8yB z$dv3--Hi+mV!eajw+U1R!M^hO$$T=X&nvb43GQYV4CJU8|F(B}@-bxd28A3$N~zud zN1xg*dbBOO&_anowXS{=@2-kSgn-e) zJFGo>unF#Wm*;nHe=~gYTP3ZVcab=lx`Z_&LV5kFMvQ`m@PVwzYuT#jd^FVG zm>o3C-)6b6{qnOS^D3*!u?5EpAI3FB_Ol9ckZN$T<;cJMxnuCodhfIJa~>r#Vdl~m z`J6QI&9Tnj!0dQwU7`=uAH`Dx+Llkfx~Mg|T(b;ckteHoZ@7iXkNrhX@68)Lj!y5D z>(RyIN@8 z0>AKJvfGscc@v_+#48Mi>qmge_;uZGbrO1B*=;}@z~{Xp2bylmFh-wF`-vy52kO$u znkXem#M3J+uMHK8Ws!opfrfnXN5nni6;VzKjn8}BQ8ZQW4#{usmfFTnIPhp$VFjFy zX+b%WJW`&efs;z-DJFq6_*|P*Bz9i`c%$yO-P(atl%3Bn#o4vrxNJ&%%mKFT{Tg($ zA|Se2M9-zW)YIs9+-+EYB0YWc7y zd#o$Zv=6UEm7f%_h#wWr{?hmU%kQ1T&&y3j_K3Qmm&p~D2dz}F!|p?W>pEjPP_2+i zke}0N7pVk#gDWHjHUxg20q^2Ahd70tfIe66OR< z|Dkq)z5pf#CT4$TXbXDve4Q)+nZ0O|0MoXr8m#jKF;q$G%#?#D#CHTC9s8YSmVRto zA$A(dJTEbo2bIulC~=zvDS;lX3WAB*Ei!?2K=}gPIrLk0qGym-)hF~_LM$~xEY3Z7 zw-xWc4H*>9ppvjueX{7@c;Q*VWea$E9x1wtkaAZgRRsj!NN^JrqX+3>_(hfl2{4YR z#1HmMG(uU|1gMcA3vJbM9ScEE7ZYS{I8DsQN{BT;Mr7uCYl2ry6n~KPoXPt!;$g(Q zABZ;IXAq^b)(?P*=v$T8*fASkem@MRFYcmV^>M!JsS@~E+=CP={$ff1ayu!}hOpuJ zF-zGtFWrqkp7j3p$7IS3T{yaqY(9M_RtyChdB^K(a^d?y!v1lD{VO~Qij)lbvl9}! zwwBRJo>4ILt>EmwbN|onWI)&7+{eR-tkCW~)SqQkqFl&Pmom!ZP^^RRa@BRo- zQ*0UsY*r7W_?c~S!6#b1XIk%rHw6an{ThQ1_GxmJ(28seo`QihhZ4V$h8g1fpTvys zQ(fz)0w?W@Zy=0eO?2$FbDur-MhkocrJ{ZtoedUOg^V`wJZu zepw~#&`KchXuJ)b+ivUnt8)~5+F1A1v1ImKzu>THc?Wj6Di?-ue$bt=;^S1QpGDR< zYAP?x?;pLlcHJ9Buyi(%!Ln6UVWbI%3zA#A1d4{8ptCOM9Z(r(U% zJcV+S#(MYO2X8wEUpOo5OsnbXH8!S-1IwX1&dV-~2w1?*a?d$q@XW$vVMt3-Q_+ia z*oM^DM+DvOU)Zw2;ikfgU%s2fQA&#>R5#+%sj{FszM#1HaWw5NKE7-3Q)BS;xb=&N z5A|ZdTBVX8^$TuMkA1{JMgRQZs?~CW#@QNvtNk;-`)ywH;EQS;BSE9r z$BL%f%oF1=Fgx}e(Z#8qiuOP^+mgbb6M+ys(u8ypHL++*_H;Ui5yd?ucFaQLy(9%l zkfzImg#eR__ZMwv9f$U8d_UTS^-Z#@50w{1j@JUGoyA+(6XlIp$lOM>4?0d{tg`4n zWU9<||A0&v@x7z)5>jh&g2}x_qU}ll#|Dn0?)z@N?%SGX#;euPGe^d28AZEEUHw-c z5P~Qk{QJAd%N_aimPVG+h2DpA##66Hp?HiQ%N%~y^y-71$MeVgyoKP6;v1u|8@k?; zBb@Wly1XnP#DMuNjgh8f&_gCwuZ>PlGfBWv(4NPe#?Y(BtLe1B^AWEFJry>5&p_7M z(OY2n{8u@J+ndJgy~dmUu+!?DnVC&nYRRYFceo(Fpo=Ed{t8t_p&)8!(V#%1|1iaP zv-3EmaIGePFnprrQP6dTJW0`B&`XVze#g^&c(IgU+948nnCG2~lE0n}J4?)!_b(_4I6Zsom+jLNa&*w$c2rQ?eT_JZsRKk-Y3b4hC0W<^ zY$5;RH!}2|P0#EU)mdNdo|p0VJD9wtEaOZb4K^-N`g4AUsA`3A9K9=+W%PI-ClhoV z+j|-CaLjmZzn^6fs7z$~g<%VXzXXu)eF?iydq`5a8G3}|+Ri+=q5Bg~B04krX9-mv z3V}^3d*KfFa_Mybzf*I~fkhuS66hA*_aS&))ou289rg-F39L^jtWSol?}h||mbCgI zudy3sqS1KtdXBoE2;;_L0r&o};<`SDS=CM&aEH{|%md>CqVYDb_eMc>=WLfPO+jMe zL}e;Om*GM!gla7@-oe&Z)6+jH2-IRT(GCj&rFABbu6C#i7el3HE!;&w{v~N@C?(3NqAzCAV>WLIDI54@`iEnwTFiE1$b+=h`811Wb?Zyxs<>u_emEo z!Ctw+D2^#d49^NZvRoG%8{f-rEIa6joMGB5%vX0w614NICbs=`#>#4{AB=I5-+yP> z3WPK2jx?OeNdRkLu9b?_LRAzlpSWs zfrMo00scZ(#=S7UC;f$3J(nuJbvp`OJ-S*<+gX9JIIr6@f6I*gT=&ggRrh*0h0gln zQ`jNj``fuJx`pD-pjLtN8rbqg%gn1X2G$`k!&GccOfI^_z?NkNtULdLf?|=dEVA{s zgcBjPN;HSR^{1!n2<3U$G!iE)^7#814xZ`Icg1?s(5-F8hr}e?u7IZAkf!c72LD?Z zTAd`98Vh%Ntpz{U!0MZ`>!I7Dg8SdMPaEPOSpPBO@zgqW>hiH!t@sf=fLRxy#?2i6 z9>^5S`sa|Htl&@kgWBU(?%glC)nMPl;cH2&VchKB^`MPJj{k&@62;lRdDw4N+p-& zS(J?p;0~?VJSIPG`TRNg!=dnyrEu7_czaaTdsze9$@U$SMKi+{iwnPhaztAH=>?rWt9_GX4&o!ig22y@ZAT)# zc(j$3=)oxzDt@&k84nXB9)1t?u5VaysEfp4Dy4}w&ztj+*W`*xQXN9SUyVYT6qz-F z=(tADy#))_BRLBNBQy3Z0vvs$-%3rtl8oUuja5y~51G4_kYA&a%a?-?Uamh7uUZ$~ z@6G>dQVfzbQBIdkXr{(jFHlLC9kYCNf;SovY8Y2z#yqqi?ply2o z$%MG`;nGp;x10_3_N811PDgK0Q@2m3knwgyADp{P2&1TELfjHA9jA04dN1Naj`BdDP~|8n%L(PYsG?msdNeCog8S6gEH#C(Q~2R>aIc& zbwwmDiHW|&`-dgs`{S_lokzDVP=)V~yMzhd93kFRwQAQl3b>QtsiEeNrHQpkX6*vQ z#3y$cQt6UcDRBE$Kn70!2CZUl#&samRSbEC^SBm9nZ>q4kIzk7*Z+J|Kfsx486gNN z92Rbz=|bHI>oz1wEezGgP5T7I_4kwT1oH481w#ZQ`Q*LJ&#-)^HNZsg#kWX6#Q2KH zxT_s{hM;=CPfI+$v{haO zj!dNvxFWL7u2^4$bsEI>Y-r5b);UFlDD-nM*LHUucunBRTZ|zK0TEdc*Lu%(sG!#- z=7j8Tn-0YVE2j-XQGkbK?=@oew$P&9gr2b&82p1N7B3n3+Gln1xPd{|Mp3i&&|lP! zqq1Pwg1byuc0B76b*NRssxp1KPuV|Qs8oCR-gKB&CAk@(n7JeW&{eZ&7A*0}3!0S& zF_`tGt+^4^F`Cmjl+*ju(?-{t6?&v_`;hjqnAQwQrr2?`peE^S5oRJ_Z$~2lQKhPM z)TNoMKFz0@Zsgt=dhG!w;O9cyZ5I5jf(3A=z2wvP;rM)H$hYlDIcP7hqy7UL>idn~ z{zKAkr$=j#rv3#kuUKYW|F6ryHW+w#;~6u!^&pxuiiIQgX))dw{P0)M+>6cQWBGo zFP2r>fdL!3e&$`;m~n24ByHTvm2A#`I|sLpf{udPsGLR9-pnX(z1TM33T&CWI-3%X z%L=|y>w5N*bR)%->K7V(_x4QSal6-7&2PN6Cwrrz7Sy(EU7aIU^fq6-*rWs0eq%R* zX8*G!B<*@siOnUQV8X29TViFaVm zORQf&i0W7^OvNG6tFL{v&0>Yos=x0r1vIuKH&vronnV(KHZ5;A2n@Fsop$ZWUfg+c z!_CWmM2eb;JhbWr0JYK)(D@F{a5QAYWAfCE705O`Kf7u8wo(LRKO)T^tHVIlnT7?; zP*aNIo3iDyi$MvVzc|7Dv=gs1!4F>Ll`(f;bmw<$k@M}ZElM+&XIp+xkENh%Bg>Y| zzM0I>22eM=q#2}wA^fSIxm)j@zPT%1y$@1Ym2%a!Nwv}UwW?~#WYPKuEwOPl8NhKi zo8xBo>^&J}346?ccnGB@Ajx!xnPxT=ZX7uu=ZLDRl>PiGRd6_oIscjgcLjj+WEPCJ8F~wTvQ8t%^ zxHzy|IJbf@6pFvtY>)iS-$v0z0b5PLFK^`5Hg z{SET{?}7qu!J0`~S$jK5ym?79DaUG8J_28#ce|n>GVGbhf3F_h+E61dd9$o1#!2N; zGP4bf%F1XYMKYBxr7ICw@E6>U27KIPTre+AKyN=?=Aalc- zZ574~I}$h{X8uGi1ZG10@Z0*fHn8Pc_TSyz`1lK|<>#&j%{utwp?@u{TXauLd#{dk zK*!#P3N{qhJ)d#f>lr=q`=W^7aG(ci6WXUiH^SdCZHa6k{v;%(2!?sRl?@sRE&gQf zS*kTPL^K)p#ui*H1s{|hVb@|(O@VzJ8dMm+X?2gNpQ4M|8#45ES?gPMCZE!EfAQwC zY1^I&2;>K)R5k_GLusm&xvS7kH0Nr-#_?o4Y%;ikuj_0~=6rsnWZ@rNW?{wCPL>h@bS8-( zZ%C1L&6M+ihw1QPDDhgrg9UC@mR5kICo~#-_(W$eNNNkwPE!JF3zJ9Sl>sa`k)U!*B zwa@bFUx=<1S$iT0xjQWz8_t63;8=knD#YIkZZG>KDr(#1xCUCTYsfuU>8c^EQDfd9 zWs(3A0cgbo=~hZdY75IeCuqr(MuP<&nn+!`$UOh?H@Meled4bMo4}Vu&dOit zv)Ib~cFIL~?%>KFv7vK1j*@b6MZ?|c68d10E|i^P_2!nQRN=cSfrrg7Z)%)4=ZsqR zvB<7n)Vh(gznNoX4f#($JVm~3$0vi|v}X?l6))q*R;;&@c~7h_>vAmpeB zaUElQ6=T7ZRcFEjigD}x@iI7&aj_QHPzv3Fc;v1x%$k}UccE1ddG^C@pV4mF{bYnr zQrAXu3TsH)R(EGgFy3+vUI5J0CrcEKCBgSvnIAlPdn6cqt+;%;LAh_q=BLmZa^9O< z86|YPL~NGb|I)pdYLpY08{_!%T zq?}*Fw05Xq_x3KG%*M^)U97;V*)IovSoxw+Ub|JxCjL!nB{DS`z zXZ<&E8^(GuK=2vcpje+9(1j#dFrTZn5UTeWG;q?8YKkWq5H#MFUxh8w-j&JkmEoEd zSQ2iWW>!!HKEhT{8v=S}jCIa`-P;-%+2U2*?w-vewD@$vl{JLTt!mr+82UyU4B=kT zmTa2_t7kfVQRKk%0^x8Az8(3m5hV;m^t{WrZhc0%uOd)W=oQ+g#MJV^@0nTupRc6$}@+7(gT? zsTKKP9D{oCuBWJtw^I6);4SlQy_*aEFb2y62)G`K8&fJ4o-HEu*ragH_6&S0I@hy5 zCz?6M^zD9PTMg|q@qnPtr})kW{4w&pZ2?yoi&YpRM*ZR8=<&hgT?band`wM=hrrDj zs;Ivr^7|rMe3$`m?d;N({8T%`&UN0iF8Cp5Hd(+IRu<>^hMK!Shn%11_HD?1y#Bc% zR<htpdD0h1?4nB|Gga3+s6J@E`y+~JJjx1O zI$OXN$;|Gb3g6mjthhV-9j3$ zrh;nkAVBH%8x#`w)HV!lNK#5?Sj3-aM9dB)Ft`uSk;L}AWf&KoH-sk!Va*zX46>jE zsCXGq;g_#-ey1lTvh>%Tsp`nZ{Tv0orM)i8D6? zPG6s3z^65dYz1RnFmGmT%v=jC6S56b#joGaiLf+!FZcmZhe77`kmfB#nA?WC|mH^L+%wAuW; z+cJ_wohzokfX^r7A?eMPtw6}wRL?qLd*rjPJR7>wczt14X%7ayb-$d_wpgjTB-Wm$ z&beh~j`W1Bm^`hdny$i?6x&e-%!xTivjbtn2=~3+5o}+s*|k{lv;a53#!MnWj6H z{C@}vrdn*kQtCLS-f1YKI+U!Sles;z8W zKiy2OSK4&s=Zqn@3ePY6Hj2)xk8ZNDSPK$nc>T#u@C}~P&?*3d>H1q+v45-$xQK$C zhD8!H_$0SV#(K_t`B$xHe{8gEk^EXCc}1pvb#M&Nj$t*(Eg#PWlNsf9=oLUJQu5j`x;JTEt#F9Ce=91E%9}YXdUq(d4;uDzwizPm6 zZjui=+$SWJ3h6JkcmWyQ{5<95LaTK1+Rdm+3}dUBlL)X4s@fu$QiGa8R*Y-_pw_2#0d;vVBTyr{(B&b?S7@>1&M7K$h)1Z>;j@jmo4AI)s;&_5{H z`)i%55OYK&FnE8S5I1bU?LLk1Br#Vw3rc7&B?G(CQ+UKT*%zC@GmkS|S%;FKf*zJ6 z?(!viw@vj@7e?IPoO^Gc{Z_b{e~%J*(cvd2vdwF52-jBU)}#=A9`u0!=8N`9Wv_{* zrbaoUGG>p-XI4PD@$Pu_O)bbz69RF>k)hQMlxZ5CZ%Pi;pOpfy%0n|$W%b>-W-GIjG-o8sY-pz(XFI6D5Yg9sxyw5 z0p~Do^tz;Tj+k1OfJur*wDivsN4)W4geSkycgipQeI+LTfRxB}O6sZ(I*5_yy*$!h zfl{aKBojF$TWcfK`&Z|^@Eqf96XR?CSrLhh;8UayDcZOBA;|r?CA2jVL(%T!W}We2 zUEy};!E$w{UB_w_2C_40DJwgl{(GMGu$#u;;!F1I3!wVBjyWLN{yOLJgt5SXcW553 zP;{OtaFac{8$$lC0N357bRM%z=j#$?XOu;VOEjx4;UJrv#DZ0Rd)0UK=|RiVc&=fk zEVg(zhvsNAYThD0mr~DH^okJ%l#m!n2m_EPa!OOOX{UpXvczPqWKX*&nE$d$EAWb4 z)zjKt_!fV%zKfIIm4vCu!_a5ZMgC{ZcytGMpA+`$(aAo63f)NdUGaVFS|c&2>hyP} z=#T3!l7Ce?>3S$BHD3{GA~P893zd1V46=k?Q-X@MoEfuKTZi+mQ&Q%LU4=y&)5Q63 z#7x~uRp>RD|DghU=@je5DvVt-vYqjc6=M_VwLgp{y~+Okcpr93m3e%9{l|&0qpIk` z*P|eH^2Zq1;8!rFBG=XY`}_H@yR;sLH`3f8{U^}Z9Knm5Q&K;I4;{KuGIory-{Y%F zvpS?e%{x77G2?uMn?1&&gmW7Z(v&mk$?#@8SW+|Z{C)*DUR&@UMl^F{4f@>J@N^MB5r8ObJi zAb6ETvcWFL&UbukKNSfJX~^E>4NHZ$(E zxGk*6HJl1BhlS*0`0NvqD6!s8^j=Fm9u(jDRJ_ftNa5G@q#*SP{>2gUE6Mt9qd@rE zq$5{$b9Q3E@!;*B<)<8beP`EX*W@q!Xt@q7;*`bj23-lWfPE%oX7rJ;heA zTao+5lJXQt&mj8ESl|;JH#3u!tgJG+#qzBry@SKF!(@r#KHr>ohtMm#?_e=cfWN@h zm%lnfdx=tye60t#|I9UCetWL=LcmZnLO|i)C<_4SKtHm--(qq03{2yM$;`es{C7GL z(&C%>{zbs8Ve1fsrQ7WG@SPXCIqD0YcdVc$&BrGBO{7=AyXKE~^DRW@8Cer8pb@78 z86A)RR6#WFtL1N!tL=klG~=B|cZh{}t!bt!Akhz@=6dbD9UTs`Ac6nw^z zvfamsa?sC@dK>=h6EW>5W(|Db?fL4j6%CA3Epf^WXd+4cuvfBel(X1;lTB?NZXDL@ z*pv4M&!WGd1$6IQ1stuwLN{pv8Fka)%^gG^CfwdUdGc~c5NqdHnWsE?*w0$V;)XPs z@9a)lstJvp50+!T=Vd1I_fqH(L?un54<6QYX32?x^wEN9KAb;;f}5B*HRB@iP{*IGervYv@b?!cntwYz zE|vr|ydwy@Zsro02XYDhqPOR78YV~n1av=<+h2dtzpjK`sF+Y}F@@yo z@BZMA-YXo^=I0V=Thng&bUcBmmh*GJuoe8dldT&eqZ#}7NchIutk)jp1mab$4oHP{ zBiUb!nEh^SZ0z~@N{g=R^sJ6|;^$EFKgv#9OlDp0FYK?)(v#pR354{mt_IafU1-&Fc4z>S=NY$KI1eH2I2*T&Z5q42r^wJ(|KIzgC)tk!KN&SmpMOY+a#`Qd@_X@u;;EPcs4ZDaQIV zZ()nIB8Pu$WmQj8MU!c5y!SwBfk(rEqt^F#Rn{AEJcdBwJu)HAo9=Kfwcf9)X%RR# z-$lBaEVhByI-8b~25wQ$PejP2M5&it(Z=Y!X78f%Al}RoJmfDE@0`2jB44b}TSY@$ z=6`Tx?%q8&TXytFDD~N8=JbzQqRAWpRMjqk`D+-#LzIo&V&3JnA*d@G&+sg;`5D3$ zq0WFDe*4b}wdLSRFBn|!2X*UDA*>+9A#f^E93;b!*8wFM<;Jvw4L@uE4H)5E4y8N4 zMm@FW6dhz=SphP{Y(M_{NHg@4tuF8p^HzTlDYf%dV`Ne9Nx~7Ml>B<`@?P)pOfPI@ zBxI#6c)TqbJ`zmu68}|ZlD=l952~|=>bki1sCY$oiGDkq+J0k0d~xwo>Z!2ntL}6G z(nrL}L`Ab;Z67Y7n^x=-a(dM=ckcJ5;@f2K{%&R846Q>4ziE;L$8fQlRgHy6NCiiZvRfVHSTvq(`XopT8(ze>XG%=k0W8nT*d#m zNI_q4HPD&R#e(lf!n*QyvJtMntNL@ zM5zRb#m+MO{oGgfUu!#NiOBt|uCW4GBphz%;^Lm`f2Tzwhf!jKQCe9hv!m9ee#}3s ziiB5H*N{zQ8l;@9OlYdI>$1ONxSkIj&Ti)sFH<2+x zG{Bmoul^$85Se%4zM6X+n+M#XN5wq9FX#+J(!cygj5Zr8=zCXFRTRHS{(O*VEuVQeP86 zCRS5V>6$etnQcND@n-j?Gwkf_YTE7o9E9@u?aQ#V1#Rp%Z~nD+epNqEL~zj0??d@b`hMErRAnOjQooB?mAhmIZp!_z;dDzt~@ zs8?F)*v2?u=7Q-0Dqmcn{?Nzn(42k7k=F2kK+)9A68qbdRmy*~OBJJ618wty(q~Tb zh0eOZcHTSfvePd-Qnh}bQ4obw#Y&zUh|I{?A>C7~=;AzYRu$44ifj}1q6 zsbOafk6BPZs~x~pAt%^t^G0I^jhM+vH@kX+D)eC|s8ajScU{waui}M5-$-pPr5I`_ z=8fD4VXq{wmBKalX6?oSH_2k#nVdb^G}`yhq#_*N?EXpqOV6*c)!zJCCyI#!Q?=xM zW!feYQnq~oXyULdHIZD{i!No2;h*NtSMlLHXb!|sz$L_Dmf>uFyIk_@h;8Y#N9T*N zUQ>8>w!NJU5tvSmc2S*KvuEoV=3D?#Q`m z^Ukll>ACD~bd@Wx*M<-JlSs)uTx}{``Y2p7JYLBlH-LgHezTV@-Kezr+Ib+>aZZW8g;){Pqf^j**7 zAF}nXS+UnBe86c^za*NiAGWPM&UrsBy>9tC)gE@^9MT$fX;0IlTd7O!W)6S=e2kSe zipE5HkG@20lT9go_c%p;#x;#@T|R8?!yda|%Tk2SZhZ?H3f!xj;*K1_MqSS)xMKjbQ{^$d< zgK{K!vNnu!F9x6Fd?|eT7t8Uh?Jt|Z_SW-zuk)MBw{s`<32+uDQ{ncgC)JvCgy^`8 z={>@CuHi3V83>;9t1a*-Dq4}0BUR2d%-&Va?$n<4jHXIvmo(=R>ToQ<^wqYSRNJ4M z{#a-zEiG-)xNz?}P@~ns;mKv88FD@TMp^KyH2$p3OWM4psfUB9;e8yidg+tA_{3V1 zM|D1XJ`~cul&=15(kmb~=^KN5QVs4-%;+t@N>2|S8bp8%-P3HYtgNio+Pp!OQCec$ z;UPTd{%8ALW!dTfA?Z9EseJ$cPZZ)!Mn>5g$qdSol=wJQ2HqM}JVzL^v{jYoIh^2e|_DsmyCAzo47qr;$ zNz}JmYB#&BW|xoVGy|K!bpxP%lf3LARwX*Mx3hzDc?>{(mgReE&>q&TVjch*sS|T{ zF%>WQDj{_6t1)IE(GcV^2c#CtNd@!7f43T3agBC5;#x}ORTZK9W2vS0+90ZY$3bZ? z(`Qp+f9qh@P*eL4s&~AUvQKBKyY813 z_|5~55S^zOqCT=?LVhK}LRd3^-|CHQ{_YF=h>m~byKeA`GS`v*T{n$NhrAW3()Wka zk|B{ha!aXOKl!uoJxXlIxrW*Miu1xSJ+P3lFgScxj^TmOz318Q%BOchj1k1S?xive z)dN761I8y?&>n3^ohI6GFJ`5`Ncsyo)00wp3!(M~Y4wJ_EPHT%+4^gtt*vbZH|==0 z6UN_Rtoh1oyTD_$6S|a;Z~tAF%D3P(x~3Q{1PT;`|J+kiF?m*1CX>bR49E8;H#sZz zKG&$nusCPB-2=ze*af{7p$G|a)>Y4wB&;4xC3OJ5KH+0B^eKPFFSWXg!se~w_SC(4 zQ(WhbKs%qTS90)50^daQNBuPilw@>Q( z6I$yYL!us)(8^fg_D?Xs*?!s2D*H9_G=nHtySejl1SCwIYlqack;3#v6H8qhk zGDurE$ijLM;ry9W?G?GaH?NxP2w&#g*P8|HjAN4=#tetCk~6=^5`INzuChLml-yq0 zCR!Qkgls42hZ$>^?d6lDs<0kC8xg>DQWRifGzA4wAlF*;Erc$Ylbs=oC))p(NvTM^=M)f?M5j=} zVaTd-CX-*dC^LrhKP1C?aKD$D!*6F8T+lR$T%Ml|NzmBMs`GiEg zMy9cnoS?p{E~m+yYC>gqT3rxAN9%_bjSKWu~XIl&zt1b9`b$j%V!- z$m|{73!1ba)OVfuQU7K_kfUYGLANAM$>-!stg^$wtWbobm zd`4_U_m}W##R^kNp{(G1xh$ezO&>4lki6h;uW`Ml895*l9aD2L&jM(4*y3-$B zen+lEiey0I7=>wSYMOGo{Kcpb+B>sj9e!e51FfISdn71D*ObenDm8;3&F`|YJWl@| z03HblgP}rCJ=zr4*bA*JznKLAm^OyZY;soJ76Zsx0=Tp=YsN$8Y7*NHAB3&)@DY6K*Qni7Hls0>3sNQ>Lj8TyE=$TN-ikV=Sgmti(kBV!W)T|@@d9nHwQYsf;B-pHodZb>jk&z ze2FsXy((axwBp4^x2DfC?lj&1Vhy4u=bi#r=DZZLl5;m4tcQh$&9&p$93E)fI;>T6 z9|rUICl#gYyV5vlI^*d++8n+fKe_}KXeI*VpDnV)p4c{qQYMjn zYBm)hG|z{P&k$w4BMWy6!)x{SU5&aU6$Q;3H|n6f!jKD3Y$4<_$zZitD%U0v;nv1g zt33^urg?7*cMrGbITc4=msH2UzepXE5LO>4r5X6~Fvh#!b4`{-j7x#5(IxarlY^iK zaE=G7yd}}KO8aZp0D$|==-+*&4ymt>)`gJW+bt-|J}CV!xZOnRmnld*Q6-MD57-2c z#yYG9)sKAa0OBlQJLOa8C4@25r};1f^WRDna~K}8!Yp9fED?ef)gH5$$g5NAz)qS( zWK+PM(|`_XnSTov1FX@1vpr<;@jUrm4W@Oov$O5q6(59lWE(@Rom5A2m7XTc9Q96k zTxUTDs1=bxW=?1PGv+z?yYt9nTC|It1-*nlxaJ%C&}+w`!o%#tpoit z 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

XXC)D+rBuXCJ zcW{}~Qio88a2i|ZJU^vnKO7&m)@gSnHd>7AL1uF0G|H=WjL}L$H+XJ!VsrLmjqlZt3$wh$<6l7Ko~i6E z$IR~C(%TmkH%ZkO2?JR@MUY!EV}HaaoI3ehqt9od1|3fjBtRLtwl;ji65l04=wno^^JvUp*T>2}>!7I={!DRuJdU=Jed=jdnzJa)Cj(GLA z0l{jX>2w+WeUqi5MgUEVBX zfO@L&%)WG3QxVr@H%r=XyAW(eI40#_x{|Y z8R4by12gE(WP2HzK!Z>hZm* zl`p7{_vS6eQa380L9TC;HofYkT8{%%Ox@f{#g;LD3!{F5XiXTBFRu^)T!j_ayyv&hw5Uz z@gy}%SH?H8q^c&ki6$vhr1HlteDa+||~hv$rSQTrh1GS3aW#|J%L{!=Tg>SMJLH4I>@U&mOU2@Qxi?=Eo~* za)+JBAl!_`+QW(-GsLQB^TNCA0`+uBXJUpSDuPr%_MB!BC7h%g>nu)!mD*C8fGr5y z@7GicEZ+l1K*wM_fEfWYU=c0zfvjy05wj}=y99e?4gD=dk}(r5*6O>0$3Q3B$tab= zW#nHxXDQcc7DLIa&mGf>_WGCJ?a9$Y�=lcMBO_20u*5=g;db*grq&C*^>SX=@aY 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�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�iPVnwV`54*UgJ3WiyE@}+n^CVnJYK12;X?@ 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 zඪ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 BN!kDa literal 0 HcmV?d00001 diff --git a/src/Tests/assets/image_encoded.png b/src/Tests/assets/image_encoded.png new file mode 100644 index 0000000000000000000000000000000000000000..a759e2f38f1fff461deabfcdbdf30156c53d2909 GIT binary patch literal 436569 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

7smp?v<)KharYz8iue1CxSt^Clj+>Gon}=|LA7 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ξ`2Ksz|3|jFbm=5 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 z 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 t+K`r#nnYGbNja1z8)U&XAd^)RLt#GUR~T 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
4;vezSj;Id&dJYDPfd+Y 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

WARNING: This implementation is currently not functional.

+ * + *

This class uses FFmpeg for video processing and Java2D for image manipulation. The message is encoded into the + * video frames by modifying the least significant bit of the pixel values.

+ * + *

Usage:

+ *
+ * {@code
+ * File inputFile = new File("path/to/input/video.mp4");
+ * File outputFile = new File("path/to/output/video.mp4");
+ * Video videoSteganography = new Video(inputFile, outputFile);
+ * 
+ * // Encode a message
+ * videoSteganography.encode("Your secret message");
+ * 
+ * // Decode the message
+ * String decodedMessage = videoSteganography.decode();
+ * }
+ * 
+ * + *

Note: Ensure that the input and output files are valid and accessible.

+ * + * @see Steganography + */ +public class Video extends Steganography { + private File inputFile; + private File outputFile; + private static final String END_MARKER = "###END###"; + private static final int PIXELS_PER_FRAME = 1000; + + static { + avutil.av_log_set_level(avutil.AV_LOG_QUIET); // Suppress FFmpeg logs + } + + // WARNING: This implementation is currently not functional. + public Video(File inputFile, File outputFile) throws IOException { + if (!inputFile.exists()) { + throw new IOException("Input file does not exist: " + inputFile.getAbsolutePath()); + } + this.inputFile = inputFile; + this.outputFile = outputFile; + + File outputDir = outputFile.getParentFile(); + if (outputDir != null && !outputDir.exists()) { + if (!outputDir.mkdirs()) { + throw new IOException("Failed to create output directory: " + outputDir.getAbsolutePath()); + } + } + } + + @Override + public void encode(String message) throws IOException { + if (message == null || message.isEmpty()) { + throw new IllegalArgumentException("Message cannot be null or empty"); + } + + message = message + END_MARKER; // Append end marker to the message + byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8); + System.out.println("[DEBUG] Encoding message: '" + message + "'"); + System.out.println("[DEBUG] Message bytes length: " + messageBytes.length); + + try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile); + Java2DFrameConverter converter = new Java2DFrameConverter()) { + + grabber.start(); + FFmpegFrameRecorder recorder = createRecorder(grabber); + + try { + recorder.start(); + int totalBits = messageBytes.length * 8; // Total bits to encode + int encodedBits = 0; + Frame frame; + int frameCount = 0; + boolean messageDone = false; + + while ((frame = grabber.grab()) != null) { + if (frame.image != null) { + BufferedImage img = converter.convert(frame); + + if (!messageDone && encodedBits < totalBits) { + for (int i = 0; i < PIXELS_PER_FRAME && encodedBits < totalBits; i++) { + int x = (i % (img.getWidth() - 1)) + 1; + int y = (i / (img.getWidth() - 1)) + 1; + + int byteIndex = encodedBits / 8; + int bitIndex = 7 - (encodedBits % 8); + int bit = (messageBytes[byteIndex] >> bitIndex) & 1; + + embedBitInPixel(img, x, y, 0, bit); // Embed bit in pixel + encodedBits++; + } + + if (encodedBits >= totalBits) { + messageDone = true; + } + } + + frame = converter.convert(img); + recorder.record(frame); + frameCount++; + + if (frameCount % 30 == 0) { + System.out.println("[DEBUG] Processed frames: " + frameCount + ", Encoded bits: " + encodedBits + "/" + totalBits); + } + } + } + + System.out.println("[DEBUG] Total frames processed: " + frameCount); + System.out.println("[DEBUG] Total bits encoded: " + encodedBits); + + recorder.stop(); + recorder.release(); + + } catch (Exception e) { + cleanupOnError(recorder); + throw e; + } + } + } + + private FFmpegFrameRecorder createRecorder(FFmpegFrameGrabber grabber) { + FFmpegFrameRecorder recorder = new FFmpegFrameRecorder( + outputFile, + grabber.getImageWidth(), + grabber.getImageHeight() + ); + recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); + recorder.setFormat("mp4"); + recorder.setFrameRate(grabber.getFrameRate()); + recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); + recorder.setVideoQuality(0); + recorder.setVideoOption("preset", "veryslow"); + recorder.setVideoOption("crf", "18"); + return recorder; + } + + @Override + public String decode() throws IOException { + StringBuilder binaryMessage = new StringBuilder(); + byte[] messageBytes = new byte[1024 * 1024]; + int messageLength = 0; + int bitsRead = 0; + + try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(outputFile); + Java2DFrameConverter converter = new Java2DFrameConverter()) { + + grabber.start(); + System.out.println("[DEBUG] Starting decoding process"); + + Frame frame; + int frameCount = 0; + byte currentByte = 0; + int bitCount = 0; + while ((frame = grabber.grab()) != null) { + if (frame.image != null) { + BufferedImage img = converter.convert(frame); + + for (int i = 0; i < PIXELS_PER_FRAME; i++) { + int x = (i % (img.getWidth() - 1)) + 1; + int y = (i / (img.getWidth() - 1)) + 1; + + int bit = extractBitFromPixel(img, x, y, 0); // Extract bit from pixel + currentByte = (byte) ((currentByte << 1) | bit); + bitCount++; + bitsRead++; + + if (bitCount == 8) { + messageBytes[messageLength++] = currentByte; + currentByte = 0; + bitCount = 0; + + String currentMessage = new String(messageBytes, 0, messageLength, StandardCharsets.UTF_8); + if (currentMessage.contains(END_MARKER)) { + String result = currentMessage.substring(0, currentMessage.indexOf(END_MARKER)); + System.out.println("[DEBUG] Found end marker at length: " + messageLength); + return result; + } + } + } + + frameCount++; + if (frameCount % 30 == 0) { + System.out.println("[DEBUG] Processed frames: " + frameCount + ", Bits read: " + bitsRead); + } + } + } + + System.out.println("[DEBUG] Total frames processed: " + frameCount); + System.out.println("[DEBUG] Total bits read: " + bitsRead); + System.out.println("[DEBUG] Message length: " + messageLength); + + throw new IOException("Failed to decode message: End marker not found or message corrupted"); + } + } + + private void embedBitInPixel(BufferedImage img, int x, int y, int channel, int bit) { + int rgb = img.getRGB(x, y); + int[] channels = { + (rgb >> 16) & 0xFF, + (rgb >> 8) & 0xFF, + rgb & 0xFF + }; + + channels[channel] = (channels[channel] & ~1) | bit; // Embed bit in the specified channel + + rgb = (channels[0] << 16) | (channels[1] << 8) | channels[2]; + img.setRGB(x, y, rgb); + } + + private int extractBitFromPixel(BufferedImage img, int x, int y, int channel) { + int rgb = img.getRGB(x, y); + int[] channels = { + (rgb >> 16) & 0xFF, + (rgb >> 8) & 0xFF, + rgb & 0xFF + }; + return channels[channel] & 1; // Extract bit from the specified channel + } + + private void cleanupOnError(FFmpegFrameRecorder recorder) { + try { + recorder.stop(); + recorder.release(); + } catch (Exception ex) { + } + if (outputFile.exists()) { + outputFile.delete(); // Delete output file on error + } + } +} \ No newline at end of file From 83f61348d3120c9e0ef44d737cd282db70bc4187 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Thu, 19 Dec 2024 01:00:47 +0100 Subject: [PATCH 50/77] fix unsaved fix usaved line for hashing password --- src/Classes/DatabasesManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index c2404a6..d71ab6b 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -15,14 +15,14 @@ public class DatabasesManager { private final File databasesFile; private final Map databases; - + Sha256 sha256 = new Sha256(); public DatabasesManager(File databasesFile) { this.databasesFile = databasesFile; this.databases = loadDatabases(); } public boolean verifyDatabase(String dbName, String password) { - String hashedPassword = PasswordUtils.hashPassword(password); + String hashedPassword = (password); return databases.containsKey(dbName) && databases.get(dbName).equals(hashedPassword); } @@ -30,7 +30,7 @@ public void createDatabase(String dbName, String password) { if (databases.containsKey(dbName)) { throw new IllegalArgumentException("Database already exists."); } - String hashedPassword = PasswordUtils.hashPassword(password); + String hashedPassword = sha256.calculateHash(password); databases.put(dbName, hashedPassword); saveDatabases(); } From 6b74bc6ecb586c49994d3fd5cfa81d5fdc0c757f Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Thu, 19 Dec 2024 01:18:59 +0100 Subject: [PATCH 51/77] fix unsaved changed fix unsaved changes --- src/Classes/DatabasesManager.java | 2 +- src/Tests/DatabasesManagerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index d71ab6b..284d52f 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -22,7 +22,7 @@ public DatabasesManager(File databasesFile) { } public boolean verifyDatabase(String dbName, String password) { - String hashedPassword = (password); + String hashedPassword = sha256.calculateHash(password); return databases.containsKey(dbName) && databases.get(dbName).equals(hashedPassword); } diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java index 1593838..3819524 100644 --- a/src/Tests/DatabasesManagerTest.java +++ b/src/Tests/DatabasesManagerTest.java @@ -52,7 +52,7 @@ public void testDuplicateDatabaseName() { @Test public void testLoadEmptyDatabases() { - Map databases = dbManager.loadDatabases(); + Map databases = dbManager.loadDatabases(); assertTrue(databases.isEmpty()); } } From 9c02b8e395916c1ebfd786dd47135b40e8c0cf58 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 01:26:28 +0100 Subject: [PATCH 52/77] chore : update jdk version --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8929af4..0e74f9b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 23 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '23' distribution: 'temurin' - name: Show Project Structure From e2639c5e64fcaecb3c69b7db71ac377c1a0682c7 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 01:31:14 +0100 Subject: [PATCH 53/77] chore : added gson to the deps --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0e74f9b..ef2740a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,6 +31,7 @@ jobs: mkdir -p lib wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ + wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ - name: Compile run: | From 5c0d07091d8be05f7da6a908bd0984e142317aab Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 01:33:43 +0100 Subject: [PATCH 54/77] chore : moved the test files to the assets folder --- esffs.json | 9 --------- src/Tests/DatabasesManagerTest.java | 2 +- src/Tests/SiteManagerTest.java | 2 +- .../Tests/assets/test_databases.json | 0 test_sites.json => src/Tests/assets/test_sites.json | 0 src/Tests/test_databases.json | 3 +++ src/Tests/test_sites.json | 3 +++ 7 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 esffs.json rename test_databases.json => src/Tests/assets/test_databases.json (100%) rename test_sites.json => src/Tests/assets/test_sites.json (100%) create mode 100644 src/Tests/test_databases.json create mode 100644 src/Tests/test_sites.json diff --git a/esffs.json b/esffs.json deleted file mode 100644 index 0056105..0000000 --- a/esffs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "sites": [ - { - "siteName": "example.com", - "password": "password1", - "username": "user1" - } - ] -} \ No newline at end of file diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java index 3819524..555f0db 100644 --- a/src/Tests/DatabasesManagerTest.java +++ b/src/Tests/DatabasesManagerTest.java @@ -15,7 +15,7 @@ public class DatabasesManagerTest { @Before public void setUp() { - testFile = new File("test_databases.json"); + testFile = new File("src/Tests/test_databases.json"); dbManager = new DatabasesManager(testFile); if (testFile.exists()) { diff --git a/src/Tests/SiteManagerTest.java b/src/Tests/SiteManagerTest.java index 6cf7210..34a7c6c 100644 --- a/src/Tests/SiteManagerTest.java +++ b/src/Tests/SiteManagerTest.java @@ -16,7 +16,7 @@ public class SiteManagerTest { @Before public void setUp() { - testFile = new File("test_sites.json"); + testFile = new File("src/Tests/test_sites.json"); siteManager = new SiteManager(testFile); if (testFile.exists()) { diff --git a/test_databases.json b/src/Tests/assets/test_databases.json similarity index 100% rename from test_databases.json rename to src/Tests/assets/test_databases.json diff --git a/test_sites.json b/src/Tests/assets/test_sites.json similarity index 100% rename from test_sites.json rename to src/Tests/assets/test_sites.json diff --git a/src/Tests/test_databases.json b/src/Tests/test_databases.json new file mode 100644 index 0000000..ab6298e --- /dev/null +++ b/src/Tests/test_databases.json @@ -0,0 +1,3 @@ +{ + "duplicateDb": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" +} \ No newline at end of file diff --git a/src/Tests/test_sites.json b/src/Tests/test_sites.json new file mode 100644 index 0000000..0f07589 --- /dev/null +++ b/src/Tests/test_sites.json @@ -0,0 +1,3 @@ +{ + "sites": [] +} \ No newline at end of file From f6df1a72b685c4152da286f3b878dc928e997b26 Mon Sep 17 00:00:00 2001 From: snowsuit321 Date: Thu, 19 Dec 2024 08:37:48 +0100 Subject: [PATCH 55/77] feat : add documentation and use of string builders to return encrypted and decrypted strings --- src/Classes/PolybSquareEncrypter.java | 44 ++++++++++---------- src/Classes/PolybSquareLayout.java | 4 ++ src/Classes/PolybSquareLayoutCollection.java | 24 ++++++++--- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/Classes/PolybSquareEncrypter.java b/src/Classes/PolybSquareEncrypter.java index a7f68dc..e33be3c 100644 --- a/src/Classes/PolybSquareEncrypter.java +++ b/src/Classes/PolybSquareEncrypter.java @@ -1,8 +1,5 @@ package Classes; -import java.util.ArrayList; -import java.util.List; - /** * Class used to encrypt and decrypt string of text using polyb square algorithm. * @remarks String must be only composed of letters. @@ -21,35 +18,31 @@ public class PolybSquareEncrypter { */ private final char[][] PolybSquareTable; - /** - * The succession of numbers (XY) recovered according to the characters of the plain text to encode. - */ - private final List polybCodeResults = new ArrayList<>(); - // TODO need to clear this array after sending to the rest of the system; - // Constructor. public PolybSquareEncrypter(PolybSquareLayout layoutChoice) { this.LayoutChoice = layoutChoice; this.PolybSquareTable = new PolybSquareLayoutCollection().getPolybSquareLayout(layoutChoice); } - + // Functions. /** * Get all two-digits numbers corresponding to each character of the text to encrypt. * @param plainText The text to encrypt. */ - public final void encrypt(String plainText) { + public final String encrypt(String plainText) { + // The succession of numbers (XY) recovered according to the characters of the plain text to encode. + StringBuilder encryptedCharacters = new StringBuilder(""); for (int i = 0;i < plainText.length(); i++){ // Polyb table contain 25 value. In consequence, we decide to interpret w as two v character. if (plainText.charAt(i) == 'w'){ - polybCodeResults.add(findPolybSquareCode('v')); - polybCodeResults.add(findPolybSquareCode('v')); + encryptedCharacters.append(findPolybSquareCode('v')); + encryptedCharacters.append(findPolybSquareCode('v')); } else if (Character.isLetter(plainText.charAt(i))) // must be a letter { String code = findPolybSquareCode(plainText.charAt(i)); - polybCodeResults.add(code); + encryptedCharacters.append(code); } else // other character such as number, special, space character are ignored. { @@ -58,7 +51,7 @@ else if (Character.isLetter(plainText.charAt(i))) // must be a letter } // End of encryption. - System.out.println(polybCodeResults); + return encryptedCharacters.toString(); } /** Get the number corresponding to the coordinate of the character in the current polyb table. @@ -85,31 +78,40 @@ private final String findPolybSquareCode(char characterToFind) { //return "__"; } + /** + * Get all plain text string from text encrypted with PolybSquareMethod. + * @param encryptedText An encrypted string only composed of numbers. + * @return A plain text string. + * @remarks the succession of numbers of the encrypted text is a succession of two-digits numbers (XXYYZZ...) + */ public final String decrypt(String encryptedText) { - // local StringBuilder decryptedCharacters = new StringBuilder(""); + // Get every pair of two-digits numbers composing the encrypted string. for (int i = 0;i < encryptedText.length(); i+=2) { char firstChar = encryptedText.charAt(i); char secondChar = encryptedText.charAt(i+1); + // Get the latin alphabet letter corresponding to this two-digits number. decryptedCharacters.append(getCharacterFromPolybSquareCode(firstChar, secondChar)); } + // End of decryption. return decryptedCharacters.toString(); } /** - * @param firstChar X - * @param secondChar Y - * @return code + * Get one latin alphabet character using two number as coordinate in the polyb square table. + * @param firstChar first number, used as abscyssa X + * @param secondChar second number used as ordinate, Y + * @return One latin alphabet character. */ private final char getCharacterFromPolybSquareCode(char firstChar, char secondChar) { - //System.out.println(firstChar + " " + secondChar); + // cast the char received into int values int x = Character.getNumericValue(firstChar); int y = Character.getNumericValue(secondChar); - // table are manipulated Y X + // two-dimensional array are manipulated such as 2dArray[Y][X] // - 1 beccause table index start at 0 and not 1. return PolybSquareTable[y - 1][x - 1]; } diff --git a/src/Classes/PolybSquareLayout.java b/src/Classes/PolybSquareLayout.java index 2b2313f..c6d7afe 100644 --- a/src/Classes/PolybSquareLayout.java +++ b/src/Classes/PolybSquareLayout.java @@ -1,5 +1,9 @@ package Classes; +/** + * PolybSquare Encrypter algorithm can use different layout for the table. + * Those enum value represent the different possible layouts selectable by user. + */ public enum PolybSquareLayout { HORIZONTAL, VERTICAL, diff --git a/src/Classes/PolybSquareLayoutCollection.java b/src/Classes/PolybSquareLayoutCollection.java index e9290f4..0318031 100644 --- a/src/Classes/PolybSquareLayoutCollection.java +++ b/src/Classes/PolybSquareLayoutCollection.java @@ -4,12 +4,15 @@ import java.util.Hashtable; /** - * The class managing access to all the possible layout for the polybSquare Encrypter + * The class managing access to all the possible layout for the polybSquare Encrypter. */ public class PolybSquareLayoutCollection { // Fields. - // All character of the latin alphabet are listed from a to z + /** + * All character of the latin alphabet are listed from a to z in successive rows + * top to bottom. + */ private final char[][] horizontal = { {'a','b','c','d','e'}, {'f','g','h','i','j'}, @@ -18,6 +21,10 @@ public class PolybSquareLayoutCollection { {'u','v','x','y','z'}, }; + /** + * All character of the latin alphabet are listed from a to z in successive cols + * left to right. + */ private final char[][] vertical = { {'a','f','k','p','u'}, {'b','g','l','q','v'}, @@ -26,18 +33,23 @@ public class PolybSquareLayoutCollection { {'e','j','o','t','z'}, }; + /** + * The collection of all the possible layouts. + */ private final Dictionary polybSquareTables = new Hashtable<>(); - //{{ - // put(PolybSquareAlphabet.VERTICAL, vertical); - //}} - // CONSTRUCTOR. + // Constructor. public PolybSquareLayoutCollection() { polybSquareTables.put(PolybSquareLayout.VERTICAL, vertical); polybSquareTables.put(PolybSquareLayout.HORIZONTAL, horizontal); } // Functions. + /** + * Getter function for a polyb square table layout. + * @param alphabet the enum value corresponding to the possible layout selectable by user. + * @return a 2D array representing the polybSquare table. + */ public char[][] getPolybSquareLayout(PolybSquareLayout alphabet) { // TODO Add error management From 985891a2262c1207ebee7bea9ed02dd7af79661f Mon Sep 17 00:00:00 2001 From: snowsuit321 Date: Thu, 19 Dec 2024 09:09:55 +0100 Subject: [PATCH 56/77] feat : add initial tests for PolybSquareEncrypter --- src/Classes/PolybSquareEncrypter.java | 18 ------ src/Tests/PolybSquareEncryterTest.java | 86 ++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 src/Tests/PolybSquareEncryterTest.java diff --git a/src/Classes/PolybSquareEncrypter.java b/src/Classes/PolybSquareEncrypter.java index e33be3c..c0c6aef 100644 --- a/src/Classes/PolybSquareEncrypter.java +++ b/src/Classes/PolybSquareEncrypter.java @@ -115,22 +115,4 @@ private final char getCharacterFromPolybSquareCode(char firstChar, char secondCh // - 1 beccause table index start at 0 and not 1. return PolybSquareTable[y - 1][x - 1]; } - - - - - - - - - - - - - - - - - - } diff --git a/src/Tests/PolybSquareEncryterTest.java b/src/Tests/PolybSquareEncryterTest.java new file mode 100644 index 0000000..084c2e3 --- /dev/null +++ b/src/Tests/PolybSquareEncryterTest.java @@ -0,0 +1,86 @@ +package Tests; + +import Classes.PolybSquareEncrypter; +import Classes.PolybSquareLayout; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class PolybSquareEncryterTest +{ + private PolybSquareEncrypter horizontalLayoutPolybSquareEncrypter; + + // Horizontal layout + + // Encryption + @Before + public void setUp() { + this.horizontalLayoutPolybSquareEncrypter = new PolybSquareEncrypter(PolybSquareLayout.HORIZONTAL); + } + + @Test + public void testPolybSquareEncryterEncryption() { + String plainText = ("hello"); + String expectedEncryptedText = "3251232353"; + String encryptionResult = this.horizontalLayoutPolybSquareEncrypter.encrypt(plainText); + + // Validation + assertEquals(expectedEncryptedText, encryptionResult); + } + + @Test + public void testPolybSquareEncryterEncryptionEmptyString() { + String plainText = (""); + String expectedEncryptedText = ""; + String encryptionResult = this.horizontalLayoutPolybSquareEncrypter.encrypt(plainText); + + // Validation + assertEquals(expectedEncryptedText, encryptionResult); + } + + @Test + public void testPolybSquareEncryterEncryptionW() { + String plainText = ("w"); + String expectedEncryptedText = "2525"; + String encryptionResult = this.horizontalLayoutPolybSquareEncrypter.encrypt(plainText); + + // Validation + assertEquals(expectedEncryptedText, encryptionResult); + } + + // Decryption + @Test + public void testPolybSquareEncryterDecryption() { + String encryptedText = ("3251232353"); + String expectedPlainText = "hello"; + String decryptionResult = this.horizontalLayoutPolybSquareEncrypter.decrypt(encryptedText); + + // Validation + assertEquals(expectedPlainText, decryptionResult); + } + + @Test + public void testPolybSquareEncryterDecryptionEmptyString() { + String encryptedText = (""); + String expectedPlainText = ""; + String decryptionResult = this.horizontalLayoutPolybSquareEncrypter.decrypt(encryptedText); + + // Validation + assertEquals(expectedPlainText, decryptionResult); + } + + @Test + public void testPolybSquareEncryterDecryptionW() { + String encryptedText = ("2525"); + String expectedPlainText = "vv"; + String decryptionResult = this.horizontalLayoutPolybSquareEncrypter.decrypt(encryptedText); + + // Validation + assertEquals(expectedPlainText, decryptionResult); + } + + // TODO Vertical Layout + // TODO ClockWise spiral layout + // TODO CounterClockWise spiral layout +} From e64171c83a62c68e6dcbd248905d6ccd9d11c89a Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:04:12 +0100 Subject: [PATCH 57/77] chore : delete duplicates --- src/Tests/test_databases.json | 3 --- src/Tests/test_sites.json | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 src/Tests/test_databases.json delete mode 100644 src/Tests/test_sites.json diff --git a/src/Tests/test_databases.json b/src/Tests/test_databases.json deleted file mode 100644 index ab6298e..0000000 --- a/src/Tests/test_databases.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "duplicateDb": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" -} \ No newline at end of file diff --git a/src/Tests/test_sites.json b/src/Tests/test_sites.json deleted file mode 100644 index 0f07589..0000000 --- a/src/Tests/test_sites.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sites": [] -} \ No newline at end of file From 064c6de6c854e9726f5c8b2653d8a5ab400e8ed8 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:05:04 +0100 Subject: [PATCH 58/77] chore : use the right path of file in the tests --- src/Tests/DatabasesManagerTest.java | 2 +- src/Tests/SiteManagerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java index 555f0db..b2f098b 100644 --- a/src/Tests/DatabasesManagerTest.java +++ b/src/Tests/DatabasesManagerTest.java @@ -15,7 +15,7 @@ public class DatabasesManagerTest { @Before public void setUp() { - testFile = new File("src/Tests/test_databases.json"); + testFile = new File("src/Tests/assets/test_databases.json"); dbManager = new DatabasesManager(testFile); if (testFile.exists()) { diff --git a/src/Tests/SiteManagerTest.java b/src/Tests/SiteManagerTest.java index 34a7c6c..8dc1e9a 100644 --- a/src/Tests/SiteManagerTest.java +++ b/src/Tests/SiteManagerTest.java @@ -16,7 +16,7 @@ public class SiteManagerTest { @Before public void setUp() { - testFile = new File("src/Tests/test_sites.json"); + testFile = new File("src/Tests/assets/test_sites.json"); siteManager = new SiteManager(testFile); if (testFile.exists()) { From 632f8174e331218ad5aa5ffc18f788eded44d14e Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 00:51:45 +0100 Subject: [PATCH 59/77] chore : added the libs for video stegano --- ByteWarden.iml | 1 + 1 file changed, 1 insertion(+) diff --git a/ByteWarden.iml b/ByteWarden.iml index 23b56cb..08baa97 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -29,5 +29,6 @@ + \ No newline at end of file From 2b815a29d17e34fff2fe7be1c47cf75d38049992 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:22:15 +0100 Subject: [PATCH 60/77] chore : delete duplicates in deps file --- ByteWarden.iml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ByteWarden.iml b/ByteWarden.iml index 08baa97..13556b5 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -17,17 +17,6 @@ - - - - - - - - - - - From 9510fdae46e77f43c3eff8d0326994b3b0f5fa1c Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:24:32 +0100 Subject: [PATCH 61/77] chore : added the javacv-platform to the ci for the video stetaganography --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ef2740a..738484c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,6 +32,7 @@ jobs: wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacv-platform/1.5.11/javacv-platform-1.5.11.jar -P lib/ - name: Compile run: | From 96973b439cdb11a5705fef4404a25c32053eb358 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:28:47 +0100 Subject: [PATCH 62/77] chore : added ffmpeg --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 738484c..332cfa4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,6 +33,7 @@ jobs: wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ wget https://repo1.maven.org/maven2/org/bytedeco/javacv-platform/1.5.11/javacv-platform-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11-linux-x86_64.jar -P lib/ - name: Compile run: | From 3fbaebe2dd1a8864c1e318f96ed9121d18867795 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:39:39 +0100 Subject: [PATCH 63/77] chore: added the missing libs --- .github/workflows/tests.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 332cfa4..718d5e9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,15 +26,18 @@ jobs: echo "Directory contents:" ls -R - - name: Download Dependencies - run: | - mkdir -p lib - wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ - wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ - wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/javacv-platform/1.5.11/javacv-platform-1.5.11.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11-linux-x86_64.jar -P lib/ - + - name: Download Dependencies + run: | + mkdir -p lib + wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ + wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ + wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacv/1.5.11/javacv-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacpp/1.5.11/javacpp-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11-linux-x86_64.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacpp-platform/1.5.11/javacpp-platform-1.5.11.jar -P lib/ + - name: Compile run: | mkdir -p out From b087ec4e4caac8ec02969b88e1d82d7cbcabfb82 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 13:41:37 +0100 Subject: [PATCH 64/77] fix : yml fixed --- .github/workflows/tests.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 718d5e9..692d80e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,17 +26,18 @@ jobs: echo "Directory contents:" ls -R - - name: Download Dependencies - run: | - mkdir -p lib - wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ - wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ - wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/javacv/1.5.11/javacv-1.5.11.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/javacpp/1.5.11/javacpp-1.5.11.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11-linux-x86_64.jar -P lib/ - wget https://repo1.maven.org/maven2/org/bytedeco/javacpp-platform/1.5.11/javacpp-platform-1.5.11.jar -P lib/ + - name: Download Dependencies + run: | + mkdir -p lib + wget https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar -P lib/ + wget https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar -P lib/ + wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacv/1.5.11/javacv-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacpp/1.5.11/javacpp-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/ffmpeg/7.1-1.5.11/ffmpeg-7.1-1.5.11-linux-x86_64.jar -P lib/ + wget https://repo1.maven.org/maven2/org/bytedeco/javacpp-platform/1.5.11/javacpp-platform-1.5.11.jar -P lib/ + - name: Compile run: | From bc09763006b4bb8aa719914f01e24c3ea94abd72 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 14:19:40 +0100 Subject: [PATCH 65/77] fix : test image steganography when image is null --- src/Tests/SteganographyImageTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Tests/SteganographyImageTest.java b/src/Tests/SteganographyImageTest.java index a8a7c0f..7f322b3 100644 --- a/src/Tests/SteganographyImageTest.java +++ b/src/Tests/SteganographyImageTest.java @@ -35,8 +35,9 @@ public void testEncodeMessageTooLarge() { @Test public void testDecodeWithoutImage() { - Image image = new Image(null); - Exception exception = assertThrows(NullPointerException.class, image::decode); - assertEquals("No image loaded", exception.getMessage()); + Exception exception = assertThrows(NullPointerException.class, () -> { + new Image(null); + }); + assertEquals(null, exception.getMessage()); } } From 75e7f98f39f3dca2bbac68ee6ab4fc59f957edf1 Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 14:19:57 +0100 Subject: [PATCH 66/77] chore : added more robustness checks for the text stegano --- src/Classes/Steganography/Text.java | 104 +++++++++++++++++----------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/src/Classes/Steganography/Text.java b/src/Classes/Steganography/Text.java index 6776d8f..670f874 100644 --- a/src/Classes/Steganography/Text.java +++ b/src/Classes/Steganography/Text.java @@ -2,75 +2,99 @@ public class Text extends Steganography { private String stegoText; + private String content; @Override public void encode(String message) { - // Check if the message is null or empty + validateMessage(message); + validateContent(); + + String binary = convertToBinary(message); + this.stegoText = embedMessage(binary); + } + + private void validateMessage(String message) { if (message == null || message.isEmpty()) { throw new IllegalArgumentException("Message cannot be empty"); } - + } + + private void validateContent() { + if (content == null || content.trim().isEmpty()) { + throw new IllegalStateException("Content cannot be empty"); + } + } + + private String convertToBinary(String message) { StringBuilder binary = new StringBuilder(); - // Convert each character of the message to its binary representation for (char c : message.toCharArray()) { String binaryChar = String.format("%8s", Integer.toBinaryString(c)) - .replace(' ', '0'); // Ensure each binary string is 8 bits long + .replace(' ', '0'); binary.append(binaryChar); } + return binary.toString(); + } - StringBuilder result = new StringBuilder(); - // Split the content into words - String[] words = this.getContent().split("\\s+"); - int binaryIndex = 0; - - // Embed the binary message into the text by adding extra spaces - for (int i = 0; i < words.length - 1 && binaryIndex < binary.length(); i++) { - result.append(words[i]); - result.append(binary.charAt(binaryIndex) == '1' ? " " : " "); // Add double space for '1' and single space for '0' - binaryIndex++; - } + private String embedMessage(String binary) { + String[] words = content.split("\\s+"); + int requiredSpaces = binary.length(); - // Append the remaining words - for (int i = binaryIndex; i < words.length; i++) { - result.append(words[i]); - if (i < words.length - 1) result.append(" "); + if (words.length - 1 < requiredSpaces) { + throw new IllegalStateException( + "Content is too short to encode the message. Need at least " + + (requiredSpaces + 1) + " words, but got " + words.length); } - // Store the steganographed text - this.stegoText = result.toString(); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < words.length; i++) { + result.append(words[i]); + + if (i < binary.length()) { + // Add either two spaces (for 1) or one space (for 0) + result.append(binary.charAt(i) == '1' ? " " : " "); + } else if (i < words.length - 1) { + // Add normal space for remaining words + result.append(" "); + } + } + return result.toString(); } @Override public String decode() { - // Check if there is any steganographed text - if (this.stegoText == null) { - throw new IllegalStateException("No steganographed text found"); + if (stegoText == null) { + throw new IllegalStateException("No encoded message found"); } - + StringBuilder binary = new StringBuilder(); - // Split the steganographed text by non-space characters - String[] words = this.stegoText.split("\\S+"); + String[] parts = stegoText.split("\\S+"); - // Convert spaces back to binary representation - for (String space : words) { - if (!space.isEmpty()) { - binary.append(space.length() > 1 ? "1" : "0"); // Double space is '1', single space is '0' + // Skip first empty part if exists + for (int i = 1; i < parts.length; i++) { + if (!parts[i].isEmpty()) { + binary.append(parts[i].length() > 1 ? "1" : "0"); } } - + + // Convert binary back to text StringBuilder message = new StringBuilder(); - // Convert binary string back to characters - for (int i = 0; i < binary.length() - 7; i += 8) { - String byteStr = binary.substring(i, i + 8); + String binaryStr = binary.toString(); + + for (int i = 0; i + 7 < binaryStr.length(); i += 8) { + String byteStr = binaryStr.substring(i, i + 8); int charCode = Integer.parseInt(byteStr, 2); message.append((char) charCode); } - - return message.toString(); + + return message.toString().trim(); // Add trim() here } - + @Override public String getContent() { - return super.getContent(); + return content; + } + + public void setContent(String content) { + this.content = content; } -} +} \ No newline at end of file From 67877f81b129282cb803a6bbb94402b367c8f4fb Mon Sep 17 00:00:00 2001 From: Nabil Date: Thu, 19 Dec 2024 14:20:02 +0100 Subject: [PATCH 67/77] chore : added more robustness checks for the text stegano --- src/Tests/SteganographyTextTest.java | 103 +++++++++++++++++++-------- 1 file changed, 73 insertions(+), 30 deletions(-) diff --git a/src/Tests/SteganographyTextTest.java b/src/Tests/SteganographyTextTest.java index 7832437..2e56ed4 100644 --- a/src/Tests/SteganographyTextTest.java +++ b/src/Tests/SteganographyTextTest.java @@ -1,45 +1,88 @@ package Tests; import Classes.Steganography.Text; +import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; - +import static org.junit.Assert.*; public class SteganographyTextTest { + private Text steganography; + private static final String LOREM_IPSUM = String.join(" ", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus porttitor augue dignissim mauris tincidunt efficitur. Nunc gravida ante vel iaculis interdum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. " + + "Ut a iaculis dolor. Sed sed aliquet justo, sit amet malesuada " + + "ex. Fusce ullamcorper vehicula tristique. Maecenas sit amet nulla viverra, " + + "consectetur erat ut, porta libero. Sed lorem mauris, hendrerit in aliquam rhoncus, " + + "imperdiet sit amet dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + + "Suspendisse vel ultrices ipsum. Nam risus velit, sollicitudin eget sodales eget, " + + "convallis non dolor. Suspendisse in mollis diam. Suspendisse vulputate posuere maximus. " + + "Fusce dignissim elit leo, vitae placerat ex semper et. Mauris fermentum ligula at felis semper viverra." + + " Duis a neque in turpis molestie semper. Duis arcu felis, porta vitae mauris sit amet, facilisis faucibus mauris. Phasellus viverra massa felis, non iaculis neque sagittis at. Nunc nisl lacus, lobortis in malesuada id, pharetra at justo. Sed non turpis ac erat iaculis tincidunt. Proin scelerisque pulvinar nulla non pretium. Donec eget neque a sem placerat tincidunt. Fusce ante ipsum, rhoncus pretium sapien ut, pellentesque bibendum nulla. Phasellus ac accumsan magna. Suspendisse egestas, eros ac feugiat maximus, nibh lorem scelerisque tellus, sed iaculis nulla velit at augue. Curabitur sit amet convallis sapien.Cras cursus ante quis eros tincidunt, et convallis elit faucibus. Cras eget laoreet lacus. Donec dui massa, sagittis eget ligula sed, laoreet suscipit nulla. Suspendisse eget posuere mauris, non faucibus justo. Integer dignissim consectetur ultrices. Suspendisse luctus, enim quis condimentum congue, nisl tortor dapibus nibh, id gravida nulla enim eu felis. Duis rutrum est sed bibendum efficitur. Ut elit elit, ornare eget neque et, vulputate vulputate nunc. Mauris consequat rhoncus risus. Sed imperdiet orci sollicitudin, convallis ligula in, gravida mi. Mauris pharetra lorem vitae sagittis condimentum. Aliquam erat volutpat. Donec cursus quis sem sit amet fringilla. Sed in ante justo. Vivamus tristique diam sit amet porta lobortis. Sed purus odio, egestas vel risus eu, laoreet tempus enim. Nullam vel bibendum nisi, eget dapibus felis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mattis sit amet nunc sed maximus. Mauris tincidunt non sapien eu eleifend. Nam eget felis a quam pulvinar sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque pharetra volutpat tortor, et bibendum libero mattis idSed in varius felis, vitae pellentesque leo. In hac habitasse platea dictumst. Phasellus in ullamcorper quam. Etiam a ultricies ex. Sed nec nisl in ante semper mollis vel vel mi. Quisque non turpis neque. Donec est eros, efficitur ut lectus sed, viverra pulvinar lectus. Fusce a porta leo. Curabitur vitae erat congue, semper nisl quis, cursus leo. Pellentesque blandit ac nunc ac pretiumNulla sit amet vulputate nunc. Donec et turpis eu mauris tincidunt vulputate et nec dui. Vestibulum quis fermentum arcu. Nulla luctus facilisis turpis, et rutrum ligula fermentum sit amet. Aliquam vitae ornare justo. Nullam placerat sed nibh ornare sodales. Sed nec posuere nunc. Aenean blandit gravida dapibus. Cras fermentum justo ac vestibulum vestibulum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed egestas orci ut mi scelerisque ornare. Morbi ex turpis, tristique eget est id, luctus tempor magna. In quam dui, dapibus nec viverra quis, rutrum eget urna. Curabitur iaculis dui non odio laoreet, ac bibendum orci feugiatDonec quis nisi ante. Ut a dolor arcu. Morbi mattis nulla a ligula congue feugiat. Nullam iaculis risus non metus blandit, viverra pellentesque tellus ullamcorper. Sed odio neque, sodales mollis libero in, tincidunt vulputate nulla. Duis non nunc venenatis, posuere lorem in, vulputate odio. Mauris venenatis efficitur libero. Nullam lectus turpis, tempor."); + + @Before + public void setUp() { + steganography = new Text(); + } + + @Test + public void testSetAndGetContent() { + String content = "This is a test content"; + steganography.setContent(content); + assertEquals(content, steganography.getContent()); + } + + @Test(expected = IllegalArgumentException.class) + public void testEncodeWithNullMessage() { + steganography.setContent("Some content"); + steganography.encode(null); + } + + @Test(expected = IllegalArgumentException.class) + public void testEncodeWithEmptyMessage() { + steganography.setContent("Some content"); + steganography.encode(""); + } @Test - public void testEncodeDecode() { - Text text = new Text(); - text.setContent("This is a simple test content for steganography."); - + public void testEncodeAndDecode() { String message = "Hello"; - text.encode(message); - String decodedMessage = text.decode(); - - assertEquals(message, decodedMessage); + steganography.setContent(LOREM_IPSUM); + steganography.encode(message); + String decoded = steganography.decode(); + assertEquals(message, decoded); + } + + @Test(expected = IllegalStateException.class) + public void testDecodeWithoutEncoding() { + steganography.decode(); } @Test - public void testEncodeEmptyMessage() { - Text text = new Text(); - text.setContent("This is a simple test content for steganography."); - - Exception exception = assertThrows(IllegalArgumentException.class, () -> { - text.encode(""); - }); - - assertEquals("Message cannot be empty", exception.getMessage()); + public void testEncodeLongMessage() { + String message = "This is a longer secret message that needs to be hidden"; + steganography.setContent(LOREM_IPSUM); + steganography.encode(message); + String decoded = steganography.decode(); + assertEquals(message, decoded); } @Test - public void testDecodeWithoutEncoding() { - Text text = new Text(); - - Exception exception = assertThrows(IllegalStateException.class, () -> { - text.decode(); - }); - - assertEquals("No steganographed text found", exception.getMessage()); - } -} + public void testEncodeSpecialCharacters() { + String message = "Test@#$%"; + steganography.setContent(LOREM_IPSUM); + steganography.encode(message); + String decoded = steganography.decode(); + assertEquals(message, decoded); + } + + @Test + public void testEncodeWithMinimalContent() { + String message = "Hi"; + // Using just enough Lorem Ipsum words for "Hi" (needs 16 bits + 1 word) + String minimalContent = "Lorem ipsum dolor sit amet consectetur adipiscing elit " + + "sed do eiusmod tempor incididunt ut labore et dolore magna"; + steganography.setContent(minimalContent); + steganography.encode(message); + String decoded = steganography.decode(); + assertEquals(message, decoded); + } +} \ No newline at end of file From b4721b04aadf025a1fe93a450fdb69d284179bd1 Mon Sep 17 00:00:00 2001 From: lucas Date: Thu, 19 Dec 2024 23:09:05 +0100 Subject: [PATCH 68/77] Help Menu to guide the user through the program --- .idea/libraries/bytedeco_javacv_platform.xml | 4 +- src/Classes/HelpMenu.java | 192 +++++++++++++++++++ src/Classes/Menu.java | 48 +++-- 3 files changed, 229 insertions(+), 15 deletions(-) create mode 100644 src/Classes/HelpMenu.java diff --git a/.idea/libraries/bytedeco_javacv_platform.xml b/.idea/libraries/bytedeco_javacv_platform.xml index 53085a2..9fa3834 100644 --- a/.idea/libraries/bytedeco_javacv_platform.xml +++ b/.idea/libraries/bytedeco_javacv_platform.xml @@ -19,9 +19,9 @@ - + - + diff --git a/src/Classes/HelpMenu.java b/src/Classes/HelpMenu.java new file mode 100644 index 0000000..a527dcc --- /dev/null +++ b/src/Classes/HelpMenu.java @@ -0,0 +1,192 @@ +package Classes; + +import java.util.Scanner; + +public class HelpMenu { + + // Main method to display the help menu and handle user navigation. + public static void displayMenuHelp(Scanner scanner) { + int choice; + + // Loop to display the menu until the user chooses to exit. + do { + System.out.println("\n========== HELP MENU =========="); + System.out.println("1. How to create a database?"); + System.out.println("2. How to encrypt my database password?"); + System.out.println("3. How the algorithms work ?"); + System.out.println("4. How to decrypt my password?"); + System.out.println("5. How to a add/ modify/ delete a site in my database?"); + System.out.println("6. Exit help menu"); + System.out.print("Select an option: "); + + // Read user's choice. + choice = scanner.nextInt(); + scanner.nextLine(); // Consume newline character. + + // Handle the user's choice using a switch statement. + switch (choice) { + case 1: + navigateCreateDatabaseHelp(scanner); // Navigate to database creation help. + break; + case 2: + navigateEncryptPasswordHelp(scanner); // Navigate to password encryption help. + break; + case 3: + navigateExplainAlgorithms(scanner); // Navigate to algorithm explanations. + break; + case 4: + navigateDecryptPasswordHelp(scanner); // Navigate to password decryption help. + break; + case 5: + navigateNewSiteHelp(scanner); + break; + case 6: + System.out.println("Exiting help menu..."); // Exit message. + break; + default: + System.out.println("Invalid choice. Please select a valid option."); // Handle invalid input. + } + } while (choice != 5); + + // Close the scanner when exiting the menu. + scanner.close(); + } + + // Method to provide help on creating a database. + private static void navigateCreateDatabaseHelp(Scanner scanner) { + boolean back = false; + do { + System.out.println("\n--- How to Create a Database ---"); + System.out.println("1. Open the application."); + System.out.println("2. Choose the 'Create a new database' option in the main menu."); + System.out.println("3. Enter a name for your database and a master password."); + System.out.println("4. The application will encrypt and store your database securely."); + System.out.println("5. Remember your master password; it cannot be recovered if lost."); + System.out.println("6. Go back"); + System.out.println("7. Exit Help Menu"); + System.out.print("Select an option: "); + + // Read the user's choice. + String choice = scanner.nextLine(); + if (choice.equalsIgnoreCase(String.valueOf(6))) { + back = true; // Go back to the main help menu. + } else if (choice.equalsIgnoreCase(String.valueOf(7))) { + System.out.println("Exiting help menu..."); + System.exit(0); // Exit the program. + } else { + System.out.println("Invalid input. Please choose 'Go back' or 'Exit'."); + } + } while (!back); + } + + // Method to provide help on encrypting database passwords. + private static void navigateEncryptPasswordHelp(Scanner scanner) { + boolean back = false; + do { + System.out.println("\n--- How to Encrypt My Database Password ---"); + System.out.println("1. When adding a password to your database, choose an encryption algorithm:"); + System.out.println(" - ROT(X): Shifts characters by X positions."); + System.out.println(" - RC4: A stream cipher for quick encryption."); + System.out.println(" - Vigenere: Uses a keyword to shift characters."); + System.out.println(" - Enigma: Simulates the historical encryption machine."); + System.out.println(" - Polybe: Encodes text using a 5x5 grid."); + System.out.println("2. The application will encrypt and save the password using the selected algorithm."); + System.out.println("3. Go back"); + System.out.println("4. Exit Help Menu"); + System.out.print("Select an option: "); + + String choice = scanner.nextLine(); + if (choice.equalsIgnoreCase(String.valueOf(3))) { + back = true; // Go back to the main help menu. + } else if (choice.equalsIgnoreCase(String.valueOf(4))) { + System.out.println("Exiting help menu..."); + System.exit(0); // Exit the program. + } else { + System.out.println("Invalid input. Please choose 'Go back' or 'Exit'."); + } + } while (!back); + } + + + + + // Method to explain encryption algorithms. + private static void navigateExplainAlgorithms(Scanner scanner) { + boolean back = false; + do { + System.out.println("\n--- Algorithm Explanations ---"); + System.out.println("1. ROT(X): Rotates each character by X positions in the alphabet."); + System.out.println(" - Example: 'A' with ROT(3) becomes 'D'."); + System.out.println("2. RC4: A symmetric key stream cipher that encrypts data byte by byte."); + System.out.println("3. Vigenere: Uses a keyword to shift letters cyclically."); + System.out.println(" - Example: Keyword 'KEY' applied to text shifts letters by positions derived from 'KEY'."); + System.out.println("4. Enigma: Mimics the encryption of the WWII Enigma machine."); + System.out.println("5. Polybe: Encodes text into pairs of numbers based on a 5x5 grid."); + System.out.println("6. Go back"); + System.out.println("7. Exit Help Menu"); + System.out.print("Select an option: "); + + String choice = scanner.nextLine(); + if (choice.equalsIgnoreCase(String.valueOf(6))) { + back = true; // Go back to the main help menu. + } else if (choice.equalsIgnoreCase(String.valueOf(7))) { + System.out.println("Exiting help menu..."); + System.exit(0); // Exit the program. + } else { + System.out.println("Invalid input. Please choose 'Go back' or 'Exit'."); + } + } while (!back); + } + + // Method to provide help on decrypting passwords. + private static void navigateDecryptPasswordHelp(Scanner scanner) { + boolean back = false; + do { + System.out.println("\n--- How to Decrypt My Password ---"); + System.out.println("1. Select the password you want to decrypt from the database."); + System.out.println("2. Enter the master password to access the database."); + System.out.println("3. The application will identify the encryption algorithm used."); + System.out.println("4. Enter any additional required keys or settings (e.g., keyword for Vigenere)."); + System.out.println("5. The password will be decrypted and displayed securely."); + System.out.println("6. Go back"); + System.out.println("7. Exit Help Menu"); + System.out.print("Select an option: "); + + String choice = scanner.nextLine(); + if (choice.equalsIgnoreCase(String.valueOf(6))) { + back = true; // Go back to the main help menu. + } else if (choice.equalsIgnoreCase(String.valueOf(7))) { + System.out.println("Exiting help menu..."); + System.exit(0); // Exit the program. + } else { + System.out.println("Invalid input. Please choose 'Go back' or 'Exit'."); + } + } while (!back); + } + + // Method to provide help on adding/ modifying/ deleting a site in the database + private static void navigateNewSiteHelp(Scanner scanner) { + boolean back = false; + do { + System.out.println("\n--- How to Add/ Modify/ Delete a Site in my database ---"); + System.out.println("1. In the main menu select : 'Choose an existing database'"); + System.out.println("2. Connect to your database where you have your password"); + System.out.println("3. Select 'Manage sites'"); + System.out.println("4. Select 'Add a new site'/ 'Modify a site' or 'Delete a site'"); + System.out.println("5. Follow the instructions"); + System.out.println("6. Go back"); + System.out.println("7. Exit Help Menu"); + System.out.print("Select an option: "); + + String choice = scanner.nextLine(); + if (choice.equalsIgnoreCase(String.valueOf(6))) { + back = true; // Go back to the main help menu. + } else if (choice.equalsIgnoreCase(String.valueOf(7))) { + System.out.println("Exiting help menu..."); + System.exit(0); // Exit the program. + } else { + System.out.println("Invalid input. Please choose 'Go back' or 'Exit'."); + } + } while (!back); + } +} diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index a3b8821..3d406cf 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -6,49 +6,71 @@ public class Menu { public static void main(String[] args) { + // Initialize the scanner for user input Scanner scanner = new Scanner(System.in); + // Load the database file to manage existing databases File databasesFile = new File("databases.json"); DatabasesManager dbManager = new DatabasesManager(databasesFile); + // Display the main menu options System.out.println("Welcome to the Encryption/Decryption Program"); System.out.println("Choose an option:"); System.out.println("1. Choose an existing database"); System.out.println("2. Create a new database"); + System.out.println("3. Help Menu"); + + // Read the user's choice for the menu int dbChoice = scanner.nextInt(); - scanner.nextLine(); + scanner.nextLine(); // Consume the newline character left by nextInt + // Handle the case where the user wants to connect to an existing database if (dbChoice == 1) { System.out.println("Enter the name of the database:"); - String dbName = scanner.nextLine(); + String dbName = scanner.nextLine(); // Read the database name System.out.println("Enter the password:"); - String inputPassword = scanner.nextLine(); + String inputPassword = scanner.nextLine(); // Read the database password + // Verify the database credentials if (dbManager.verifyDatabase(dbName, inputPassword)) { System.out.println("Successfully connected to the database: " + dbName); + // Initialize the SiteManager to manage sites within the database SiteManager siteManager = new SiteManager(new File(dbName + ".json")); - siteManager.manageSites(scanner); + siteManager.manageSites(scanner); // Begin managing sites } else { - System.out.println("Incorrect database name or password."); + System.out.println("Incorrect database name or password."); // Error message for invalid credentials } - } else if (dbChoice == 2) { + } + // Handle the case where the user wants to create a new database + else if (dbChoice == 2) { System.out.println("Enter the name of the new database:"); - String dbName = scanner.nextLine(); + String dbName = scanner.nextLine(); // Read the new database name System.out.println("Choose a password option:"); System.out.println("1. Enter a custom password"); System.out.println("2. Generate a random password"); + + // Read the user's choice for password type int passwordChoice = scanner.nextInt(); - scanner.nextLine(); + scanner.nextLine(); // Consume the newline character left by nextInt + // Determine the password based on the user's choice String password = passwordChoice == 1 - ? scanner.nextLine() - : PasswordUtils.generateRandomPassword(12); + ? scanner.nextLine() // Custom password entered by user + : PasswordUtils.generateRandomPassword(12); // Generate a random password System.out.println("Generated password: " + password); + // Create the new database with the given name and password dbManager.createDatabase(dbName, password); + // Initialize the SiteManager for the new database SiteManager siteManager = new SiteManager(new File(dbName + ".json")); - siteManager.manageSites(scanner); - } else { - System.out.println("Invalid choice."); + siteManager.manageSites(scanner); // Begin managing sites + } + // Handle the case where the user wants to access the help menu + else if (dbChoice == 3){ + HelpMenu.displayMenuHelp(scanner); // Display the help menu + } + // Handle invalid choices + else { + System.out.println("Invalid choice."); // Error message for invalid input } } } From de4e5a7ad0962e5aca3770ae9f8c3c4bf779977f Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Fri, 20 Dec 2024 06:45:39 +0100 Subject: [PATCH 69/77] Add databases cipher add choice for databases encryption and handle multiple cipher methods for databases --- .idea/libraries/bytedeco_javacv_platform.xml | 4 +- databases.json | 3 +- src/Classes/DatabasesManager.java | 58 ++++++++++++++-- src/Classes/Menu.java | 56 +++++++++++++-- src/Classes/SiteManager.java | 71 +++++++++++++++++--- src/Tests/assets/test_databases.json | 1 - src/Tests/assets/test_sites.json | 3 - 7 files changed, 168 insertions(+), 28 deletions(-) delete mode 100644 src/Tests/assets/test_sites.json diff --git a/.idea/libraries/bytedeco_javacv_platform.xml b/.idea/libraries/bytedeco_javacv_platform.xml index 9fa3834..53085a2 100644 --- a/.idea/libraries/bytedeco_javacv_platform.xml +++ b/.idea/libraries/bytedeco_javacv_platform.xml @@ -19,9 +19,9 @@ - + - + diff --git a/databases.json b/databases.json index 3f862b5..3beee54 100644 --- a/databases.json +++ b/databases.json @@ -1,3 +1,4 @@ { - "esffs": "e4aebaf0f1b173cdf19ae33a5539cc4e52990f37473f6f41623e1a3a346fa713" + + } \ No newline at end of file diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index 284d52f..64f5fde 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -14,34 +14,39 @@ public class DatabasesManager { private final File databasesFile; - private final Map databases; - Sha256 sha256 = new Sha256(); + private final Map databases; + private final Sha256 sha256 = new Sha256(); + public DatabasesManager(File databasesFile) { this.databasesFile = databasesFile; this.databases = loadDatabases(); } public boolean verifyDatabase(String dbName, String password) { + if (!databases.containsKey(dbName)) return false; + Database database = databases.get(dbName); String hashedPassword = sha256.calculateHash(password); - return databases.containsKey(dbName) && databases.get(dbName).equals(hashedPassword); + return database.getHashPassword().equals(hashedPassword); } - public void createDatabase(String dbName, String password) { + public void createDatabase(String dbName, String password, Map encryptionMap) { if (databases.containsKey(dbName)) { throw new IllegalArgumentException("Database already exists."); } String hashedPassword = sha256.calculateHash(password); - databases.put(dbName, hashedPassword); + Database newDatabase = new Database(dbName, hashedPassword, encryptionMap); + databases.put(dbName, newDatabase); saveDatabases(); } - public Map loadDatabases() { + private Map loadDatabases() { if (!databasesFile.exists()) return new HashMap<>(); try (FileReader reader = new FileReader(databasesFile)) { Gson gson = new Gson(); - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() {}.getType(); return gson.fromJson(reader, type); } catch (IOException e) { + e.printStackTrace(); return new HashMap<>(); } } @@ -54,4 +59,43 @@ private void saveDatabases() { e.printStackTrace(); } } + + // Classe interne représentant une base de données + public static class Database { + private final String name; + private final String hashPassword; + private final Map encryptionMap; + + public Database(String name, String hashPassword, Map encryptionMap) { + this.name = name; + this.hashPassword = hashPassword; + this.encryptionMap = encryptionMap; + } + + public String getName() { + return name; + } + + public String getHashPassword() { + return hashPassword; + } + + public Map getEncryptionMap() { + return encryptionMap; + } + } + public Map getEncryptionMap(String dbName) { + if (!databases.containsKey(dbName)) { + throw new IllegalArgumentException("Database does not exist: " + dbName); + } + try (FileReader reader = new FileReader(databasesFile)) { + Gson gson = new Gson(); + Map> allDatabases = gson.fromJson(reader, Map.class); + Map dbData = allDatabases.get(dbName); + return (Map) dbData.get("encryptionMap"); + } catch (IOException e) { + throw new RuntimeException("Failed to read databases file.", e); + } + } + } diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 3d406cf..92e88ec 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -1,6 +1,7 @@ package Classes; import java.io.File; +import java.util.HashMap; import java.util.Map; import java.util.Scanner; @@ -33,8 +34,12 @@ public static void main(String[] args) { // Verify the database credentials if (dbManager.verifyDatabase(dbName, inputPassword)) { System.out.println("Successfully connected to the database: " + dbName); + + // Retrieve the encryption map for the database + Map encryptionMap = dbManager.getEncryptionMap(dbName); + // Initialize the SiteManager to manage sites within the database - SiteManager siteManager = new SiteManager(new File(dbName + ".json")); + SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap); siteManager.manageSites(scanner); // Begin managing sites } else { System.out.println("Incorrect database name or password."); // Error message for invalid credentials @@ -58,14 +63,55 @@ else if (dbChoice == 2) { : PasswordUtils.generateRandomPassword(12); // Generate a random password System.out.println("Generated password: " + password); - // Create the new database with the given name and password - dbManager.createDatabase(dbName, password); + + // Ask the user for encryption methods + Map encryptionMap = new HashMap<>(); + boolean addMoreEncryptions = true; + + while (addMoreEncryptions) { + System.out.println("Choose an encryption method:"); + System.out.println("1. RotX"); + System.out.println("2. RC4"); + System.out.println("3. Vigenere"); + System.out.println("4. Polybios"); + System.out.println("5. Done adding encryptions"); + + int encryptionChoice = scanner.nextInt(); + scanner.nextLine(); // Consume newline character + + switch (encryptionChoice) { + case 1 -> { + System.out.println("Enter the shift value for RotX:"); + String shiftValue = scanner.nextLine(); + encryptionMap.put("RotX", shiftValue); + } + case 2 -> { + System.out.println("Enter the key for RC4:"); + String rc4Key = scanner.nextLine(); + encryptionMap.put("RC4", rc4Key); + } + case 3 -> { + System.out.println("Enter the key for Vigenere:"); + String vigenereKey = scanner.nextLine(); + encryptionMap.put("Vigenere", vigenereKey); + } + case 4 -> { + encryptionMap.put("Polybios", "default"); // No specific input for Polybios in this example + } + case 5 -> addMoreEncryptions = false; + default -> System.out.println("Invalid choice. Please choose a valid encryption method."); + } + } + + // Create the new database with the given name, password, and encryption map + dbManager.createDatabase(dbName, password, encryptionMap); + // Initialize the SiteManager for the new database - SiteManager siteManager = new SiteManager(new File(dbName + ".json")); + SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap); siteManager.manageSites(scanner); // Begin managing sites } // Handle the case where the user wants to access the help menu - else if (dbChoice == 3){ + else if (dbChoice == 3) { HelpMenu.displayMenuHelp(scanner); // Display the help menu } // Handle invalid choices diff --git a/src/Classes/SiteManager.java b/src/Classes/SiteManager.java index a5e8bcc..e055fb5 100644 --- a/src/Classes/SiteManager.java +++ b/src/Classes/SiteManager.java @@ -12,9 +12,11 @@ public class SiteManager { private final File dbFile; private final List> sites; + private final Map encryptionMap; // Méthodes de chiffrement associées - public SiteManager(File dbFile) { + public SiteManager(File dbFile, Map encryptionMap) { this.dbFile = dbFile; + this.encryptionMap = encryptionMap; this.sites = loadSites(); } @@ -24,7 +26,8 @@ public void manageSites(Scanner scanner) { System.out.println("1. Add a site"); System.out.println("2. Modify a site"); System.out.println("3. Delete a site"); - System.out.println("4. Exit"); + System.out.println("4. Display all sites"); + System.out.println("5. Exit"); int choice = scanner.nextInt(); scanner.nextLine(); @@ -32,14 +35,19 @@ public void manageSites(Scanner scanner) { case 1 -> addSite(scanner); case 2 -> modifySite(scanner); case 3 -> deleteSite(scanner); - case 4 -> { return; } + case 4 -> displaySites(); + case 5 -> { return; } default -> System.out.println("Invalid choice."); } } } public void addSite(String siteName, String username, String password) { - Map site = Map.of("siteName", siteName, "username", username, "password", password); + Map site = Map.of( + "siteName", siteName, + "username", username, + "password", password + ); sites.add(site); saveSites(); } @@ -63,12 +71,10 @@ public void modifySite(String siteName, String newUsername, String newPassword) if (newPassword != null && !newPassword.isEmpty()) { site.put("password", newPassword); } - System.out.println("Modified site: " + site); saveSites(); return; } } - System.out.println("Site not found for modification: " + siteName); throw new IllegalArgumentException("Site not found: " + siteName); } @@ -82,7 +88,6 @@ public void modifySite(Scanner scanner) { modifySite(siteName, newUsername, newPassword); } - public void deleteSite(String siteName) { sites.removeIf(site -> site.get("siteName").equals(siteName)); saveSites(); @@ -94,25 +99,73 @@ public void deleteSite(Scanner scanner) { deleteSite(siteName); } + public void displaySites() { + if (sites.isEmpty()) { + System.out.println("No sites available."); + } else { + for (Map site : sites) { + String siteName = site.get("siteName"); + String username = site.get("username"); + String password = site.get("password"); + System.out.println("Site Name: " + siteName); + System.out.println("Username: " + username); + System.out.println("Password: " + password); + System.out.println("-----------------------------"); + } + } + } public List> loadSites() { if (!dbFile.exists()) return new ArrayList<>(); try (FileReader reader = new FileReader(dbFile)) { + // Lire le fichier et déchiffrer son contenu + StringBuilder encryptedContent = new StringBuilder(); + int c; + while ((c = reader.read()) != -1) { + encryptedContent.append((char) c); + } + + // Déchiffrement du contenu entier + String decryptedContent = decrypt(encryptedContent.toString()); + Gson gson = new Gson(); - Map data = gson.fromJson(reader, Map.class); + Map data = gson.fromJson(decryptedContent, Map.class); return (List>) data.get("sites"); } catch (IOException e) { + e.printStackTrace(); return new ArrayList<>(); } } public void saveSites() { try (FileWriter writer = new FileWriter(dbFile)) { + // Conversion des sites en JSON Gson gson = new GsonBuilder().setPrettyPrinting().create(); Map data = Map.of("sites", sites); - gson.toJson(data, writer); + String jsonContent = gson.toJson(data); + + // Chiffrer le contenu JSON + String encryptedContent = encrypt(jsonContent); + + writer.write(encryptedContent); } catch (IOException e) { e.printStackTrace(); } } + + private String encrypt(String input) { + if (encryptionMap.containsKey("RotX")) { + int shift = Integer.parseInt(encryptionMap.get("RotX")); + return ROTX.encryptROT(input, shift); + } + return input; + } + + private String decrypt(String input) { + if (encryptionMap.containsKey("RotX")) { + int shift = Integer.parseInt(encryptionMap.get("RotX")); + return ROTX.decryptROT(input, shift); + } + return input; + } } diff --git a/src/Tests/assets/test_databases.json b/src/Tests/assets/test_databases.json index ab6298e..7a73a41 100644 --- a/src/Tests/assets/test_databases.json +++ b/src/Tests/assets/test_databases.json @@ -1,3 +1,2 @@ { - "duplicateDb": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" } \ No newline at end of file diff --git a/src/Tests/assets/test_sites.json b/src/Tests/assets/test_sites.json deleted file mode 100644 index 0f07589..0000000 --- a/src/Tests/assets/test_sites.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sites": [] -} \ No newline at end of file From c1b26fbd001c8b0631c83b6969f0c02d58a0b423 Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:09:01 +0100 Subject: [PATCH 70/77] Add multi encryption add possibility for multiple encryption and add tests for siteManager encrypt and decrypt --- databases.json | 2 - src/Classes/DatabasesManager.java | 3 +- src/Classes/Menu.java | 2 +- src/Classes/SiteManager.java | 68 +++++++++++++---- src/Tests/DatabasesManagerTest.java | 105 ++++++++++++++++++++------- src/Tests/SiteManagerTest.java | 80 +++++++++++++------- src/Tests/assets/test_databases.json | 2 - 7 files changed, 190 insertions(+), 72 deletions(-) delete mode 100644 src/Tests/assets/test_databases.json diff --git a/databases.json b/databases.json index 3beee54..7a73a41 100644 --- a/databases.json +++ b/databases.json @@ -1,4 +1,2 @@ { - - } \ No newline at end of file diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index 64f5fde..35e22c0 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -19,7 +19,7 @@ public class DatabasesManager { public DatabasesManager(File databasesFile) { this.databasesFile = databasesFile; - this.databases = loadDatabases(); + this.databases = loadDatabases() != null ? loadDatabases() : new HashMap<>(); } public boolean verifyDatabase(String dbName, String password) { @@ -51,6 +51,7 @@ private Map loadDatabases() { } } + private void saveDatabases() { try (FileWriter writer = new FileWriter(databasesFile)) { Gson gson = new GsonBuilder().setPrettyPrinting().create(); diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 92e88ec..4be04d6 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -96,7 +96,7 @@ else if (dbChoice == 2) { encryptionMap.put("Vigenere", vigenereKey); } case 4 -> { - encryptionMap.put("Polybios", "default"); // No specific input for Polybios in this example + encryptionMap.put("Polybios", "default"); } case 5 -> addMoreEncryptions = false; default -> System.out.println("Invalid choice. Please choose a valid encryption method."); diff --git a/src/Classes/SiteManager.java b/src/Classes/SiteManager.java index e055fb5..718c67a 100644 --- a/src/Classes/SiteManager.java +++ b/src/Classes/SiteManager.java @@ -43,11 +43,10 @@ public void manageSites(Scanner scanner) { } public void addSite(String siteName, String username, String password) { - Map site = Map.of( - "siteName", siteName, - "username", username, - "password", password - ); + Map site = new HashMap<>(); + site.put("siteName", siteName); + site.put("username", username); + site.put("password", password); sites.add(site); saveSites(); } @@ -154,18 +153,61 @@ public void saveSites() { } private String encrypt(String input) { - if (encryptionMap.containsKey("RotX")) { - int shift = Integer.parseInt(encryptionMap.get("RotX")); - return ROTX.encryptROT(input, shift); + String result = input; + for (String method : encryptionMap.keySet()) { + switch (method) { + case "RotX" -> { + int shift = Integer.parseInt(encryptionMap.get("RotX")); + result = ROTX.encryptROT(result, shift); + } + case "RC4" -> { + RC4 rc4 = new RC4(); + String key = encryptionMap.get("RC4"); + rc4.init(key); + result = rc4.encrypt(result); + } + case "Vigenere" -> { + String key = encryptionMap.get("Vigenere"); + result = VigenereAlgo.encrypt(result, key); + } + case "Polybios" -> { + } + case "AES" -> { + } + } } - return input; + return result; } private String decrypt(String input) { - if (encryptionMap.containsKey("RotX")) { - int shift = Integer.parseInt(encryptionMap.get("RotX")); - return ROTX.decryptROT(input, shift); + String result = input; + // Inverser l'ordre des méthodes pour le déchiffrement + List methods = new ArrayList<>(encryptionMap.keySet()); + Collections.reverse(methods); + + for (String method : methods) { + switch (method) { + case "RotX" -> { + int shift = Integer.parseInt(encryptionMap.get("RotX")); + result = ROTX.decryptROT(result, shift); + } + case "RC4" -> { + RC4 rc4 = new RC4(); + String key = encryptionMap.get("RC4"); + rc4.init(key); + result = rc4.decrypt(result); + } + case "Vigenere" -> { + String key = encryptionMap.get("Vigenere"); + result = VigenereAlgo.decrypt(result, key); + } + case "Polybios" -> { + } + case "AES" -> { + } + } } - return input; + return result; } + } diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java index b2f098b..b4d837e 100644 --- a/src/Tests/DatabasesManagerTest.java +++ b/src/Tests/DatabasesManagerTest.java @@ -1,58 +1,109 @@ package Tests; import Classes.DatabasesManager; -import org.junit.Before; -import org.junit.Test; +import Classes.Sha256; +import org.junit.*; +import static org.junit.Assert.*; import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; import java.util.Map; -import static org.junit.Assert.*; - public class DatabasesManagerTest { - private DatabasesManager dbManager; - private File testFile; + + private static File testFile; + private DatabasesManager manager; + + @BeforeClass + public static void setUpBeforeClass() throws IOException { + testFile = new File("testDatabases.json"); + if (testFile.exists()) { + testFile.delete(); + } + testFile.createNewFile(); + } + + @AfterClass + public static void tearDownAfterClass() { + if (testFile.exists()) { + testFile.delete(); + } + } @Before public void setUp() { - testFile = new File("src/Tests/assets/test_databases.json"); - dbManager = new DatabasesManager(testFile); + manager = new DatabasesManager(testFile); + } + @After + public void tearDown() { if (testFile.exists()) { testFile.delete(); } } @Test - public void testCreateAndVerifyDatabase() { - String dbName = "testDb"; - String password = "securePassword"; + public void testCreateDatabase() { + String dbName = "TestDB"; + String password = "password123"; + Map encryptionMap = new HashMap<>(); + encryptionMap.put("key1", "value1"); + + manager.createDatabase(dbName, password, encryptionMap); - dbManager.createDatabase(dbName, password); + assertTrue(manager.verifyDatabase(dbName, password)); + assertEquals(encryptionMap, manager.getEncryptionMap(dbName)); + } - assertTrue(dbManager.verifyDatabase(dbName, password)); + @Test(expected = IllegalArgumentException.class) + public void testCreateDatabaseDuplicate() { + String dbName = "TestDB"; + String password = "password123"; + Map encryptionMap = new HashMap<>(); - assertFalse(dbManager.verifyDatabase(dbName, "wrongPassword")); + manager.createDatabase(dbName, password, encryptionMap); + manager.createDatabase(dbName, password, encryptionMap); } @Test - public void testDuplicateDatabaseName() { - String dbName = "duplicateDb"; - String password = "password"; + public void testVerifyDatabase() { + String dbName = "TestDB"; + String password = "password123"; + Map encryptionMap = new HashMap<>(); - dbManager.createDatabase(dbName, password); + manager.createDatabase(dbName, password, encryptionMap); - try { - dbManager.createDatabase(dbName, password); - fail("Expected IllegalArgumentException for duplicate database name"); - } catch (IllegalArgumentException e) { - assertEquals("Database already exists.", e.getMessage()); - } + assertTrue(manager.verifyDatabase(dbName, password)); + assertFalse(manager.verifyDatabase(dbName, "wrongPassword")); + assertFalse(manager.verifyDatabase("NonExistentDB", password)); } @Test - public void testLoadEmptyDatabases() { - Map databases = dbManager.loadDatabases(); - assertTrue(databases.isEmpty()); + public void testLoadDatabases() throws IOException { + // Pre-populate the test file with data + String dbName = "TestDB"; + Sha256 sha256 = new Sha256(); + String passwordHash = sha256 .calculateHash("password123"); + Map encryptionMap = new HashMap<>(); + encryptionMap.put("key1", "value1"); + + Map preloadedData = new HashMap<>(); + preloadedData.put(dbName, new DatabasesManager.Database(dbName, passwordHash, encryptionMap)); + + try (FileWriter writer = new FileWriter(testFile)) { + writer.write(new com.google.gson.GsonBuilder().setPrettyPrinting().create().toJson(preloadedData)); + } + + manager = new DatabasesManager(testFile); + + assertTrue(manager.verifyDatabase(dbName, "password123")); + assertEquals(encryptionMap, manager.getEncryptionMap(dbName)); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetEncryptionMapForNonExistentDatabase() { + manager.getEncryptionMap("NonExistentDB"); } } diff --git a/src/Tests/SiteManagerTest.java b/src/Tests/SiteManagerTest.java index 8dc1e9a..7401f95 100644 --- a/src/Tests/SiteManagerTest.java +++ b/src/Tests/SiteManagerTest.java @@ -1,61 +1,89 @@ -package Tests; - -import Classes.SiteManager; -import org.junit.Before; -import org.junit.Test; +package Classes; +import org.junit.*; import java.io.File; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.junit.Assert.*; public class SiteManagerTest { + + private File tempFile; private SiteManager siteManager; - private File testFile; @Before public void setUp() { - testFile = new File("src/Tests/assets/test_sites.json"); - siteManager = new SiteManager(testFile); + tempFile = new File("test_db.json"); + Map encryptionMap = Map.of("RotX", "3"); // Exemple de méthode de chiffrement + siteManager = new SiteManager(tempFile, encryptionMap); + } - if (testFile.exists()) { - testFile.delete(); + @After + public void tearDown() { + if (tempFile.exists()) { + tempFile.delete(); } } @Test public void testAddSite() { - siteManager.addSite("example.com", "user1", "password1"); - List> sites = siteManager.loadSites(); + siteManager.addSite("example.com", "user123", "pass123"); + List> sites = siteManager.loadSites(); assertEquals(1, sites.size()); - assertEquals("example.com", sites.get(0).get("siteName")); - assertEquals("user1", sites.get(0).get("username")); - assertEquals("password1", sites.get(0).get("password")); + + Map site = sites.get(0); + assertEquals("example.com", site.get("siteName")); + assertEquals("user123", site.get("username")); + assertEquals("pass123", site.get("password")); } @Test public void testModifySite() { - siteManager.modifySite("example.com", "newUser", "newPassword"); + siteManager.addSite("example.com", "user123", "pass123"); + siteManager.modifySite("example.com", "newUser", "newPass"); List> sites = siteManager.loadSites(); - - System.out.println("Sites after modification: " + sites); - assertEquals(1, sites.size()); - assertEquals("newUser", sites.get(0).get("username")); - assertEquals("newPassword", sites.get(0).get("password")); - } + Map site = sites.get(0); + assertEquals("example.com", site.get("siteName")); + assertEquals("newUser", site.get("username")); + assertEquals("newPass", site.get("password")); + } @Test public void testDeleteSite() { - siteManager.addSite("example.com", "user1", "password1"); + siteManager.addSite("example.com", "user123", "pass123"); siteManager.deleteSite("example.com"); List> sites = siteManager.loadSites(); - assertTrue(sites.isEmpty()); } + + @Test + public void testLoadSites() { + siteManager.addSite("example.com", "user123", "pass123"); + siteManager.addSite("test.com", "testUser", "testPass"); + + List> sites = siteManager.loadSites(); + assertEquals(2, sites.size()); + + Map site1 = sites.get(0); + Map site2 = sites.get(1); + + assertEquals("example.com", site1.get("siteName")); + assertEquals("user123", site1.get("username")); + assertEquals("pass123", site1.get("password")); + + assertEquals("test.com", site2.get("siteName")); + assertEquals("testUser", site2.get("username")); + assertEquals("testPass", site2.get("password")); + } + + @Test + public void testDisplaySites() { + siteManager.addSite("example.com", "user123", "pass123"); + siteManager.addSite("test.com", "testUser", "testPass"); + } } diff --git a/src/Tests/assets/test_databases.json b/src/Tests/assets/test_databases.json deleted file mode 100644 index 7a73a41..0000000 --- a/src/Tests/assets/test_databases.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file From 733f4d90ba9cba6ad84e90922b9d786dfc12ee51 Mon Sep 17 00:00:00 2001 From: Nabil Date: Fri, 20 Dec 2024 09:27:38 +0100 Subject: [PATCH 71/77] fix : make the menu go back --- src/Classes/HelpMenu.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Classes/HelpMenu.java b/src/Classes/HelpMenu.java index a527dcc..807028c 100644 --- a/src/Classes/HelpMenu.java +++ b/src/Classes/HelpMenu.java @@ -42,6 +42,7 @@ public static void displayMenuHelp(Scanner scanner) { break; case 6: System.out.println("Exiting help menu..."); // Exit message. + Menu.main(null); // Return to the main menu. break; default: System.out.println("Invalid choice. Please select a valid option."); // Handle invalid input. From 9ab4b1ddeac19a8e031a9b54dc20ef4fb8708464 Mon Sep 17 00:00:00 2001 From: Nabil Date: Fri, 20 Dec 2024 09:27:57 +0100 Subject: [PATCH 72/77] chore : added decode image with an already existing image --- src/Tests/SteganographyImageTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Tests/SteganographyImageTest.java b/src/Tests/SteganographyImageTest.java index 7f322b3..c0434b9 100644 --- a/src/Tests/SteganographyImageTest.java +++ b/src/Tests/SteganographyImageTest.java @@ -12,6 +12,7 @@ public class SteganographyImageTest { private static final String IMAGE_PATH = "src/Tests/assets/image.png"; private static final String IMAGE_PATH_SMALLEST_PNG = "src/Tests/assets/world_smallest.png"; + private static final String IMAGE_ENCODED_PATH = "src/Tests/assets/image_encoded.png"; @Test public void testEncodeDecode() throws IOException { @@ -22,6 +23,13 @@ public void testEncodeDecode() throws IOException { assertEquals(message, decodedMessage); } + @Test + public void testDecodeImage() { + Image image = new Image(IMAGE_ENCODED_PATH); + String message = image.decode(); + assertEquals("Hello", message); + } + @Test public void testEncodeMessageTooLarge() { Image image = new Image(IMAGE_PATH_SMALLEST_PNG); From 117de6cc60b6d1a31de7c6fde4bd48f9f37b122b Mon Sep 17 00:00:00 2001 From: Paul Rivallin <99149335+Roronoatii@users.noreply.github.com> Date: Fri, 20 Dec 2024 10:37:15 +0100 Subject: [PATCH 73/77] Refacto sitemanager and databasesmanager add comments and refacto for better lisibility --- src/Classes/DatabasesManager.java | 20 +++++++------ src/Classes/Menu.java | 12 ++++---- src/Classes/PasswordUtils.java | 2 +- src/Classes/SiteManager.java | 49 +++++++++++++++++++------------ 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index 35e22c0..d89b01b 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -21,22 +21,23 @@ public DatabasesManager(File databasesFile) { this.databasesFile = databasesFile; this.databases = loadDatabases() != null ? loadDatabases() : new HashMap<>(); } - + //Verify the hashed password with the password entered by the user public boolean verifyDatabase(String dbName, String password) { if (!databases.containsKey(dbName)) return false; Database database = databases.get(dbName); String hashedPassword = sha256.calculateHash(password); return database.getHashPassword().equals(hashedPassword); } - + //create database object with user inputs public void createDatabase(String dbName, String password, Map encryptionMap) { if (databases.containsKey(dbName)) { throw new IllegalArgumentException("Database already exists."); } String hashedPassword = sha256.calculateHash(password); Database newDatabase = new Database(dbName, hashedPassword, encryptionMap); - databases.put(dbName, newDatabase); - saveDatabases(); + databases.put(dbName, newDatabase); //add the dbname and the db object to a map + + saveDatabases();//save the map } private Map loadDatabases() { @@ -61,7 +62,7 @@ private void saveDatabases() { } } - // Classe interne représentant une base de données + // class database to make the database manager easy to use public static class Database { private final String name; private final String hashPassword; @@ -85,15 +86,16 @@ public Map getEncryptionMap() { return encryptionMap; } } + //method to get the encryption map for the encryption and decryption during the database user selection public Map getEncryptionMap(String dbName) { - if (!databases.containsKey(dbName)) { + if (!databases.containsKey(dbName)) { // if the database name doesn't exist throw new IllegalArgumentException("Database does not exist: " + dbName); } try (FileReader reader = new FileReader(databasesFile)) { Gson gson = new Gson(); - Map> allDatabases = gson.fromJson(reader, Map.class); - Map dbData = allDatabases.get(dbName); - return (Map) dbData.get("encryptionMap"); + Map> allDatabases = gson.fromJson(reader, Map.class); //get all the databases info from databases.json + Map dbData = allDatabases.get(dbName); //get the wanted database + return (Map) dbData.get("encryptionMap"); // get all the encryption methods from the current database } catch (IOException e) { throw new RuntimeException("Failed to read databases file.", e); } diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 4be04d6..32c736b 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -68,7 +68,7 @@ else if (dbChoice == 2) { Map encryptionMap = new HashMap<>(); boolean addMoreEncryptions = true; - while (addMoreEncryptions) { + while (addMoreEncryptions) { //ask user what encryption method he wants to use System.out.println("Choose an encryption method:"); System.out.println("1. RotX"); System.out.println("2. RC4"); @@ -80,25 +80,25 @@ else if (dbChoice == 2) { scanner.nextLine(); // Consume newline character switch (encryptionChoice) { - case 1 -> { + case 1 -> { //case rotX ask value for future executions System.out.println("Enter the shift value for RotX:"); String shiftValue = scanner.nextLine(); encryptionMap.put("RotX", shiftValue); } - case 2 -> { + case 2 -> {//case rc4 ask value for future executions System.out.println("Enter the key for RC4:"); String rc4Key = scanner.nextLine(); encryptionMap.put("RC4", rc4Key); } - case 3 -> { + case 3 -> {//case vigenere ask value for future execution System.out.println("Enter the key for Vigenere:"); String vigenereKey = scanner.nextLine(); encryptionMap.put("Vigenere", vigenereKey); } - case 4 -> { + case 4 -> {//case vigenere ask value for future execution encryptionMap.put("Polybios", "default"); } - case 5 -> addMoreEncryptions = false; + case 5 -> addMoreEncryptions = false;//leave the encryptions chain default -> System.out.println("Invalid choice. Please choose a valid encryption method."); } } diff --git a/src/Classes/PasswordUtils.java b/src/Classes/PasswordUtils.java index d410d1c..71a5283 100644 --- a/src/Classes/PasswordUtils.java +++ b/src/Classes/PasswordUtils.java @@ -11,7 +11,7 @@ public static String generateRandomPassword(int length) { Random random = new Random(); StringBuilder password = new StringBuilder(); for (int i = 0; i < length; i++) { - password.append(chars.charAt(random.nextInt(chars.length()))); + password.append(chars.charAt(random.nextInt(chars.length()))); // generate random password in range chars, from random int } return password.toString(); } diff --git a/src/Classes/SiteManager.java b/src/Classes/SiteManager.java index 718c67a..46061dd 100644 --- a/src/Classes/SiteManager.java +++ b/src/Classes/SiteManager.java @@ -15,12 +15,12 @@ public class SiteManager { private final Map encryptionMap; // Méthodes de chiffrement associées public SiteManager(File dbFile, Map encryptionMap) { - this.dbFile = dbFile; - this.encryptionMap = encryptionMap; + this.dbFile = dbFile; //file name + this.encryptionMap = encryptionMap;// encryption method with parameter needed this.sites = loadSites(); } - public void manageSites(Scanner scanner) { + public void manageSites(Scanner scanner) { //methods to ask user what method he will call while (true) { System.out.println("Choose an action:"); System.out.println("1. Add a site"); @@ -31,7 +31,7 @@ public void manageSites(Scanner scanner) { int choice = scanner.nextInt(); scanner.nextLine(); - switch (choice) { + switch (choice) { //calls method based on the user input case 1 -> addSite(scanner); case 2 -> modifySite(scanner); case 3 -> deleteSite(scanner); @@ -42,7 +42,7 @@ public void manageSites(Scanner scanner) { } } - public void addSite(String siteName, String username, String password) { + public void addSite(String siteName, String username, String password) {//add method use for applying value from scanner method and for the test file Map site = new HashMap<>(); site.put("siteName", siteName); site.put("username", username); @@ -51,7 +51,7 @@ public void addSite(String siteName, String username, String password) { saveSites(); } - public void addSite(Scanner scanner) { + public void addSite(Scanner scanner) { //add site in the selected json System.out.println("Enter site name:"); String siteName = scanner.nextLine(); System.out.println("Enter username:"); @@ -61,7 +61,7 @@ public void addSite(Scanner scanner) { addSite(siteName, username, password); } - public void modifySite(String siteName, String newUsername, String newPassword) { + public void modifySite(String siteName, String newUsername, String newPassword) { //modify method use for applying value from scanner method and for the test file for (Map site : sites) { if (site.get("siteName").equals(siteName)) { if (newUsername != null && !newUsername.isEmpty()) { @@ -77,7 +77,7 @@ public void modifySite(String siteName, String newUsername, String newPassword) throw new IllegalArgumentException("Site not found: " + siteName); } - public void modifySite(Scanner scanner) { + public void modifySite(Scanner scanner) { //modify the selected site from the selected json System.out.println("Enter the site name to modify:"); String siteName = scanner.nextLine(); System.out.println("Enter the new username (leave empty to keep current):"); @@ -87,18 +87,18 @@ public void modifySite(Scanner scanner) { modifySite(siteName, newUsername, newPassword); } - public void deleteSite(String siteName) { + public void deleteSite(String siteName) { //delete method use for the test file sites.removeIf(site -> site.get("siteName").equals(siteName)); saveSites(); } - public void deleteSite(Scanner scanner) { + public void deleteSite(Scanner scanner) { //delete the selected site from the selected json System.out.println("Enter the site name to delete:"); String siteName = scanner.nextLine(); deleteSite(siteName); } - public void displaySites() { + public void displaySites() { // displays all sites from selected json if (sites.isEmpty()) { System.out.println("No sites available."); } else { @@ -117,14 +117,14 @@ public void displaySites() { public List> loadSites() { if (!dbFile.exists()) return new ArrayList<>(); try (FileReader reader = new FileReader(dbFile)) { - // Lire le fichier et déchiffrer son contenu + // read file and decrypt StringBuilder encryptedContent = new StringBuilder(); int c; while ((c = reader.read()) != -1) { encryptedContent.append((char) c); } - // Déchiffrement du contenu entier + // decrypt the file content String decryptedContent = decrypt(encryptedContent.toString()); Gson gson = new Gson(); @@ -138,12 +138,12 @@ public List> loadSites() { public void saveSites() { try (FileWriter writer = new FileWriter(dbFile)) { - // Conversion des sites en JSON + // convert sites into java json file Gson gson = new GsonBuilder().setPrettyPrinting().create(); Map data = Map.of("sites", sites); String jsonContent = gson.toJson(data); - // Chiffrer le contenu JSON + // crypt json content String encryptedContent = encrypt(jsonContent); writer.write(encryptedContent); @@ -154,20 +154,26 @@ public void saveSites() { private String encrypt(String input) { String result = input; + //all case for all encryption methods for (String method : encryptionMap.keySet()) { switch (method) { case "RotX" -> { - int shift = Integer.parseInt(encryptionMap.get("RotX")); + //rotx encryption + int shift = Integer.parseInt(encryptionMap.get("RotX")); //get encryption value from the encryption map from databases.json result = ROTX.encryptROT(result, shift); } case "RC4" -> { + //rc4 encryption + RC4 rc4 = new RC4(); - String key = encryptionMap.get("RC4"); + String key = encryptionMap.get("RC4");//get encryption value from the encryption map from databases.json rc4.init(key); result = rc4.encrypt(result); } case "Vigenere" -> { - String key = encryptionMap.get("Vigenere"); + //vigenere encryption + + String key = encryptionMap.get("Vigenere");//get encryption value from the encryption map from databases.json result = VigenereAlgo.encrypt(result, key); } case "Polybios" -> { @@ -181,23 +187,28 @@ private String encrypt(String input) { private String decrypt(String input) { String result = input; - // Inverser l'ordre des méthodes pour le déchiffrement + // invert encryption order to handle the multiple encryption List methods = new ArrayList<>(encryptionMap.keySet()); Collections.reverse(methods); for (String method : methods) { switch (method) { case "RotX" -> { + //decrypt json content from databases RotX encryptionmethod int shift = Integer.parseInt(encryptionMap.get("RotX")); result = ROTX.decryptROT(result, shift); } case "RC4" -> { + //decrypt json content from databases RC4 encryptionmethod + RC4 rc4 = new RC4(); String key = encryptionMap.get("RC4"); rc4.init(key); result = rc4.decrypt(result); } case "Vigenere" -> { + //decrypt json content from databases Vigenere encryptionmethod + String key = encryptionMap.get("Vigenere"); result = VigenereAlgo.decrypt(result, key); } From 75e5f84c5ea1441b7dc8b58e872cd7a449cd399b Mon Sep 17 00:00:00 2001 From: Nabil Date: Fri, 20 Dec 2024 11:26:26 +0100 Subject: [PATCH 74/77] chore : added build info for building --- .idea/artifacts/ByteWarden_jar.xml | 152 +++++++++++++++++++++++++++++ src/META-INF/MANIFEST.MF | 4 + 2 files changed, 156 insertions(+) create mode 100644 .idea/artifacts/ByteWarden_jar.xml create mode 100644 src/META-INF/MANIFEST.MF diff --git a/.idea/artifacts/ByteWarden_jar.xml b/.idea/artifacts/ByteWarden_jar.xml new file mode 100644 index 0000000..2dc119f --- /dev/null +++ b/.idea/artifacts/ByteWarden_jar.xml @@ -0,0 +1,152 @@ + + + $PROJECT_DIR$/out/artifacts/ByteWarden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c45f744 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Main-Class: Classes.Menu +Class-Path: src + From 5794ef3e6100adaeb0cdf84677f34e654ef5ac78 Mon Sep 17 00:00:00 2001 From: Nabil Date: Fri, 20 Dec 2024 11:52:29 +0100 Subject: [PATCH 75/77] feat : added animation to the menu --- src/Classes/Menu.java | 156 ++++++++++++++++++++++++++++++++---------- 1 file changed, 121 insertions(+), 35 deletions(-) diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 32c736b..016863e 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -4,16 +4,117 @@ import java.util.HashMap; import java.util.Map; import java.util.Scanner; +import java.util.Random; +import java.util.concurrent.TimeUnit; public class Menu { + private static final String[] LOGO_LINES = { + "________ ___ ___ _________ _______ ___ __ ________ ________ ________ _______ ________ ", + "|\\ __ \\ |\\ \\ / /|\\___ ___\\\\ ___ \\ |\\ \\ |\\ \\|\\ __ \\|\\ __ \\|\\ ___ \\|\\ ___ \\ |\\ ___ \\ ", + "\\ \\ \\|\\ /_ \\ \\ \\/ / ||___ \\ \\_\\ \\ __/|\\ \\ \\ \\ \\ \\ \\ \\|\\ \\ \\ \\|\\ \\ \\ \\_|\\ \\ \\ __/|\\ \\ \\\\ \\ \\ ", + " \\ \\ __ \\ \\ \\ / / \\ \\ \\ \\ \\ \\_|/_\\ \\ \\ __\\ \\ \\ \\ __ \\ \\ _ _\\ \\ \\ \\\\ \\ \\ \\_|/_\\ \\ \\\\ \\ \\ ", + " \\ \\ \\|\\ \\ \\/ / / \\ \\ \\ \\ \\ \\_|\\ \\ \\ \\|\\__\\_\\ \\ \\ \\ \\ \\ \\ \\\\ \\\\ \\ \\_\\\\ \\ \\ \\_|\\ \\ \\ \\\\ \\ \\ ", + " \\ \\_______\\__/ / / \\ \\__\\ \\ \\_______\\ \\____________\\ \\__\\ \\__\\ \\__\\\\ _\\\\ \\_______\\ \\_______\\ \\__\\\\ \\__\\", + " \\|_______|\\___/ / \\|__| \\|_______|\\|____________|\\|__|\\|__|\\|__|\\|__|\\|_______|\\|_______|\\|__| \\|__|", + " \\|___|/ " + }; + + private static void animateLogo() { + try { + // Clear console + System.out.print("\033[H\033[2J"); + System.out.flush(); + + // Create a buffer to store the current state of the logo + char[][] buffer = new char[LOGO_LINES.length][]; + for (int i = 0; i < LOGO_LINES.length; i++) { + buffer[i] = new char[LOGO_LINES[i].length()]; + for (int j = 0; j < LOGO_LINES[i].length(); j++) { + buffer[i][j] = ' '; + } + } + + // Animate each character + for (int i = 0; i < LOGO_LINES.length; i++) { + for (int j = 0; j < LOGO_LINES[i].length(); j++) { + buffer[i][j] = LOGO_LINES[i].charAt(j); + + // Clear screen and redraw the entire buffer + System.out.print("\033[H\033[2J"); + System.out.flush(); + + // Print current state of buffer + for (int k = 0; k < buffer.length; k++) { + System.out.println("\033[1;32m" + new String(buffer[k]) + "\033[0m"); + } + + TimeUnit.MILLISECONDS.sleep(1); + } + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private static void matrixRain() { + try { + String[] matrix = {"ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "タ", "チ", "ツ", "テ", "ト", "ナ", + "1", "0", "@", "#", "$", "%", "&", "*"}; + Random rand = new Random(); + + String[] buffer = new String[10]; + for (int i = 0; i < buffer.length; i++) { + buffer[i] = ""; + } + + for (int i = 0; i < 20; i++) { // Reduced iterations for faster startup + for (int j = buffer.length - 1; j > 0; j--) { + buffer[j] = buffer[j-1]; + } + + StringBuilder newLine = new StringBuilder(); + for (int j = 0; j < 50; j++) { + newLine.append(matrix[rand.nextInt(matrix.length)]).append(" "); + } + buffer[0] = newLine.toString(); + + System.out.print("\033[H\033[2J"); + System.out.flush(); + + for (String line : LOGO_LINES) { + System.out.println("\033[1;32m" + line + "\033[0m"); + } + System.out.println(); + + for (String line : buffer) { + System.out.println("\033[0;32m" + line + "\033[0m"); + } + + TimeUnit.MILLISECONDS.sleep(100); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private static void showSplashScreen() { + animateLogo(); + matrixRain(); + System.out.print("\033[H\033[2J"); // Clear screen before showing menu + System.out.flush(); + } + public static void main(String[] args) { + // Show splash screen + showSplashScreen(); + // Initialize the scanner for user input Scanner scanner = new Scanner(System.in); // Load the database file to manage existing databases File databasesFile = new File("databases.json"); DatabasesManager dbManager = new DatabasesManager(databasesFile); - // Display the main menu options + // Your existing menu code starts here System.out.println("Welcome to the Encryption/Decryption Program"); System.out.println("Choose an option:"); System.out.println("1. Choose an existing database"); @@ -24,51 +125,41 @@ public static void main(String[] args) { int dbChoice = scanner.nextInt(); scanner.nextLine(); // Consume the newline character left by nextInt - // Handle the case where the user wants to connect to an existing database if (dbChoice == 1) { System.out.println("Enter the name of the database:"); - String dbName = scanner.nextLine(); // Read the database name + String dbName = scanner.nextLine(); System.out.println("Enter the password:"); - String inputPassword = scanner.nextLine(); // Read the database password + String inputPassword = scanner.nextLine(); - // Verify the database credentials if (dbManager.verifyDatabase(dbName, inputPassword)) { System.out.println("Successfully connected to the database: " + dbName); - - // Retrieve the encryption map for the database Map encryptionMap = dbManager.getEncryptionMap(dbName); - - // Initialize the SiteManager to manage sites within the database SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap); - siteManager.manageSites(scanner); // Begin managing sites + siteManager.manageSites(scanner); } else { - System.out.println("Incorrect database name or password."); // Error message for invalid credentials + System.out.println("Incorrect database name or password."); } } - // Handle the case where the user wants to create a new database else if (dbChoice == 2) { System.out.println("Enter the name of the new database:"); - String dbName = scanner.nextLine(); // Read the new database name + String dbName = scanner.nextLine(); System.out.println("Choose a password option:"); System.out.println("1. Enter a custom password"); System.out.println("2. Generate a random password"); - // Read the user's choice for password type int passwordChoice = scanner.nextInt(); - scanner.nextLine(); // Consume the newline character left by nextInt + scanner.nextLine(); - // Determine the password based on the user's choice String password = passwordChoice == 1 - ? scanner.nextLine() // Custom password entered by user - : PasswordUtils.generateRandomPassword(12); // Generate a random password + ? scanner.nextLine() + : PasswordUtils.generateRandomPassword(12); System.out.println("Generated password: " + password); - // Ask the user for encryption methods Map encryptionMap = new HashMap<>(); boolean addMoreEncryptions = true; - while (addMoreEncryptions) { //ask user what encryption method he wants to use + while (addMoreEncryptions) { System.out.println("Choose an encryption method:"); System.out.println("1. RotX"); System.out.println("2. RC4"); @@ -77,46 +168,41 @@ else if (dbChoice == 2) { System.out.println("5. Done adding encryptions"); int encryptionChoice = scanner.nextInt(); - scanner.nextLine(); // Consume newline character + scanner.nextLine(); switch (encryptionChoice) { - case 1 -> { //case rotX ask value for future executions + case 1 -> { System.out.println("Enter the shift value for RotX:"); String shiftValue = scanner.nextLine(); encryptionMap.put("RotX", shiftValue); } - case 2 -> {//case rc4 ask value for future executions + case 2 -> { System.out.println("Enter the key for RC4:"); String rc4Key = scanner.nextLine(); encryptionMap.put("RC4", rc4Key); } - case 3 -> {//case vigenere ask value for future execution + case 3 -> { System.out.println("Enter the key for Vigenere:"); String vigenereKey = scanner.nextLine(); encryptionMap.put("Vigenere", vigenereKey); } - case 4 -> {//case vigenere ask value for future execution + case 4 -> { encryptionMap.put("Polybios", "default"); } - case 5 -> addMoreEncryptions = false;//leave the encryptions chain + case 5 -> addMoreEncryptions = false; default -> System.out.println("Invalid choice. Please choose a valid encryption method."); } } - // Create the new database with the given name, password, and encryption map dbManager.createDatabase(dbName, password, encryptionMap); - - // Initialize the SiteManager for the new database SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap); - siteManager.manageSites(scanner); // Begin managing sites + siteManager.manageSites(scanner); } - // Handle the case where the user wants to access the help menu else if (dbChoice == 3) { - HelpMenu.displayMenuHelp(scanner); // Display the help menu + HelpMenu.displayMenuHelp(scanner); } - // Handle invalid choices else { - System.out.println("Invalid choice."); // Error message for invalid input + System.out.println("Invalid choice."); } } -} +} \ No newline at end of file From c922a8a32e998aec22a6c8ed1b1ed26fc78f763f Mon Sep 17 00:00:00 2001 From: Nabil Date: Fri, 20 Dec 2024 11:52:47 +0100 Subject: [PATCH 76/77] chore : the main program executes menu --- src/Main.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Main.java b/src/Main.java index d5238c9..265783a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,7 @@ +import Classes.Menu; + public class Main { public static void main(String[] args) { - System.out.println("Hello, World!"); + Menu.main(null); } } \ No newline at end of file From e8f8eb8212c1909e11b4f218d158de15c1ed6c49 Mon Sep 17 00:00:00 2001 From: lucas Date: Fri, 20 Dec 2024 11:54:47 +0100 Subject: [PATCH 77/77] salt and pepper --- .idea/libraries/bytedeco_javacv_platform.xml | 4 +- .../fasterxml_jackson_core_databind.xml | 12 ++ ByteWarden.iml | 1 + databases.json | 16 +++ llucas.json | 9 ++ pepper.json | 3 + src/Classes/DatabasesManager.java | 31 ++++- src/Classes/Menu.java | 2 +- src/Classes/Sha256.java | 1 + src/Classes/VigenereAlgo.java | 19 ++- src/Tests/DatabasesManagerTest.java | 109 ------------------ test.json | 9 ++ 12 files changed, 97 insertions(+), 119 deletions(-) create mode 100644 .idea/libraries/fasterxml_jackson_core_databind.xml create mode 100644 llucas.json create mode 100644 pepper.json create mode 100644 test.json diff --git a/.idea/libraries/bytedeco_javacv_platform.xml b/.idea/libraries/bytedeco_javacv_platform.xml index 53085a2..9fa3834 100644 --- a/.idea/libraries/bytedeco_javacv_platform.xml +++ b/.idea/libraries/bytedeco_javacv_platform.xml @@ -19,9 +19,9 @@ - + - + diff --git a/.idea/libraries/fasterxml_jackson_core_databind.xml b/.idea/libraries/fasterxml_jackson_core_databind.xml new file mode 100644 index 0000000..142f4e6 --- /dev/null +++ b/.idea/libraries/fasterxml_jackson_core_databind.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ByteWarden.iml b/ByteWarden.iml index 13556b5..27a65dc 100644 --- a/ByteWarden.iml +++ b/ByteWarden.iml @@ -19,5 +19,6 @@ + \ No newline at end of file diff --git a/databases.json b/databases.json index 7a73a41..4cb7c65 100644 --- a/databases.json +++ b/databases.json @@ -1,2 +1,18 @@ { + "llucas": { + "name": "llucas", + "hashPassword": "eebc1115b82aea1ee598f927e19500c75d2e318eaa9d83fa5a7513e26dea608b", + "encryptionMap": { + "RotX": "12" + }, + "salt": "NTNcG1Mv\u002604K" + }, + "test": { + "name": "test", + "hashPassword": "6b3fcb519f1dac8495538eed6bf3963faf7d7a6762d6789869a2cb51a9bca91d", + "encryptionMap": { + "RotX": "12" + }, + "salt": "sP5s3cWwMsOX" + } } \ No newline at end of file diff --git a/llucas.json b/llucas.json new file mode 100644 index 0000000..e104e2e --- /dev/null +++ b/llucas.json @@ -0,0 +1,9 @@ +{ + "eufqe": [ + { + "bmeeiadp": "rlrqlr", + "eufqZmyq": "kagfgnq", + "geqdzmyq": "lplp" + } + ] +} \ No newline at end of file diff --git a/pepper.json b/pepper.json new file mode 100644 index 0000000..51db507 --- /dev/null +++ b/pepper.json @@ -0,0 +1,3 @@ +{ + "pepper": "jesuisunpoivre" +} \ No newline at end of file diff --git a/src/Classes/DatabasesManager.java b/src/Classes/DatabasesManager.java index 35e22c0..3c28709 100644 --- a/src/Classes/DatabasesManager.java +++ b/src/Classes/DatabasesManager.java @@ -1,5 +1,6 @@ package Classes; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; @@ -25,7 +26,9 @@ public DatabasesManager(File databasesFile) { public boolean verifyDatabase(String dbName, String password) { if (!databases.containsKey(dbName)) return false; Database database = databases.get(dbName); - String hashedPassword = sha256.calculateHash(password); + String pepper = readPepperFromJson("pepper.json"); + + String hashedPassword = sha256.calculateHash(database.getSalt() + password + pepper); return database.getHashPassword().equals(hashedPassword); } @@ -33,12 +36,24 @@ public void createDatabase(String dbName, String password, Map e if (databases.containsKey(dbName)) { throw new IllegalArgumentException("Database already exists."); } - String hashedPassword = sha256.calculateHash(password); - Database newDatabase = new Database(dbName, hashedPassword, encryptionMap); + String pepper = readPepperFromJson("pepper.json"); + String salt = PasswordUtils.generateRandomPassword(12); + String hashedPassword = sha256.calculateHash(salt + password + pepper); + Database newDatabase = new Database(dbName, hashedPassword, encryptionMap, salt); databases.put(dbName, newDatabase); saveDatabases(); } + private String readPepperFromJson(String filePath) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + Map jsonMap = objectMapper.readValue(new File(filePath), Map.class); + return jsonMap.get("pepper"); + } catch (IOException e) { + e.printStackTrace(); + return ""; + } + } private Map loadDatabases() { if (!databasesFile.exists()) return new HashMap<>(); try (FileReader reader = new FileReader(databasesFile)) { @@ -66,11 +81,12 @@ public static class Database { private final String name; private final String hashPassword; private final Map encryptionMap; - - public Database(String name, String hashPassword, Map encryptionMap) { + private final String salt; + public Database(String name, String hashPassword, Map encryptionMap, String salt) { this.name = name; this.hashPassword = hashPassword; this.encryptionMap = encryptionMap; + this.salt = salt; } public String getName() { @@ -84,6 +100,11 @@ public String getHashPassword() { public Map getEncryptionMap() { return encryptionMap; } + public String getSalt(){ + return salt; + } + + } public Map getEncryptionMap(String dbName) { if (!databases.containsKey(dbName)) { diff --git a/src/Classes/Menu.java b/src/Classes/Menu.java index 4be04d6..9dc206e 100644 --- a/src/Classes/Menu.java +++ b/src/Classes/Menu.java @@ -64,6 +64,7 @@ else if (dbChoice == 2) { System.out.println("Generated password: " + password); + // Ask the user for encryption methods Map encryptionMap = new HashMap<>(); boolean addMoreEncryptions = true; @@ -102,7 +103,6 @@ else if (dbChoice == 2) { default -> System.out.println("Invalid choice. Please choose a valid encryption method."); } } - // Create the new database with the given name, password, and encryption map dbManager.createDatabase(dbName, password, encryptionMap); diff --git a/src/Classes/Sha256.java b/src/Classes/Sha256.java index cce7911..b704c12 100644 --- a/src/Classes/Sha256.java +++ b/src/Classes/Sha256.java @@ -4,6 +4,7 @@ public class Sha256 extends Hash { + // function to calculate hash @Override public String calculateHash(String input) { try { diff --git a/src/Classes/VigenereAlgo.java b/src/Classes/VigenereAlgo.java index c43039e..673ba81 100644 --- a/src/Classes/VigenereAlgo.java +++ b/src/Classes/VigenereAlgo.java @@ -44,11 +44,26 @@ public static String encrypt(String plainText, String key) { // Only encrypt alphabetic characters if (Character.isLetter(pi)) { boolean isUpperCase = Character.isUpperCase(pi); - char normalizedPi = Character.toLowerCase(pi); + char normalizedPi = Character.toLowerCase(pi); // the calculations are based on lowerCase alphabet char ki = key.charAt(keyIndex++); - // Encryption formula: Ci = (Pi + Ki) mod 26 + + // encrypt formula + // normalizedPi - a : converts the character to an index between 0 and 25 (ex : normalizedPi = 'c' (ASCII 99), then 'c' - 'a' = 99-97 = 2) + // ki - 'a' similarly normalizes the key character to the same 0–25 range. + + // normalizedPi - 'a' and ki - 'a' are added together to combine the plaintext and key in the normalized alphabet range. + + // % 26 ensures the result wraps around if it exceeds 25 (e.g., for 'z'). + // Example: If normalizedPi = 'z' (25) and ki = 'y' (24), then: + // (25 + 24) % 26 = 49 % 26 = 23 (which corresponds to 'x'). + + + // + 'a' converts the normalized result (0–25) back into a valid ASCII character (alphabetical range). + // Example: If the result is 2, adding 'a' (97) gives 99, which corresponds to 'c' in ASCII. + // (char) : Casts the result back to a character char ci = (char) (((normalizedPi - 'a' + ki - 'a') % 26) + 'a'); + // + 'a' converts the normalized result (0 - 25) back into a valid ASCII character (97-122) encryptedText.append(isUpperCase ? Character.toUpperCase(ci) : ci); } else { // Keep non-alphabetic characters unchanged diff --git a/src/Tests/DatabasesManagerTest.java b/src/Tests/DatabasesManagerTest.java index b4d837e..e69de29 100644 --- a/src/Tests/DatabasesManagerTest.java +++ b/src/Tests/DatabasesManagerTest.java @@ -1,109 +0,0 @@ -package Tests; - -import Classes.DatabasesManager; -import Classes.Sha256; -import org.junit.*; -import static org.junit.Assert.*; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class DatabasesManagerTest { - - private static File testFile; - private DatabasesManager manager; - - @BeforeClass - public static void setUpBeforeClass() throws IOException { - testFile = new File("testDatabases.json"); - if (testFile.exists()) { - testFile.delete(); - } - testFile.createNewFile(); - } - - @AfterClass - public static void tearDownAfterClass() { - if (testFile.exists()) { - testFile.delete(); - } - } - - @Before - public void setUp() { - manager = new DatabasesManager(testFile); - } - - @After - public void tearDown() { - if (testFile.exists()) { - testFile.delete(); - } - } - - @Test - public void testCreateDatabase() { - String dbName = "TestDB"; - String password = "password123"; - Map encryptionMap = new HashMap<>(); - encryptionMap.put("key1", "value1"); - - manager.createDatabase(dbName, password, encryptionMap); - - assertTrue(manager.verifyDatabase(dbName, password)); - assertEquals(encryptionMap, manager.getEncryptionMap(dbName)); - } - - @Test(expected = IllegalArgumentException.class) - public void testCreateDatabaseDuplicate() { - String dbName = "TestDB"; - String password = "password123"; - Map encryptionMap = new HashMap<>(); - - manager.createDatabase(dbName, password, encryptionMap); - manager.createDatabase(dbName, password, encryptionMap); - } - - @Test - public void testVerifyDatabase() { - String dbName = "TestDB"; - String password = "password123"; - Map encryptionMap = new HashMap<>(); - - manager.createDatabase(dbName, password, encryptionMap); - - assertTrue(manager.verifyDatabase(dbName, password)); - assertFalse(manager.verifyDatabase(dbName, "wrongPassword")); - assertFalse(manager.verifyDatabase("NonExistentDB", password)); - } - - @Test - public void testLoadDatabases() throws IOException { - // Pre-populate the test file with data - String dbName = "TestDB"; - Sha256 sha256 = new Sha256(); - String passwordHash = sha256 .calculateHash("password123"); - Map encryptionMap = new HashMap<>(); - encryptionMap.put("key1", "value1"); - - Map preloadedData = new HashMap<>(); - preloadedData.put(dbName, new DatabasesManager.Database(dbName, passwordHash, encryptionMap)); - - try (FileWriter writer = new FileWriter(testFile)) { - writer.write(new com.google.gson.GsonBuilder().setPrettyPrinting().create().toJson(preloadedData)); - } - - manager = new DatabasesManager(testFile); - - assertTrue(manager.verifyDatabase(dbName, "password123")); - assertEquals(encryptionMap, manager.getEncryptionMap(dbName)); - } - - @Test(expected = IllegalArgumentException.class) - public void testGetEncryptionMapForNonExistentDatabase() { - manager.getEncryptionMap("NonExistentDB"); - } -} diff --git a/test.json b/test.json new file mode 100644 index 0000000..48f52d0 --- /dev/null +++ b/test.json @@ -0,0 +1,9 @@ +{ + "eufqe": [ + { + "bmeeiadp": "xutosh", + "eufqZmyq": "uzefm", + "geqdzmyq": "xgome" + } + ] +} \ No newline at end of file

(rRy)UfRIp!Ce3?81=Z;;@o%amfGNpx@a( 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 N002ovPDHLkV1l2cVCMh; literal 0 HcmV?d00001 diff --git a/src/Tests/assets/world_smallest.png b/src/Tests/assets/world_smallest.png new file mode 100644 index 0000000000000000000000000000000000000000..252d9502d8573d033e633f5e377d81bebf8afd36 GIT binary patch literal 67 zcmeAS@N?(olHy`uVBq!ia0vp^j35jm7|ip2ssJf2PZ!6K3dZCFAe)JSvAC2`0?1 Date: Thu, 19 Dec 2024 00:53:46 +0100 Subject: [PATCH 49/77] TODO : fix implementation of video steganography this change is here for stashing purposes --- src/Classes/Steganography/Video.java | 247 +++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 src/Classes/Steganography/Video.java diff --git a/src/Classes/Steganography/Video.java b/src/Classes/Steganography/Video.java new file mode 100644 index 0000000..b0fd249 --- /dev/null +++ b/src/Classes/Steganography/Video.java @@ -0,0 +1,247 @@ +package Classes.Steganography; + +import org.bytedeco.ffmpeg.global.avcodec; +import org.bytedeco.javacv.FFmpegFrameGrabber; +import org.bytedeco.javacv.FFmpegFrameRecorder; +import org.bytedeco.javacv.Frame; +import org.bytedeco.javacv.Java2DFrameConverter; +import org.bytedeco.ffmpeg.global.avutil; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** + * The {@code Video} class provides methods to encode and decode messages within video files using steganography. + * + *