4 de julho de 2021

Cifra de César

Uma das técnicas mais antigas para cifrar mensagens, utilizada por Júlio César durante o império Romano, para se comunicar com suas tropas durante as guerras.

A técnica de substituição das letras que chamamos de Cifra de César.

Utilizando a posição de cada letra no alfabeto, é realizada a substituição das letras do texto por outra letra definida através de um número chave determinado.

Utilizando o número 3 como chave, substituímos todas as letras A da mensagem pela letra D, todas as letras B pela letra E, e assim por diante.
Sendo assim, considerando as 26 letras do nosso alfabeto, podemos estar utilizando uma chave com valor compreendido entre 1 e 25.

Para decifrar a mensagem, basta efetuar a substituição das letras no sentido contrário.

Referências:
https://pt.wikipedia.org/wiki/Cifra_de_César

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*---------------------------------------------------------
  Programa : CIFRA DE CESAR
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 10/06/2021
  ---------------------------------------------------------*/
int menu = 0;
String txt = "";
bool code = true;
int key = 1;

void setup() {
  Serial.begin(115200);
  Serial.println("CIFRA DE CÉSAR");
  Serial.println("www.efeitonerd.com.br");
}

void loop() {
  String strSerial = "";

  //Recebe a string da serial
  while (Serial.available() > 0) {
    strSerial += Serial.readString();
    delay(10);
  }

  //Verifica se existe texto preenchido através da serial
  if (strSerial.length() > 0) {
    if (menu == 1) {
      txt = strSerial;
      Serial.println("--> " + txt);
      Serial.println("\nSelecione a opção:");
      Serial.println("1=Codificar 2=Decodificar");
      menu = 2;
    } else if (menu == 2) {
      if (strSerial.toInt() <= 0 || strSerial.toInt() > 2) {
        Serial.println("Valor inválido. Deve ser 1 ou 2.");
        return;
      }
      if (strSerial == "1") {
        code = true;
        Serial.println("--> Codificar");
      } else {
        code = false;
        Serial.println("--> Decodificar");
      }
      Serial.println("\nValor da chave (1 a 25):");
      menu = 3;
    } else if (menu == 3) {
      if (strSerial.toInt() <= 0 || strSerial.toInt() > 25) {
        Serial.println("Valor inválido. Deve ser entre 1 e 25.");
        return;
      }
      key = strSerial.toInt();
      Serial.println("--> " + String(key));
      delay(500);
      Serial.println("\nResultado:");
      Serial.println("--> " + ceasarCipher(txt, key, code));
      menu = 0;
      delay(4000);
    }
  }

  if (menu == 0) {
    Serial.println("\nDigite o texto:");
    menu = 1;
  }
}

String ceasarCipher(String txt, int shift, bool encode) {
  String alphabet = "abcdefghijklmnopqrstuvwxyz";
  if (encode == false) alphabet = "zyxwvutsrqponmlkjihgfedcba";
  String txtCode = "";
  for (int i = 0; i < txt.length(); i++) {
    bool inAlphabet = false;
    for (int a = 0; a < alphabet.length(); a++) {
      if (txt.substring(i, i + 1) == alphabet.substring(a, a + 1)) {
        inAlphabet = true;
        if (a + shift >= alphabet.length()) {
          txtCode += alphabet.substring(a + shift - alphabet.length(), a + shift - alphabet.length() + 1);
        } else {
          txtCode += alphabet.substring(a + shift, a + shift + 1);
        }
      }
    }
    if (inAlphabet == false) txtCode += txt.substring(i, i + 1);
  }
  return txtCode;
}

Nenhum comentário:

Postar um comentário