Caesar Cipher Decode

Olá, internet.

Hoje vou compartilhar um código com vocês.

Recebi um desafio uns meses atrás para decodificar um texto usando Caesar Cipher, ou no bom e velho PT-BR, Cifra de César.

A Cifra de César, também conhecida como cifra de troca, código de César ou troca de César, é uma das mais simples e conhecidas técnicas de criptografia. É um tipo de cifra de substituição na qual cada letra do texto é substituída por outra, que se apresenta no alfabeto abaixo dela um número fixo de vezes. Por exemplo, com uma troca de três posições, A seria substituído por D, B se tornaria E, e assim por diante. O nome do método é em homenagem a Júlio César, que o usou para se comunicar com os seus generais.

Wikipédia – https://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar

Agora que a Caesar Cipher nos foi apresentada, vamos ao código:

function CaesarCipherDecode($string, $casas = 9) {
  $abc = range('a', 'z');
  $decifrado = '';
  foreach (str_split(strtolower($string)) as $letter) {
      if (ctype_alpha($letter)) {
          foreach ($abc as $key => $alpha) {
              if (($key - $casas) < 0) {
                  $decifrado .= $abc[(($key - $casas) + count($abc))];
              } else {
                  $decifrado .= $abc[$key - $casas];
              }
          }
      } else {
          $decifrado .= $letter;
      }
  }
  return $decifrado;
}

O desafio era decodificar, então a primaira função que veio foi essa. Nela criei um range de a à z e abri uma variável do tipo string vázia.

No foreach eu quebro/divido a variável $string, que vem da função, tornando-a no formato lowercase (letras minusculas), já que nosso range é de letras minusculas (e isso é importante). A partir daí, nossa $string agora se chama $letter e transformou-se em um array.

Como nosso “decifrador” irá apenas “ler” letras abri um if para verificar essa informação (se é letra ou não), sendo assim, passamos para o próximo foreach caso seja uma letra.

O nosso próximo foreach usaremos nossa variável $abc, do tipo array, contendo o a range de a à z. Quebrando ela em 2 agora temos a letra ($alpha) e a posição dela no alfabeto ($key).

Agora vem uma parte que quebrei a cabeça por algumas horas, já que não havia me atentado ao fato de que o numero de casas puladas na cifra poderia ser maior que o numero de letras no alfabeto. Sendo assim, verificamos isso no if (($key – $casas) < 0). Nesse caso usamos key-casas < 0 pois estamos voltando casas.

Para encontrar nossa letra no caso de $key-$casas ser menor que zero utilizei a nossa range/array $abc fazendo a subtração key-casas e somando com a quantidade de letras contidas na nossa range, ficando $abc[($key-$casas)+count($abc)].

Caso a subtração entre key e casas fosse maior que zero nossa formula não precisaria somar quantos valores existem na nossa array $abc, ficando $abc[$key-$casas].

Lembrando que todos os resultados então sendo gravados na variável $decifrado, do tipo string.

Esqueci de falar que na função existem 2 variáveis necessária, sendo a ultima $casas, do tipo não obrigatória, já que ela tem padrão 9. Sendo assim, nossa função é chamada CaesarCipherDecode(‘textocifrado’, numerodecasas), ou apenas CaesarCipherDecode(‘textocifradopulando9casas’), onde ele usaria o numero de casas padrão (9).

É isso aí.

Depois volto com a formula para cifrar textos usando Caesar Cipher, não demoro, prometo. E desculpas pela falta de jeito. A muito tempo não escrevia códigos em um blog.

%d blogueiros gostam disto: