diff --git a/get/index.html b/get/index.html deleted file mode 100644 index 4adc662..0000000 --- a/get/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CryptoSeals - Home - - - - - - -
- -
-

Welcome to CryptoSeals

-

- Dive deep, Seal your data.
-

- Click any tool in the bar on the right to start! -

- Mascotte CryptoSeals -
- - - - - \ No newline at end of file diff --git a/get/style.css b/get/style.css deleted file mode 100644 index 8e17f3d..0000000 --- a/get/style.css +++ /dev/null @@ -1,168 +0,0 @@ -/* Importiamo Inter per la massima leggibilità */ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); - -/* --- STILI BASE (DARK) --- */ -body, h1, h2, p, ul, li { margin: 0; padding: 0; } -body { - font-family: 'Inter', system-ui, -apple-system, sans-serif; - background-color: #0c1221; /* Fondo quasi nero, molto profondo */ - color: #f1f5f9; /* Testo chiaro ghiaccio */ - padding-top: 100px; - -webkit-font-smoothing: antialiased; /* Rende il font più nitido su Mac */ -} - -footer { - display: flex; - flex-wrap: wrap; - flex-direction: row; - justify-content: space-between; - font-size: 0.85em; - position: absolute; - padding-top: 1rem; - z-index: 1050; - width: 100%; - margin-top: 3rem; - background: var(--color-bg-footer); - box-shadow: inset 0 2px 5px 0 rgba(0, 0, 0, 0.16), - inset 0 2px 10px 0 rgba(0, 0, 0, 0.12); -} -footer { - display: flex; - flex-wrap: wrap; - flex-direction: row; - justify-content: space-between; - font-size: 0.85em; - position: absolute; - padding-top: 1rem; - z-index: 1050; - width: 100%; - margin-top: 3rem; - background: var(--color-bg-footer); - box-shadow: inset 0 2px 5px 0 rgba(0, 0, 0, 0.16), - inset 0 2px 10px 0 rgba(0, 0, 0, 0.12); -} -footer .copyright { - display: flex; - flex-direction: row; - justify-content: space-between; - width: 100%; - margin-top: 2rem; - padding: 1.5rem 2em; - text-align: right; - border-top: 1px solid #ffffff10; -} - -/* --- NAVBAR (EFFETTO VETRO SCURO) --- */ -.navbar { - background-color: rgba(17, 24, 39, 0.8); - backdrop-filter: blur(12px); /* Effetto vetro sfocato */ - position: fixed; - top: 0; - width: 100%; - height: 75px; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 40px; - box-sizing: border-box; - z-index: 1000; - border-bottom: 1px solid #1e293b; -} - -.nav-brand { display: flex; align-items: center; gap: 12px; font-size: 24px; font-weight: 800; color: #f1f5f9; text-decoration: none; letter-spacing: -0.5px;} -.nav-brand span { font-size: 28px; color: #0688d4; /* Accento Ciano Ghiaccio */ } - -.nav-links { list-style: none; display: flex; gap: 30px; } -.nav-links a { color: #94a3b8; text-decoration: none; font-weight: 500; font-size: 15px; transition: 0.2s;} -.nav-links a:hover, .nav-links a.active { color: #06b6d4; font-weight: 600; } - -/* --- CONTENITORE CENTRALE --- */ -.container { max-width: 1100px; margin: 0 auto 60px auto; padding: 20px; text-align: center; } -h1 { font-size: 48px; color: #f1f5f9; margin-bottom: 15px; font-weight: 900; letter-spacing: -1.5px; } -p.descrizione { font-size: 18px; color: #94a3b8; line-height: 1.6; margin-bottom: 50px; max-width: 700px; margin-left: auto; margin-right: auto;} - -/* --- SCATOLA PRINCIPALE (MODERN DARK) --- */ -.crypto-box { - background-color: #111827; /* Slate dark */ - margin: 0 auto; - padding: 50px; - border-radius: 28px; - border: 1px solid #1e293b; - box-shadow: 0 25px 50px -12px rgba(0,0,0,0.5); - text-align: left; -} - -label { font-weight: 600; color: #94a3b8; font-size: 14px; margin-bottom: 10px; display: block; text-transform: uppercase; letter-spacing: 1px; } - -/* Input, Select, Textarea (Modern Dark) */ -textarea, select { - width: 100%; - padding: 18px; - border-radius: 14px; - border: 1px solid #1e293b; - background-color: #1f2937; /* Input leggermente più chiaro */ - color: #f1f5f9; - font-family: 'Inter', system-ui, -apple-system, sans-serif; - font-size: 16px; - box-sizing: border-box; - transition: all 0.3s ease; - margin-bottom: 25px; - line-height: 1.6; -} -textarea:focus, select:focus { outline: none; border-color: #06b6d4; background-color: #111827; box-shadow: 0 0 0 4px rgba(6, 182, 212, 0.15); } -textarea { height: 180px; resize: none; } -textarea::placeholder { color: #4b5563; } - -/* --- DEFINIZIONE ANIMAZIONE PULSANTE --- */ -@keyframes glitchPulse { - 0% { border-color: #1e293b; box-shadow: 0 0 0 0 rgba(6, 182, 212, 0); } - 50% { border-color: #06b6d4; box-shadow: 0 0 15px 2px rgba(6, 182, 212, 0.3); } - 100% { border-color: #1e293b; box-shadow: 0 0 0 0 rgba(6, 182, 212, 0); } -} - -/* Applichiamo l'animazione alla casella di input principale */ -.pulse-textarea { - animation: glitchPulse 2.5s infinite ease-in-out; /* Pulsazione lenta e continua */ -} -.pulse-textarea:focus { - animation: none; /* Smette di pulsare quando ci scrivi dentro */ -} - -/* --- LAYOUT A COLONNE --- */ -.crypto-columns { - display: flex; - gap: 35px; -} - -.crypto-col { - flex: 1; - display: flex; - flex-direction: column; -} - -/* --- BOTTONI--- */ -button { - background: linear-gradient(135deg, #0891b2, #06b6d4); /* Ciano Gradient */ - color: #0b0f19; - border: none; - padding: 18px 25px; - font-size: 16px; - border-radius: 14px; - cursor: pointer; - transition: all 0.3s ease; - font-weight: 700; - width: 100%; - text-transform: uppercase; - letter-spacing: 1px; -} -button:hover { transform: translateY(-3px); box-shadow: 0 12px 25px rgba(6, 182, 212, 0.3); } -button:active { transform: translateY(-1px); } - -/* Bottone Decifra (Verde Neon) */ -.btn-green { background: linear-gradient(135deg, #059669, #10b981); color: #0b0f19;} -.btn-green:hover { box-shadow: 0 12px 25px rgba(16, 185, 129, 0.3); } - -/* Responsive */ -@media (max-width: 800px) { - .crypto-columns { flex-direction: column; gap: 0; } -} \ No newline at end of file diff --git a/src/Caesar.java b/src/main/java/com/crypto/Caesar.java similarity index 97% rename from src/Caesar.java rename to src/main/java/com/crypto/Caesar.java index a467865..e04e4ad 100644 --- a/src/Caesar.java +++ b/src/main/java/com/crypto/Caesar.java @@ -1,18 +1,18 @@ -package com.crypto; -import java.util.Scanner; -public class Caesar { - - public static void encode(Scanner sc){ - String alphabet = "abcdefghijklmnopqrstuvwxyz"; - System.out.println("Digita il testo in chiaro da cifrare:"); - String base = sc.nextLine(); - System.out.println("Digita il valore della chiave:"); - int key = sc.nextInt(); - char encoded[] = base.toCharArray(); - - for(int i = 0; i < base.length(); i++){ - encoded[i] = alphabet.charAt(alphabet.indexOf(encoded[i]) + key % 26); - } - System.out.println(encoded); - } -} +package com.crypto; +import java.util.Scanner; +public class Caesar { + + public static void encode(Scanner sc){ + String alphabet = "abcdefghijklmnopqrstuvwxyz"; + System.out.println("Digita il testo in chiaro da cifrare:"); + String base = sc.nextLine(); + System.out.println("Digita il valore della chiave:"); + int key = sc.nextInt(); + char encoded[] = base.toCharArray(); + + for(int i = 0; i < base.length(); i++){ + encoded[i] = alphabet.charAt(alphabet.indexOf(encoded[i]) + key % 26); + } + System.out.println(encoded); + } +} diff --git a/src/Main.java b/src/main/java/com/crypto/Main.java similarity index 97% rename from src/Main.java rename to src/main/java/com/crypto/Main.java index de7188f..b8e9679 100644 --- a/src/Main.java +++ b/src/main/java/com/crypto/Main.java @@ -1,140 +1,140 @@ -package com.crypto; -import java.math.BigInteger; -import java.util.Scanner; - -public class Main { - - // ───────────────────────────────────────────── - // Menu - // ───────────────────────────────────────────── - private static int scegliDimensioneChiave(Scanner scanner) { - int bits = 0; - - while (bits == 0) { - System.out.println("\nSeleziona la dimensione della chiave:"); - System.out.println(" [1] 512 bit (Solo uso didattico)"); - System.out.println(" [2] 1024 bit (Deprecata, solo test)"); - System.out.println(" [3] 2048 bit (Standard attuale)"); - System.out.println(" [4] 3072 bit (Ottimo compromesso)"); - System.out.println(" [5] 4096 bit (Alta sicurezza)"); - System.out.print("Scelta (1-5): "); - - try { - int scelta = Integer.parseInt(scanner.nextLine().trim()); - - // Assegniamo i bit in base alla scelta - switch (scelta) { - case 1 -> bits = 512; - case 2 -> bits = 1024; - case 3 -> bits = 2048; - case 4 -> bits = 3072; - case 5 -> bits = 4096; - default -> System.out.println("❌ Scelta non valida. Inserisci un numero da 1 a 5."); - } - } catch (NumberFormatException e) { - System.out.println("❌ Errore: Inserisci un numero valido."); - } - } - - System.out.println("Selezionata chiave da " + bits + " bit."); - return bits; - } - - // Main - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - - System.out.println("=========================================="); - System.out.println(" RSA CRYPTO ENGINE "); - System.out.println("=========================================="); - - // --- 1. SETUP DELLE CHIAVI --- - int dimChiave = scegliDimensioneChiave(scanner); - - System.out.println("\n⏳ Generazione delle chiavi in corso..."); - // Passiamo dimChiave / 2 come facevi prima per p e q - RSA.RSAkeys chiavi = RSA.defkeys(dimChiave / 2); - System.out.println("> Chiavi generate con successo!"); - - boolean continua = true; - - // --- CICLO PRINCIPALE --- - while (continua) { - - System.out.println("\n------------------------------------------"); - System.out.println("Cosa vuoi fare?"); - System.out.println(" [1] Cifra un numero"); - System.out.println(" [2] Cifra una stringa"); - System.out.println(" [3] Rigenera le chiavi"); - System.out.println(" [0] Esci"); - System.out.println("------------------------------------------"); - System.out.print("Scelta: "); - - int scelta = -1; - try { - scelta = Integer.parseInt(scanner.nextLine().trim()); - } catch (NumberFormatException ignored) { - } - - System.out.println(); - - switch (scelta) { - - case 1 -> { - // MODALITÀ NUMERO - System.out.print("Inserisci il numero da cifrare: "); - try { - BigInteger m = new BigInteger(scanner.nextLine().trim()); - - System.out.println("> Cifratura in corso..."); - BigInteger c = RSA.encrypt(m, chiavi.e(), chiavi.n()); - System.out.println("Cifrato:\n" + c); - - System.out.println("\n> Decifratura in corso..."); - BigInteger dec = RSA.decrypt(c, chiavi.d(), chiavi.n()); - System.out.println("Decifrato:\n" + dec); - - } catch (IllegalArgumentException ex) { - System.out.println("> Errore: Assicurati di inserire un numero valido."); - } - } - - case 2 -> { - // MODALITÀ STRINGA - System.out.print("Inserisci il testo da cifrare: "); - String input = scanner.nextLine(); - - System.out.println("> Cifratura in corso..."); - String cifrato = RSA.encrypt(input, chiavi.e(), chiavi.n()); - if (cifrato != null && !cifrato.isEmpty()) { - // 2. SOLO PER LA STAMPA: nascondiamo il binario convertendolo in Base64 - String base64 = java.util.Base64.getEncoder().encodeToString(cifrato.getBytes()); - System.out.println("Cifrato (Base64):\n" + base64); - } - - System.out.println("\n> Decifratura in corso..."); - String dec = RSA.decrypt(cifrato, chiavi.d(), chiavi.n()); - System.out.println("Decifrato:\n" + dec); - } - - case 3 -> { - // RIGENERA CHIAVI - dimChiave = scegliDimensioneChiave(scanner); - System.out.println("\n> Generazione delle chiavi in corso..."); - chiavi = RSA.defkeys(dimChiave / 2); - System.out.println("> Chiavi rigenerate con successo!"); - } - - case 0 -> { - continua = false; - System.out.println("Chiusura del motore RSA. Alla prossima!"); - } - - default -> System.out.println("> Scelta non valida, riprova."); - } - } - - scanner.close(); - } -} - +package com.crypto; +import java.math.BigInteger; +import java.util.Scanner; + +public class Main { + + // ───────────────────────────────────────────── + // Menu + // ───────────────────────────────────────────── + private static int scegliDimensioneChiave(Scanner scanner) { + int bits = 0; + + while (bits == 0) { + System.out.println("\nSeleziona la dimensione della chiave:"); + System.out.println(" [1] 512 bit (Solo uso didattico)"); + System.out.println(" [2] 1024 bit (Deprecata, solo test)"); + System.out.println(" [3] 2048 bit (Standard attuale)"); + System.out.println(" [4] 3072 bit (Ottimo compromesso)"); + System.out.println(" [5] 4096 bit (Alta sicurezza)"); + System.out.print("Scelta (1-5): "); + + try { + int scelta = Integer.parseInt(scanner.nextLine().trim()); + + // Assegniamo i bit in base alla scelta + switch (scelta) { + case 1 -> bits = 512; + case 2 -> bits = 1024; + case 3 -> bits = 2048; + case 4 -> bits = 3072; + case 5 -> bits = 4096; + default -> System.out.println("❌ Scelta non valida. Inserisci un numero da 1 a 5."); + } + } catch (NumberFormatException e) { + System.out.println("❌ Errore: Inserisci un numero valido."); + } + } + + System.out.println("Selezionata chiave da " + bits + " bit."); + return bits; + } + + // Main + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("=========================================="); + System.out.println(" RSA CRYPTO ENGINE "); + System.out.println("=========================================="); + + // --- 1. SETUP DELLE CHIAVI --- + int dimChiave = scegliDimensioneChiave(scanner); + + System.out.println("\n⏳ Generazione delle chiavi in corso..."); + // Passiamo dimChiave / 2 come facevi prima per p e q + RSA.RSAkeys chiavi = RSA.defkeys(dimChiave / 2); + System.out.println("> Chiavi generate con successo!"); + + boolean continua = true; + + // --- CICLO PRINCIPALE --- + while (continua) { + + System.out.println("\n------------------------------------------"); + System.out.println("Cosa vuoi fare?"); + System.out.println(" [1] Cifra un numero"); + System.out.println(" [2] Cifra una stringa"); + System.out.println(" [3] Rigenera le chiavi"); + System.out.println(" [0] Esci"); + System.out.println("------------------------------------------"); + System.out.print("Scelta: "); + + int scelta = -1; + try { + scelta = Integer.parseInt(scanner.nextLine().trim()); + } catch (NumberFormatException ignored) { + } + + System.out.println(); + + switch (scelta) { + + case 1 -> { + // MODALITÀ NUMERO + System.out.print("Inserisci il numero da cifrare: "); + try { + BigInteger m = new BigInteger(scanner.nextLine().trim()); + + System.out.println("> Cifratura in corso..."); + BigInteger c = RSA.encrypt(m, chiavi.e(), chiavi.n()); + System.out.println("Cifrato:\n" + c); + + System.out.println("\n> Decifratura in corso..."); + BigInteger dec = RSA.decrypt(c, chiavi.d(), chiavi.n()); + System.out.println("Decifrato:\n" + dec); + + } catch (IllegalArgumentException ex) { + System.out.println("> Errore: Assicurati di inserire un numero valido."); + } + } + + case 2 -> { + // MODALITÀ STRINGA + System.out.print("Inserisci il testo da cifrare: "); + String input = scanner.nextLine(); + + System.out.println("> Cifratura in corso..."); + String cifrato = RSA.encrypt(input, chiavi.e(), chiavi.n()); + if (cifrato != null && !cifrato.isEmpty()) { + // 2. SOLO PER LA STAMPA: nascondiamo il binario convertendolo in Base64 + String base64 = java.util.Base64.getEncoder().encodeToString(cifrato.getBytes()); + System.out.println("Cifrato (Base64):\n" + base64); + } + + System.out.println("\n> Decifratura in corso..."); + String dec = RSA.decrypt(cifrato, chiavi.d(), chiavi.n()); + System.out.println("Decifrato:\n" + dec); + } + + case 3 -> { + // RIGENERA CHIAVI + dimChiave = scegliDimensioneChiave(scanner); + System.out.println("\n> Generazione delle chiavi in corso..."); + chiavi = RSA.defkeys(dimChiave / 2); + System.out.println("> Chiavi rigenerate con successo!"); + } + + case 0 -> { + continua = false; + System.out.println("Chiusura del motore RSA. Alla prossima!"); + } + + default -> System.out.println("> Scelta non valida, riprova."); + } + } + + scanner.close(); + } +} + diff --git a/src/RSA.java b/src/main/java/com/crypto/RSA.java similarity index 97% rename from src/RSA.java rename to src/main/java/com/crypto/RSA.java index 5f3937f..9f402af 100644 --- a/src/RSA.java +++ b/src/main/java/com/crypto/RSA.java @@ -1,93 +1,93 @@ -package com.crypto; -import java.math.BigInteger; - -public class RSA { - - // Struttura che rappresenta il mazzo di chiavi che viene generato con la - // funzione defkeys() - public record RSAkeys(BigInteger n, BigInteger e, BigInteger d) {} - - static RSAkeys defkeys(int primesize) { - // Generiamo i numeri primi p e q, con la size scelta dall'utente - BigInteger p = Utilities.GenPrime(primesize); - BigInteger q = Utilities.GenPrime(primesize); - - // Rigeneriamo q se p e q sono uguali (just in case) - while (p.equals(q)) { - q = Utilities.GenPrime(primesize); - } - - // Calcoliamo n come prodotto pq - BigInteger n = p.multiply(q); - - // Calcoliamo la funzione di Eulero phi (o m) - BigInteger phi = (p.subtract(BigInteger.ONE)).multiply((q.subtract(BigInteger.ONE))); - - // Calcoliamo la chiave pubblica e, rendendola prima rispetto a phi - BigInteger e = Utilities.CalculateE(phi); - - // Stampa i risultati per il debug - System.out.println("\n--- RISULTATI GENERAZIONE ---"); - System.out.println("Bit di p generato: " + p); - System.out.println("Bit di q generato: " + q); - System.out.println("Bit del modulo n: " + n); - System.out.println("Bit di phi generato: " + phi); - System.out.println("Bit del modulo e: " + e); - - // Calcoliamo la chiave privata d (o k) - BigInteger d = e.modInverse(phi); - - return new RSAkeys(n, e, d); - } - - // ---------------------- Encrypting e Decrypting di valori numerici ---------------------------------- - - static BigInteger encrypt(BigInteger m, BigInteger e, BigInteger n) { - // Controllo vitale: m deve essere positivo e minore di n - if (m.compareTo(BigInteger.ZERO) < 0 || m.compareTo(n) >= 0) { - throw new IllegalArgumentException( - "Il messaggio deve essere positivo e minore del modulo n! - Cifratura annullata"); - } - // Cifriamo con i nostri parametri kpb(e,n) - return m.modPow(e, n); - } - - static BigInteger decrypt(BigInteger c, BigInteger d, BigInteger n) { - // Decifriamo con i nostri parametri kpb(e,n) - return c.modPow(d, n); - } - - // ---------------- Encrypting e Decrypting di valori alfanumerici --------------------------- - - static String encrypt(String input, BigInteger e, BigInteger n) { - // Calcoliamo la lunghezza dei blocchi g e la approssimiamo per difetto - // basta contare i bit necessari per rappresentare n e poi fare - 1 perchè non ci serve la precisione - int g = n.bitLength() - 1; - if (g == 8) - g = 7; - - // Conversione da stringhe a bytes( ASCII ma in decimale !) - byte[] m = input.getBytes(); - - // Conversione in Binario e unificazione in un unica stringa - String data = Utilities.BytestoBin(m); - - // Divisione del messaggio e cifratura - String res = Utilities.DivideetImpera(data,g,e,n); - return res; - } - - static String decrypt(String m, BigInteger d, BigInteger n) { - // Calcolo di z - int z = n.bitLength(); - if (n.and(n.subtract(BigInteger.ONE)).equals(BigInteger.ZERO)) - z--; // n è una potenza esatta di 2, togli 1 - // Calcolo di g - int g = n.bitLength() - 1; - if (g == 8) - g = 7; - String res = Utilities.ImperaetDivide(m, z, g, d, n); - return res.toString(); - } - +package com.crypto; +import java.math.BigInteger; + +public class RSA { + + // Struttura che rappresenta il mazzo di chiavi che viene generato con la + // funzione defkeys() + public record RSAkeys(BigInteger n, BigInteger e, BigInteger d) {} + + static RSAkeys defkeys(int primesize) { + // Generiamo i numeri primi p e q, con la size scelta dall'utente + BigInteger p = Utilities.GenPrime(primesize); + BigInteger q = Utilities.GenPrime(primesize); + + // Rigeneriamo q se p e q sono uguali (just in case) + while (p.equals(q)) { + q = Utilities.GenPrime(primesize); + } + + // Calcoliamo n come prodotto pq + BigInteger n = p.multiply(q); + + // Calcoliamo la funzione di Eulero phi (o m) + BigInteger phi = (p.subtract(BigInteger.ONE)).multiply((q.subtract(BigInteger.ONE))); + + // Calcoliamo la chiave pubblica e, rendendola prima rispetto a phi + BigInteger e = Utilities.CalculateE(phi); + + // Stampa i risultati per il debug + System.out.println("\n--- RISULTATI GENERAZIONE ---"); + System.out.println("Bit di p generato: " + p); + System.out.println("Bit di q generato: " + q); + System.out.println("Bit del modulo n: " + n); + System.out.println("Bit di phi generato: " + phi); + System.out.println("Bit del modulo e: " + e); + + // Calcoliamo la chiave privata d (o k) + BigInteger d = e.modInverse(phi); + + return new RSAkeys(n, e, d); + } + + // ---------------------- Encrypting e Decrypting di valori numerici ---------------------------------- + + static BigInteger encrypt(BigInteger m, BigInteger e, BigInteger n) { + // Controllo vitale: m deve essere positivo e minore di n + if (m.compareTo(BigInteger.ZERO) < 0 || m.compareTo(n) >= 0) { + throw new IllegalArgumentException( + "Il messaggio deve essere positivo e minore del modulo n! - Cifratura annullata"); + } + // Cifriamo con i nostri parametri kpb(e,n) + return m.modPow(e, n); + } + + static BigInteger decrypt(BigInteger c, BigInteger d, BigInteger n) { + // Decifriamo con i nostri parametri kpb(e,n) + return c.modPow(d, n); + } + + // ---------------- Encrypting e Decrypting di valori alfanumerici --------------------------- + + static String encrypt(String input, BigInteger e, BigInteger n) { + // Calcoliamo la lunghezza dei blocchi g e la approssimiamo per difetto + // basta contare i bit necessari per rappresentare n e poi fare - 1 perchè non ci serve la precisione + int g = n.bitLength() - 1; + if (g == 8) + g = 7; + + // Conversione da stringhe a bytes( ASCII ma in decimale !) + byte[] m = input.getBytes(); + + // Conversione in Binario e unificazione in un unica stringa + String data = Utilities.BytestoBin(m); + + // Divisione del messaggio e cifratura + String res = Utilities.DivideetImpera(data,g,e,n); + return res; + } + + static String decrypt(String m, BigInteger d, BigInteger n) { + // Calcolo di z + int z = n.bitLength(); + if (n.and(n.subtract(BigInteger.ONE)).equals(BigInteger.ZERO)) + z--; // n è una potenza esatta di 2, togli 1 + // Calcolo di g + int g = n.bitLength() - 1; + if (g == 8) + g = 7; + String res = Utilities.ImperaetDivide(m, z, g, d, n); + return res.toString(); + } + } \ No newline at end of file diff --git a/src/Seal.java b/src/main/java/com/crypto/Seal.java similarity index 96% rename from src/Seal.java rename to src/main/java/com/crypto/Seal.java index 58d24f6..3c8c328 100644 --- a/src/Seal.java +++ b/src/main/java/com/crypto/Seal.java @@ -1,62 +1,62 @@ -package com.crypto; -import io.javalin.Javalin; - -public class Seal { - - // Il mazzo di chiavi !! - public static RSA.RSAkeys keys; - public static void main(String[] args) { - - // Avvio del server web - Javalin app = Javalin.create(config -> { - config.staticFiles.add("/get"); - }).start(8080); - - - System.out.println("⏳ Generazione chiavi RSA per il server web in corso..."); - - // Cifratura con Cifrario di Cesare - app.post("/seal/caesar/encrypt", ctx -> { - - } - - ); - - // Decifratura con Cifrario di Vigenere - app.post("/seal/vigenere/encrypt", ctx -> { - - } - - ); - - // Cifratura con RSA - app.post("/seal/rsa/encrypt", ctx -> { - // Legge i dati nel body dalla richiesta - Richiesta req = ctx.bodyAsClass(Richiesta.class); - keys = RSA.defkeys(req.keysize / 2); - String ciphertext = RSA.encrypt(req.text,keys.e(), keys.n()); - ctx.result(ciphertext); - }); - - // Decifratura con RSA - app.post("/seal/rsa/decrypt", ctx -> { - // Legge i dati nel body dalla richiesta - Richiesta req = ctx.bodyAsClass(Richiesta.class); - - // Usa il metodo RSA per cifrare - String plaintext = RSA.decrypt(req.text, keys.d(), keys.n()); - - // Restituisce il risultato della cifratura - ctx.result(plaintext.replaceAll("\\\\u0000", "")); - }); - } -} - -// Classe utilizzata per tradurre il JSON - Rappresenta l'oggetto richiesta -class Richiesta { - public int keysize; - public String text; - - // Costruttore della richiesta - public Richiesta() {} +package com.crypto; +import io.javalin.Javalin; + +public class Seal { + + // Il mazzo di chiavi !! + public static RSA.RSAkeys keys; + public static void main(String[] args) { + + // Avvio del server web + Javalin app = Javalin.create(config -> { + config.staticFiles.add("/get"); + }).start(8080); + + + System.out.println("⏳ Generazione chiavi RSA per il server web in corso..."); + + // Cifratura con Cifrario di Cesare + app.post("/seal/caesar/encrypt", ctx -> { + + } + + ); + + // Decifratura con Cifrario di Vigenere + app.post("/seal/vigenere/encrypt", ctx -> { + + } + + ); + + // Cifratura con RSA + app.post("/seal/rsa/encrypt", ctx -> { + // Legge i dati nel body dalla richiesta + Richiesta req = ctx.bodyAsClass(Richiesta.class); + keys = RSA.defkeys(req.keysize / 2); + String ciphertext = RSA.encrypt(req.text,keys.e(), keys.n()); + ctx.result(ciphertext); + }); + + // Decifratura con RSA + app.post("/seal/rsa/decrypt", ctx -> { + // Legge i dati nel body dalla richiesta + Richiesta req = ctx.bodyAsClass(Richiesta.class); + + // Usa il metodo RSA per cifrare + String plaintext = RSA.decrypt(req.text, keys.d(), keys.n()); + + // Restituisce il risultato della cifratura + ctx.result(plaintext.replaceAll("\\\\u0000", "")); + }); + } +} + +// Classe utilizzata per tradurre il JSON - Rappresenta l'oggetto richiesta +class Richiesta { + public int keysize; + public String text; + + // Costruttore della richiesta + public Richiesta() {} } \ No newline at end of file diff --git a/src/Utilities.java b/src/main/java/com/crypto/Utilities.java similarity index 97% rename from src/Utilities.java rename to src/main/java/com/crypto/Utilities.java index 6e94c92..520f36f 100644 --- a/src/Utilities.java +++ b/src/main/java/com/crypto/Utilities.java @@ -1,116 +1,116 @@ -package com.crypto; -import java.math.BigInteger; -import java.security.SecureRandom; - -public class Utilities { - - static BigInteger GenPrime(int primesize) { - // 0. Inizializza il generatore crittograficamente sicuro di numeri casuali - SecureRandom sr = new SecureRandom(); - - // 1. Definizione della soglia di precisione - int precision = 100; - - // Stampa di attesa - System.out.println("Generazione dei numeri primi in corso... (potrebbe richiedere qualche istante)"); - - // 2. Generazione della chiave - BigInteger prime = new BigInteger(primesize, precision, sr); - - return prime; - } - - // Algoritmo visto in classe rimodellato per java - static BigInteger ModExp(BigInteger a, BigInteger b, BigInteger n) { - BigInteger result = BigInteger.valueOf(1); - a = a.mod(n); - while (b.compareTo(BigInteger.ZERO) > 0) { - // Se b è dispari - if (b.testBit(0)) { - result = result.multiply(a).mod(n); - } - a = (a.multiply(a)).mod(n); - // Dividiamo l'esponente per 2 spostando i bit (pare che sia più rapido in - // questo modo) - b = b.shiftRight(1); - } - return result; - } - - static BigInteger CalculateE(BigInteger phi) { - BigInteger e = BigInteger.valueOf(65537); - // Finchè il GCD (MCD) non è esattamente uguale a uno - while (!(e.gcd(phi).equals(BigInteger.ONE))) { - e = e.add(BigInteger.valueOf(7)); - } - return e; - } - - public static String BytestoBin(byte[] m) { - StringBuilder sr = new StringBuilder(); - for (byte b : m) { - // %8s significa stringa di 8 bit con eventuale padding a sinistra - // b viene messo in and con 0xFF che serve per forzare valori positivi - // il replace aggiunge il padding di zeri al posto degli spazi - sr.append(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0')); - } - return sr.toString(); - } - - // Converte i valori cifrati in binario e aggiunge il padding a sinistra fino a - // raggiungere il valore z - public static String BigIntToBin(BigInteger val, int g) { - String bin = val.toString(2); - StringBuilder sb = new StringBuilder(); - // aggiungi zeri a sinistra fino a g - for (int i = bin.length(); i < g; i++) { - sb.append('0'); - } - sb.append(bin); - return sb.toString(); - } - - // Divisione in blocchi e applicazione dell'algoritmo visto in classe per la cifratura - - public static String DivideetImpera(String data, int g, BigInteger e, BigInteger n) { - StringBuilder res = new StringBuilder(); - int i; - // Calcolo di z - int z = n.bitLength(); - if (n.and(n.subtract(BigInteger.ONE)).equals(BigInteger.ZERO)) - z--; // n è una potenza esatta di 2, togli 1 - - for (i = 0; (i + g) <= data.length(); i += g) { - String block = data.substring(i, i + g);// prendo il blocco - BigInteger val = new BigInteger(block, 2);// converto in binario - res.append(BigIntToBin(val.modPow(e, n), z)); - } - if (i < data.length()) { - String b = data.substring(i, data.length()); - while (g != b.length()) { - b += '0'; - } - BigInteger val = new BigInteger(b, 2);// converto in binario - res.append(BigIntToBin(val.modPow(e, n), z)); - } - return res.toString(); - } - - // Divisione in blocchi e applicazione dell'algoritmo visto in classe per la decifratura - - public static String ImperaetDivide(String data, int z,int g, BigInteger e, BigInteger n) { - StringBuilder res = new StringBuilder(); - for (int i = 0; (i + z) <= data.length(); i += z) { - BigInteger val = new BigInteger(data.substring(i, i + z), 2); - res.append(BigIntToBin(val.modPow(e, n), g)); - } - StringBuilder testo = new StringBuilder(); - for (int i = 0; i + 8 <= res.length(); i += 8) { - String block = res.substring(i, i + 8); - int ascii = Integer.parseInt(block, 2); - testo.append((char) ascii); - } - return testo.toString(); - } - +package com.crypto; +import java.math.BigInteger; +import java.security.SecureRandom; + +public class Utilities { + + static BigInteger GenPrime(int primesize) { + // 0. Inizializza il generatore crittograficamente sicuro di numeri casuali + SecureRandom sr = new SecureRandom(); + + // 1. Definizione della soglia di precisione + int precision = 100; + + // Stampa di attesa + System.out.println("Generazione dei numeri primi in corso... (potrebbe richiedere qualche istante)"); + + // 2. Generazione della chiave + BigInteger prime = new BigInteger(primesize, precision, sr); + + return prime; + } + + // Algoritmo visto in classe rimodellato per java + static BigInteger ModExp(BigInteger a, BigInteger b, BigInteger n) { + BigInteger result = BigInteger.valueOf(1); + a = a.mod(n); + while (b.compareTo(BigInteger.ZERO) > 0) { + // Se b è dispari + if (b.testBit(0)) { + result = result.multiply(a).mod(n); + } + a = (a.multiply(a)).mod(n); + // Dividiamo l'esponente per 2 spostando i bit (pare che sia più rapido in + // questo modo) + b = b.shiftRight(1); + } + return result; + } + + static BigInteger CalculateE(BigInteger phi) { + BigInteger e = BigInteger.valueOf(65537); + // Finchè il GCD (MCD) non è esattamente uguale a uno + while (!(e.gcd(phi).equals(BigInteger.ONE))) { + e = e.add(BigInteger.valueOf(7)); + } + return e; + } + + public static String BytestoBin(byte[] m) { + StringBuilder sr = new StringBuilder(); + for (byte b : m) { + // %8s significa stringa di 8 bit con eventuale padding a sinistra + // b viene messo in and con 0xFF che serve per forzare valori positivi + // il replace aggiunge il padding di zeri al posto degli spazi + sr.append(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0')); + } + return sr.toString(); + } + + // Converte i valori cifrati in binario e aggiunge il padding a sinistra fino a + // raggiungere il valore z + public static String BigIntToBin(BigInteger val, int g) { + String bin = val.toString(2); + StringBuilder sb = new StringBuilder(); + // aggiungi zeri a sinistra fino a g + for (int i = bin.length(); i < g; i++) { + sb.append('0'); + } + sb.append(bin); + return sb.toString(); + } + + // Divisione in blocchi e applicazione dell'algoritmo visto in classe per la cifratura + + public static String DivideetImpera(String data, int g, BigInteger e, BigInteger n) { + StringBuilder res = new StringBuilder(); + int i; + // Calcolo di z + int z = n.bitLength(); + if (n.and(n.subtract(BigInteger.ONE)).equals(BigInteger.ZERO)) + z--; // n è una potenza esatta di 2, togli 1 + + for (i = 0; (i + g) <= data.length(); i += g) { + String block = data.substring(i, i + g);// prendo il blocco + BigInteger val = new BigInteger(block, 2);// converto in binario + res.append(BigIntToBin(val.modPow(e, n), z)); + } + if (i < data.length()) { + String b = data.substring(i, data.length()); + while (g != b.length()) { + b += '0'; + } + BigInteger val = new BigInteger(b, 2);// converto in binario + res.append(BigIntToBin(val.modPow(e, n), z)); + } + return res.toString(); + } + + // Divisione in blocchi e applicazione dell'algoritmo visto in classe per la decifratura + + public static String ImperaetDivide(String data, int z,int g, BigInteger e, BigInteger n) { + StringBuilder res = new StringBuilder(); + for (int i = 0; (i + z) <= data.length(); i += z) { + BigInteger val = new BigInteger(data.substring(i, i + z), 2); + res.append(BigIntToBin(val.modPow(e, n), g)); + } + StringBuilder testo = new StringBuilder(); + for (int i = 0; i + 8 <= res.length(); i += 8) { + String block = res.substring(i, i + 8); + int ascii = Integer.parseInt(block, 2); + testo.append((char) ascii); + } + return testo.toString(); + } + } \ No newline at end of file diff --git a/src/pom.xml b/src/pom.xml new file mode 100644 index 0000000..d470439 --- /dev/null +++ b/src/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + com.crypto + cryptoseals + 1.0-SNAPSHOT + + + 17 + 17 + + + + + io.javalin + javalin + 6.1.3 + + + + org.slf4j + slf4j-simple + 2.0.16 + + + + com.fasterxml.jackson.core + jackson-databind + 2.16.1 + + + + \ No newline at end of file diff --git a/get/cesare.html b/src/resources/get/cesare.html similarity index 97% rename from get/cesare.html rename to src/resources/get/cesare.html index a7ad60f..0b84847 100644 --- a/get/cesare.html +++ b/src/resources/get/cesare.html @@ -1,77 +1,77 @@ - - - - - CryptoSeals - Cesare - - - - - - -
-

Cifrario di Cesare

-

Sposta le lettere dell'alfabeto di un numero fisso di posizioni. Semplice, storico, ma efficace per messaggi veloci.

- -
- - - - - - - - - - - - - - -
-
- - - + + + + + CryptoSeals - Cesare + + + + + + +
+

Cifrario di Cesare

+

Sposta le lettere dell'alfabeto di un numero fisso di posizioni. Semplice, storico, ma efficace per messaggi veloci.

+ +
+ + + + + + + + + + + + + + +
+
+ + + \ No newline at end of file diff --git a/src/resources/get/index.html b/src/resources/get/index.html new file mode 100644 index 0000000..e648444 --- /dev/null +++ b/src/resources/get/index.html @@ -0,0 +1,157 @@ + + + + + + CryptoSeals - Motore RSA + + + + + + + + +
+

Motore RSA

+

Cifra e decifra i tuoi messaggi con lo standard di sicurezza a chiave pubblica. Scegli la dimensione delle chiavi, scrivi e lascia fare alle foche.

+ +
+ + + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/get/rsa.html b/src/resources/get/rsa.html similarity index 97% rename from get/rsa.html rename to src/resources/get/rsa.html index 8781332..e1a9ed1 100644 --- a/get/rsa.html +++ b/src/resources/get/rsa.html @@ -1,95 +1,95 @@ - - - - - CryptoSeals - RSA - - - - - - -
-

Motore RSA

-

Cifra e decifra i tuoi messaggi con lo standard di sicurezza a chiave pubblica. Scegli la dimensione delle chiavi, scrivi e lascia fare alle foche.

- -
- - - - -
- -
- - - -
- -
- - - -
- -
-
- - -
-
-
- - - + + + + + CryptoSeals - RSA + + + + + + +
+

Motore RSA

+

Cifra e decifra i tuoi messaggi con lo standard di sicurezza a chiave pubblica. Scegli la dimensione delle chiavi, scrivi e lascia fare alle foche.

+ +
+ + + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+
+
+ + + \ No newline at end of file diff --git a/get/seal1.png b/src/resources/get/seal1.png similarity index 100% rename from get/seal1.png rename to src/resources/get/seal1.png diff --git a/src/resources/get/style.css b/src/resources/get/style.css new file mode 100644 index 0000000..4d3a744 --- /dev/null +++ b/src/resources/get/style.css @@ -0,0 +1,238 @@ +/* --- IMPORTS --- */ +@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&family=Poppins:wght@300;400;600&display=swap'); + +/* --- VARIABILI GLOBALI --- */ +:root { + --bg-dark: #0b0f19; + --accent-green: #10b981; + --accent-hover: #059669; + --text-main: #f3f4f6; + --glass-bg: rgba(17, 24, 39, 0.7); + --glass-border: rgba(255, 255, 255, 0.1); +} + +/* --- BASE --- */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: 'Poppins', sans-serif; + background: radial-gradient(circle at top right, #1f2937, var(--bg-dark)); + color: var(--text-main); + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* --- NAVBAR (Glassmorphism) --- */ +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px 5%; + background: var(--glass-bg); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-bottom: 1px solid var(--glass-border); + position: sticky; + top: 0; + z-index: 1000; +} + +.nav-brand { + display: flex; + align-items: center; + gap: 15px; + font-size: 1.5rem; + font-weight: 600; + color: var(--text-main); + text-decoration: none; +} + +.nav-brand img { + border-radius: 50%; +} + +.nav-links { + list-style: none; + display: flex; + gap: 20px; +} + +.nav-links a { + color: var(--text-main); + text-decoration: none; + font-weight: 400; + transition: color 0.3s ease; +} + +.nav-links a:hover, .nav-links a.active { + color: var(--accent-green); +} + +/* Menu Mobile */ +.menu-toggle { + display: none; + font-size: 1.5rem; + cursor: pointer; +} + +/* --- CONTENITORI --- */ +.container { + flex: 1; + max-width: 1000px; + margin: 40px auto; + padding: 0 20px; + text-align: center; +} + +h1 { + font-size: 2.5rem; + margin-bottom: 15px; + color: var(--accent-green); +} + +.descrizione { + font-size: 1.1rem; + margin-bottom: 30px; + color: #9ca3af; +} + +/* --- CRYPTO BOX (Glassmorphism) --- */ +.crypto-box { + background: var(--glass-bg); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid var(--glass-border); + border-radius: 15px; + padding: 30px; + text-align: left; + box-shadow: 0 10px 30px rgba(0,0,0,0.5); +} + +.crypto-columns { + display: flex; + gap: 20px; + margin-top: 20px; +} + +.crypto-col { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; +} + +/* --- FORMS & INPUTS --- */ +label { + font-weight: 600; + font-size: 0.9rem; + color: var(--accent-green); +} + +select, textarea { + width: 100%; + padding: 12px; + border-radius: 8px; + background: rgba(0, 0, 0, 0.3); + border: 1px solid var(--glass-border); + color: var(--text-main); + font-family: 'Poppins', sans-serif; + outline: none; + transition: border-color 0.3s; +} + +select:focus, textarea:focus { + border-color: var(--accent-green); +} + +/* Font Monospazio per il testo cifrato */ +#ciphertext, #decodedtext { + font-family: 'Fira Code', monospace; + font-size: 0.9rem; +} + +textarea { + resize: vertical; + min-height: 120px; +} + +/* --- BOTTONI --- */ +button { + padding: 12px; + border: none; + border-radius: 8px; + background-color: var(--accent-green); + color: white; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: background-color 0.3s, transform 0.1s; + font-family: 'Poppins', sans-serif; + display: flex; + justify-content: center; + align-items: center; + gap: 8px; +} + +button:hover { + background-color: var(--accent-hover); +} + +button:active { + transform: scale(0.98); +} + +button:disabled { + background-color: #374151; + cursor: not-allowed; +} + +.btn-green { + background-color: #3b82f6; /* Usiamo un blu per distinguere la decifratura */ +} +.btn-green:hover { + background-color: #2563eb; +} + +/* --- FOOTER --- */ +footer { + text-align: center; + padding: 20px; + background: var(--bg-dark); + border-top: 1px solid var(--glass-border); + font-size: 0.9rem; + color: #6b7280; +} + +footer a { + color: var(--accent-green); + text-decoration: none; +} + +/* --- RESPONSIVE --- */ +@media (max-width: 768px) { + .crypto-columns { + flex-direction: column; + } + .nav-links { + display: none; + flex-direction: column; + position: absolute; + top: 70px; + left: 0; + width: 100%; + background: var(--bg-dark); + padding: 20px 0; + text-align: center; + } + .nav-links.active { + display: flex; + } + .menu-toggle { + display: block; + } +} \ No newline at end of file