Advertisement
MonsterScripter

CodinGame_2023_09_10__16_12_52__Encryption_Decryption_of_Enigma_Machine.java

Sep 10th, 2023
960
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.60 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4.  
  5. /**
  6.  * Objectif
  7.  * Pendant la Seconde Guerre mondiale, les Allemands utilisaient un code de cryptage appelé Enigma,
  8.  * qui était essentiellement une machine de cryptage qui chiffrait les messages pour leur transmission.
  9.  * Le code Enigma est resté inviolé pendant de nombreuses années. Voici comment fonctionnait la machine de base :
  10.  *
  11.  * Tout d'abord, une substitution de César est appliquée à l'aide d'un nombre croissant :
  12.  * Si la chaîne est AAA et que le nombre de départ est 4, alors la sortie sera EFG.
  13.  * A + 4 = E
  14.  * A + 4 + 1 = F
  15.  * A + 4 + 1 + 1 = G
  16.  *
  17.  * Ensuite, on mappe EFG sur le premier ROTOR, par exemple :
  18.  * ABCDEFGHIJKLMNOPQRSTUVWXYZ
  19.  * BDFHJLCPRTXVZNYEIWGAKMUSQO
  20.  * Ainsi, EFG devient JLC. Ensuite, elle passe par 2 ROTORS supplémentaires pour obtenir la valeur finale.
  21.  *
  22.  * Si le deuxième ROTOR est AJDKSIRUXBLHWTMCQGZNPYFVOE, on applique à nouveau l'étape de substitution :
  23.  * ABCDEFGHIJKLMNOPQRSTUVWXYZ
  24.  * AJDKSIRUXBLHWTMCQGZNPYFVOE
  25.  * Donc, JLC devient BHD.
  26.  *
  27.  * Si le troisième ROTOR est EKMFLGDQVZNTOWYHXUSPAIBRCJ, alors la substitution finale est :
  28.  * ABCDEFGHIJKLMNOPQRSTUVWXYZ
  29.  * EKMFLGDQVZNTOWYHXUSPAIBRCJ
  30.  * Donc, BHD devient KQF.
  31.  *
  32.  * La sortie finale est envoyée via un émetteur radio.
  33.  *
  34.  * Entrée
  35.  * Ligne 1 : ENCODE ou DECODE
  36.  * Ligne 2 : Nombre de décalage initial N
  37.  * Lignes 3-5 : Les trois ROTORS
  38.  * Ligne 6 : Message à coder ou décoder
  39.  *
  40.  * Sortie
  41.  * Chaîne encodée ou décodée
  42.  *
  43.  * Contraintes
  44.  * 0 ≤ N < 26
  45.  * Le message est composé uniquement de lettres majuscules (A-Z)
  46.  * 1 ≤ Longueur du message < 50
  47.  *
  48.  * Exemple
  49.  * Entrée
  50.  * ENCODE
  51.  * 4
  52.  * BDFHJLCPRTXVZNYEIWGAKMUSQO
  53.  * AJDKSIRUXBLHWTMCQGZNPYFVOE
  54.  * EKMFLGDQVZNTOWYHXUSPAIBRCJ
  55.  * AAA
  56.  * Sortie
  57.  * KQF
  58.  *
  59.  * Exemple
  60.  * DECODE
  61.  * 9
  62.  * BDFHJLCPRTXVZNYEIWGAKMUSQO
  63.  * AJDKSIRUXBLHWTMCQGZNPYFVOE
  64.  * EKMFLGDQVZNTOWYHXUSPAIBRCJ
  65.  * PQSACVVTOISXFXCIAMQEM
  66.  * EVERYONEISWELCOMEHERE
  67.  */
  68. class Solution {
  69.  
  70.     public static void main(String args[]) {
  71.         Scanner in = new Scanner(System.in);
  72.         String operation = in.nextLine();
  73.         int pseudoRandomNumber = in.nextInt();
  74.         List<String> rotors = new ArrayList<String>();
  75.         if (in.hasNextLine()) {
  76.             in.nextLine();
  77.         }
  78.         for (int i = 0; i < 3; i++) {
  79.             String rotor = in.nextLine();
  80.             rotors.add(rotor);
  81.         }
  82.         String message = in.nextLine();
  83.         StringBuilder sbResult = new StringBuilder();
  84.         if (operation.equals("ENCODE")) {
  85.             sbResult.append(encode(message, pseudoRandomNumber, rotors));
  86.         } else if (operation.equals("DECODE")) {
  87.             sbResult.append(decode(message, pseudoRandomNumber, rotors));
  88.         }
  89.         System.out.println(sbResult.toString());
  90.     }
  91.  
  92.     private static String encode(String message, int pseudoRandomNumber, List<String> rotors) {
  93.         StringBuilder result = new StringBuilder();
  94.         for (int i = 0; i < message.length(); i++) {
  95.             result.append(Character.toString((((message.charAt(i) - 'A') + pseudoRandomNumber + i) % (('Z'-'A') + 1)) + 'A'));
  96.         }
  97.         for (int i = 0; i < rotors.size(); i++) {
  98.             String rotor = rotors.get(i);
  99.             for (int j = 0; j < result.length(); j++) {
  100.                 Integer pos = result.charAt(j) - 'A';
  101.                 result = result.replace(j, j+1, Character.toString(rotor.charAt(pos)));
  102.             }
  103.         }
  104.         return result.toString();
  105.     }
  106.  
  107.     private static String decode(String message, int pseudoRandomNumber, List<String> rotors) {
  108.         StringBuilder result = new StringBuilder();
  109.         result.append(message);
  110.         for (int i = rotors.size()-1; i >= 0; i--) {
  111.             String rotor = rotors.get(i);
  112.             for (int j = 0; j < result.length(); j++) {
  113.                 Integer pos = rotor.indexOf(result.charAt(j));
  114.                 Character c = (char) ('A' + pos);
  115.                 result = result.replace(j, j+1, Character.toString(c));
  116.             }
  117.         }
  118.         for (int i = 0; i < result.length(); i++) {
  119.             Character c = (char) ((((result.charAt(i) - 'A') - pseudoRandomNumber - i) % (('Z'-'A') + 1)) + 'A');
  120.             int x = (((result.charAt(i) - 'A') - pseudoRandomNumber - i) % (('Z'-'A') + 1));
  121.             if (x < 0) {
  122.                 x = 'Z' + x+1;
  123.             } else {
  124.                 x += 'A';
  125.             }
  126.             result = result.replace(i, i+1, Character.toString((char) x));
  127.         }
  128.         return result.toString();
  129.     }
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement