Criptografia de Cesar usando Arduíno

Criptografia é a ciência ou a arte de escrever em cifras. A criptografia provê meios através de técnicas e algoritmos matemáticos para se transformar um texto claro ou plano (inteligível) em um texto cifrado (ininteligível).
Há relatos do uso de criptografia por povos da antiguidade onde podemos destacar a cifra de Atbash onde acredita-se que trechos do Torá e do livro do profesta Jeremias usaram essa maneira de codificação (referências não cientificas). 
Uma evolução (talvez não) da cifra de Atbash é a Cifra supostamente desenvolvida pelo Imperador Julio César que usava uma técnica de substituição na qual cada letra do texto é substituída por outra. Para saber mais sobre cifras de substituição, monoalfabéticas e Cifras de César, clique na imagem abaixo e acesse nossa vídeo-aula no youtube.
  Exclusão mutua com Arduíno

Em nossa experiencia iremos usar um display de Cristal liquido (LCD) que fará a interface com o usuário, um potenciômetro que será usado para realizar a seleção da Chave no processo de criptografia e um botão para confirmação após a escolha da chave. Na figura 1 temos o esquema montado para realização da experiencia. 
Figura 1. Circuito usado na experiencia de criptografia. 

Conforme visto na vídeo-aula, para realizar a criptografia usaremos o resto da divisão para substituir a palavra em texto claro pela sua equivalente cifrada. 
Para utilizar o LCD a  biblioteca LiquidCrystal será utilizada facilitando assim o controle do dispositivo. Para entender melhor o uso das bibliotecas no Arduíno, acesse nossa postagem sobre o assunto clicando aqui. Se antes de analisar o código usado você quiser ver o experimento rodando, clique na imagem abaixo e acesse o youtube.

 Exclusão mutua com Arduíno
Após ver a explicação do projeto de criptografia de César, segue código utilizado na experiencia. 


#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Configura os pinos do Arduíno conectados ao LCD
// Para entender o uso do LCD acesse:   Em Breve


//Variáveis globais


//Variáveis para armazenar valor da chave criptográfica e flag de controle
int K =15;
int Def_K=0;  //Flag para saber qdo chave já foi selecionada


//Variáveis de manipulação de texto
char claro[30]; //Variável que armazenará texto claro
char cifra[30]; //Variável que armazenará texto cifrado
int vPot = 0;  //Variável que armazenará valor do potenciômetro
//Alfabeto que será usado na analise e criptografia
char alfa [26] ={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

//Variáveis de controle
int l=0; //Variavel para posicionar coluna do cursos no LCD
char op; // Variável para controlar botão
int j=0;
int Ncifra=0;

void setup()
{
  lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2
  Serial.begin(9600);
  pinMode(8,INPUT);
  lcd.setCursor(1, 0);  //Comando para posicionar cursor no LCD
  lcd.print("Cifra de Cesar"); //Escreve no LCD msg inicial
  lcd.setCursor(0, 1);
  lcd.print("Bruno  Rodrigues");

  Serial.println("*---                                      Criptografia de Cesar e Arduíno                                          -----* ");
  Serial.println("*--- Escolha a chave criptográfica e digite o texto alfa, ao finalizar o texto Digite Z para ver o texto cifrado  -----* ");
  Serial.println("*---                                      Desenvolvido por Bruno Rodrigues                                          -----* ");
  delay(3000);
  lcd.clear();
}

void loop()
{
  if(Def_K==0)
  {
    lcd.setCursor(0, 0);
    lcd.print("Defina a chave:"); //Escreve no LCD
    define_chave();
    Serial.println("Digite o texto claro: ");
  }
  else
  {
    recebe_texto();
  }
}

void define_chave()
{
  Serial.print("Chave K: ");
  lcd.setCursor(0, 1);
  lcd.print("K= "); //Escreve no LCD
  while(digitalRead(8)==HIGH)
  {
    vPot = analogRead(5);
    K= map(vPot, 0, 1023, 0, 26); //Variável para mapear clique aqui para sabe mais
    Serial.print(K);Serial.print(" ");
    lcd.setCursor(3, 1);
    lcd.print(K); //Mostra chave que está sendo escolhida no LCD
    delay(500);
  }
  delay(1000);
  Def_K=1;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("chave K= "); //Escreve no LCD
  lcd.setCursor(9, 0);
  lcd.print(K);
  Serial.println("");
  delay(500);
  lcd.clear();
}


void recebe_texto()
{
  int i=0;

  lcd.setCursor(0, 0);
  lcd.print("Digite o texto: ");
  op= Serial.read();
    if(op == '!')
    {
     lcd.clear();
     exibe_cifra();

    }
  while (i<=24)
  {
    if(op == alfa[i])
    {
      lcd.setCursor(l, 1);
      lcd.print(alfa[i]);
      //Calculo da criptografia usando MOD 26
      Ncifra= (i+K)%26;
      claro[l]=alfa[i];
      cifra[j]=alfa[Ncifra];
      j++;
      l++;
    }
    i++;
  }

}

void exibe_cifra()
{
  int i=0;
  l=0;
      Serial.print("A Palavra cifrada é: ");
 
      while (i<=24 || claro[i]=="\n")
      {
        lcd.setCursor(l,0);
        lcd.print(claro[i]);
   
   
        lcd.setCursor(l,1);
        lcd.print(cifra[i]);
        Serial.print(cifra[i]);
        i++;
        if(i<=15)
        {
          l++;
        }
   
      }
      delay(5000);
      lcd.clear();
}


Desafios:

Desafio 1 - Faça sistema similar ao apresentado acima que decifre um texto cifrado com Cifras de César.

Desafio 2 - Faça um sistema onde o texto será criptografado 2 vezes usando chaves diferentes.

Não esqueça do like do video e de curtir nossa pagina no facebook no link abaixo:

Um comentário: