Cifra monoalfabética

Skip to content

Este é um texto traduzido automaticamente que pode conter erros!

Sobre as tarefas de criptografia

Estas tarefas são estruturadas um pouco diferente das outras tarefas no Piggy, estou curioso para saber o que vocês preferem! 😎

Haverá primeiro uma parte com informações sobre os temas, seguida de algumas tarefas!

Os “níveis” nesta tarefa não são exatamente como os níveis anteriores, aqui as coisas estão mais divididas em temas.

Ir diretamente para as tarefas

O que é uma “Cipher”?

Já teve vontade de escrever uma mensagem secreta para um amigo, para que ninguém mais a entenda? Então você precisa de uma Cipher, ou cifra em Norueguês! Uma cifra é simplesmente um método que transforma texto comum em “código” substituindo caracteres (geralmente letras) por outros caracteres. O resultado parece absurdo para quem não sabe como o código funciona. A ideia é que apenas aqueles que conhecem a chave (a regra para substituir as letras) possam tornar o código compreensível novamente. Em outras palavras: cifras tornam possíveis mensagens secretas, seja a brincadeira da infância com linguagem secreta ou verdadeiros espiões enviando mensagens criptografadas. 😄

Sabia?

A palavra “cifra” vem, na verdade, de uma palavra árabe: a palavra sifr, que significa “zero”. Talvez porque o código secreto parecesse nada (sem sentido!) quando as pessoas não conseguiam decifrá-lo!

Existem muitos tipos de cifras – algumas usam números, algumas usam símbolos, e a criptografia de dados moderna usa algoritmos muito complicados. Esses algoritmos complicados requerem matemática muito complicada, então podemos analisar alguns algoritmos mais simples primeiro!

Cifras Monoalfabéticas

Vamos primeiro analisar alguns dos métodos de codificação mais simples (e antigos) que existem: cifras monoalfabéticas.

Monoalfabético pode parecer uma palavra difícil, mas podemos dividi-la: mono significa “um” e alfabético se refere ao alfabeto.

Portanto, cifras monoalfabéticas são códigos que usam um único “alfabeto de criptografia” para toda a mensagem. Isso significa que cada letra no texto original é sempre substituída pela mesma letra ao longo de toda a mensagem criptografada.

Por exemplo, se você determinou que A deve ser substituído por X, então todos os As no texto serão convertidos em X.

Cifra de César

O exemplo clássico de uma cifra monoalfabética é a Cifra de César (nomeada em homenagem a Júlio César). Isso é basicamente uma regra para “deslocar” todas as letras um certo número de posições ao longo do alfabeto. Aparentemente, o próprio César usou um deslocamento de 3 letras em suas mensagens secretas. Funciona de modo que A se torna D, B se torna E, C se torna F, e assim por diante ao longo do alfabeto. (Quando você passa de Z, começa novamente em A.) Uma mensagem que ABC se tornaria DEF se usarmos o método de César.

Ninguém Espera uma Mensagem em Cifra de César?

Ceasar Cipher Meme

Como funciona a Cifra de César na prática:

  • Escolha uma chave: Determine um número secreto (por exemplo, 3) que indique quantas posições você deve mover cada letra.
  • Substitua cada letra: Para cada letra na mensagem original, encontre a letra que está tantas posições depois dela no alfabeto (para a chave 3, A se torna D, B se torna E, etc. – lembre-se de voltar para A novamente após Z, se necessário). Eventualmente, você também pode incluir Æ, Ø e Å, mas isso se torna um pouco mais complicado.
  • Mensagem criptografada: Substitua as letras e escreva a nova mensagem com as letras “deslocadas”. Voilá – você tem um texto ilegível e secreto que apenas aqueles com a chave podem entender!
  • Para descriptografar (ou seja, transformá-lo novamente em texto legível), basta fazer o deslocamento inverso. Se você souber a chave (por exemplo, 3), é tão fácil ler a mensagem movendo as letras 3 posições para trás no alfabeto.

Segurança?

Estes códigos não são muito seguros a longo prazo. Como o padrão (a substituição) é fixo, uma pessoa com paciência suficiente ou alguns truques inteligentes pode facilmente revelar o segredo. Por exemplo, existem apenas alguns deslocamentos possíveis no Cifra de César, tantos quanto o alfabeto, então qualquer um pode tentar todos até que a mensagem faça sentido – ou usar frequências de letras para adivinhar. Em outras palavras, talvez não use a Cifra de César para anotações de diário super secretas ou segredos de estado 😉.

Cifras monoalfabéticas são uma maneira fantástica de aprender o princípio por trás da criptografia. São simples e mostram como podemos usar uma regra simples (uma chave) para transformar um texto compreensível em algo misterioso e incompreensível – e vice-versa. Então, da próxima vez que quiser enviar uma mensagem secreta a um amigo, você pode usar a cifra de César! Talvez vocês possam criar sua própria variante do alfabeto secreto de César? 🔐✨


Tarefas

Linguagens de programação?

Como antes, sinta-se à vontade para usar qualquer linguagem de programação que desejar! Os exemplos aqui estarão em Python.

Medium Tarefa 1.1 - Cifra de César Criptografia

Agora vamos realmente escrever algum código! Vamos começar simples criando a criptografia, com base na teoria, deve ser bastante direto.

Implemente a criptografia com a Cifra de César usando uma função que recebe texto e um número que é a “chave”, ou seja, quanto o alfabeto deve ser rotacionado.

Dicas para o procedimento.
  1. Crie uma função que se chama caesar que recebe o texto a ser encriptado e um “shift”, ou seja, quantas posições no alfabeto o texto deve ser deslocado.
  2. Percorra letra por letra no texto.
  3. Não queremos “deslocar” outros caracteres além de letras: descubra como verificar se um caractere no texto é uma letra.
  4. Devemos “rotacionar” a letra com n posições, ou seja, devemos adicionar a rotação: descubra como transformar o texto em números para que você possa adicionar o deslocamento. Dica: a função ord().
  5. Lembre-se! Aqui você obtém valores diferentes com base se você tem letras maiúsculas ou minúsculas. Consulte a Tabela ASCII.
  6. Depois de ter um valor, é tão simples quanto adicionar o valor n. Mas o que acontece se você estiver no final do alfabeto? Obteremos apenas besteira depois da letra Z. Como corrigir isso? Isso requer um pouco de pensamento.
Corrigir a encriptação.

Para corrigir a encriptação completamente, requer um pouco de pensamento.

  • O primeiro passo a pensar é usar o operador módulo, %.
  • Como o alfabeto (em inglês) consiste em 26 letras, podemos tomar o módulo por 26.
  • Mas isso não funciona completamente, você vê o motivo?
  • Tente print o valor de um caractere com ord(), o que você obtém?
  • Para a você obtém 97. Se você tomar o módulo 26 com isso, você obtém 19. Lembre-se que o módulo sempre dará uma resposta entre 0 e o número.
  • Isso pode ser corrigido armazenando o valor inicial de letras maiúsculas e minúsculas, subtraindo isso da letra e, em seguida, tomando o módulo. Então fica: (ord(letra) - ord('a')) % 26
  • Para obter a letra correta de volta, basta adicionar o valor inicial novamente.
  1. Depois de tudo isso, você pode finalmente transformar o número de volta em uma letra. Aqui você pode usar a função chr().
  2. Agora você pode finalmente adicionar a letra a um resultado e retornar o texto encriptado!

Løsning:
def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
        # descobrir o ponto de partida com base em letras maiúsculas e minúsculas
        start = ord('A') if char.isupper() else ord('a')
        # O cálculo de deslocamento complicado
        result += chr((ord(char) - start + shift) % 26 + start)
    else:
        result += char
    return result

Easy Tarefa 1.2 - Decriptação de Cifra de César

A decriptação é apenas fazer o cálculo oposto à encriptação. Você subtrai o deslocamento em vez de adicionar.

Dicas sobre como proceder.

Use a função que você criou na tarefa 1 para isso. Apenas pegue a mesma função, mas de forma reversa. Você pode fazer isso revertendo o deslocamento em 26 - shift.

Solução:
def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Outros Cifras Monoalfabéticos (ex. Atbash)

Existem outros cifras monoalfabéticos também! Um dos mais simples é o que é chamado de Cifra “Atbash”.

Como funciona o Atbash?

Este é muito simples, em vez de uma rotação, as letras são mapeadas para o alfabeto oposto. Aqui está uma tabela mostrando o mapeamento:

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
z y x w v u t s r q p o n m l k j i h g f e d c b a

Medium Tarefa 1.3 - Criptografia e Decriptografia Atbash

O bom do Atbash é que, como a criptografia é uma transformação 1 para 1, ela funciona diretamente ao contrário. Ou seja, se você criou a criptografia, você também criou automaticamente a decriptografia.

Como isso pode ser feito na prática?

Você pode subtrair a letra em relação a Z, ou criar uma tabela de “Look-up”. Ou seja, isso significa uma tabela ou dicionário que contém todas as letras de a a z e o que elas devem se tornar. Esta pode ser uma boa solução se você quiser criar outro tipo de criptografia.

Implementação de tabela de consulta.
letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... adicione o restante das letras para baixo
}

Com a ajuda desta tabela, você pode percorrer letra por letra, então obter o valor por letra da tabela de pesquisa e, em seguida, imprimi-lo. O que você deve fazer para letras maiúsculas e minúsculas?


Parte 2 - Criptoanálise de Cifras Monoalfabéticas

Nesta parte, vocês devem tentar criar um algoritmo para “quebrar” uma cifra de César, ou seja, pegar um texto criptografado e, em seguida, obter o texto original sem conhecer a chave.

Isto pode ser feito de forma um tanto manual, ou você pode tentar usar uma simples “criptoanálise”. Este é um conceito que veremos mais a fundo mais tarde, mas por enquanto, vamos apenas analisar uma das maneiras mais simples: Análise de Frequência (frequency analysis). Você pode ler mais sobre este conceito aqui: Frequency Analysis ou aqui Wikipedia - frequency analysis.

Este método pode ser usado em mais do que apenas cifras de César, ele pode ser usado em algoritmos mais complexos também, mas a cifra de César é tão simples que a análise de frequência é trivial.

Como funciona a análise de frequência?

A análise de frequência, como o nome sugere, é uma forma de verificar a frequência de letras em um texto. Por que isso pode ser útil? Imagine que você tem um texto longo, vamos imaginar um texto em inglês, retirado de Wikipedia - frequency analysis:

In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.

Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.

In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.

Se pegarmos este texto e o transformarmos usando a cifra de César (e removermos vírgulas, espaços e outros caracteres especiais), obteremos o seguinte texto cifrado:

xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtrudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz

Este texto parece impossível de “quebrar”, mas com a ajuda da “Análise de Frequência” não é apenas possível, mas fácil.

Veja a seguinte figura:
English frequency distribution

Esta é uma figura que mostra a distribuição de letras em inglês. Podemos ver que a letra E é a letra mais frequente, seguida por T, A e O.

Isso pode ser convertido em uma tabela e, em seguida, usado para contar e analisar um determinado texto cifrado para, em seguida, “quebrá-lo”. Nas tarefas abaixo, você deve criar um programa que possa “quebrar” a cifra de César por conta própria. É verdade que a cifra de César é tão simples que você pode simplesmente verificar todas as 26 possibilidades manualmente, mas aqui vamos encontrar a solução, totalmente automaticamente.

Easy Tarefa 2.1 - Criar uma tabela de frequência

Em um arquivo python, crie uma tabela de frequência das letras do idioma inglês. Você pode tentar encontrá-la sozinho, mas se não quiser fazer isso, entendemos!

Se você realmente quiser encontrá-la sozinho, pode fazer como na Tarefa 2.2, mas em um texto muito grande.

English Letter Frequency (Svaret)
english_letter_frequency = {
    'E': 12.70, 
    'T': 9.06, 
    'A': 8.17, 
    'O': 7.51, 
    'I': 6.97, 
    'N': 6.75, 
    'S': 6.33, 
    'H': 6.09, 
    'R': 5.99, 
    'D': 4.25, 
    'L': 4.03, 
    'C': 2.78, 
    'U': 2.76, 
    'M': 2.41, 
    'W': 2.36, 
    'F': 2.23, 
    'G': 2.02, 
    'Y': 1.97, 
    'P': 1.93, 
    'B': 1.29, 
    'V': 0.98, 
    'K': 0.77, 
    'J': 0.15, 
    'X': 0.15, 
    'Q': 0.10, 
    'Z': 0.07
}

Medium Tarefa 2.2 - Contar a frequência de letras em um texto

Agora vamos criar um algoritmo que encontre a frequência de letras em um determinado texto.

Tips til framgangsmåte
  1. Comece com uma função que recebe um texto (pode ser qualquer coisa).
  2. Na função, crie um “dicionário” (Python Dictionaries), com entradas para cada letra do alfabeto, definido como 0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0})
  3. Percorra todo o texto e conte cada letra (aumente em 1 na entrada correspondente no dicionário). Aqui você provavelmente deve ignorar caracteres que não são letras, lembre-se também de letras maiúsculas e minúsculas.
  4. Mantenha o controle de quantas letras foram contadas no total.
  5. Quando terminar de contar, divida / cada valor na tabela pelo comprimento do texto e, em seguida, multiplique por 100, isso lhe dará uma frequência percentual. (Você pode, é claro, deixar sua tabela acima entre 0 e 1).
  6. Agora você deve ter uma tabela de frequência para o texto.

Medium Tarefa 2.3 - Comparar a frequência de um texto com a frequência real

Quando você tiver encontrado a frequência de todas as letras no texto, pode criar uma função que encontra a “distância”. Hã? O que isso significa?!

Você pode imaginar que a frequência de, por exemplo, E no texto será um número. Você pode encontrar a “distância” que este tem com a frequência real, que é 12.70. Exemplo: A frequência é 9.63, qual é a distância? A distância será o valor absoluto (números negativos tornam-se positivos) entre estes dois valores: \(12.70 - 9.63 = 3.07\).

Crie uma função que percorra cada uma das letras e encontre a distância. Em seguida, some todas as distâncias para uma distância “total”.

Função matemática?

Se você está se perguntando como a função matemática para isto é, ela se parece com isto:

\(\sum_{n=0}^{N} \lvert a - b\rvert\)

Dicas de procedimento
  1. Use um for-loop para percorrer toda a tabela de frequência.
  2. Para cada letra na tabela de frequência, encontre o valor absoluto em comparação com a frequência real. Use a função abs() em Python para isso.
  3. Some todos os valores, e você terá um resultado final.

Hard Tarefa 2.4 - “Quebrar” a Cifra de César

Agora vamos finalmente juntar tudo o que fizemos até agora! Agora vamos “quebrar” uma Cifra de César.

Crie um programa que “quebre” uma Cifra de César! Sem influência do usuário, você deve ser capaz de inserir um texto criptografado e obter o texto descriptografado sem precisar de uma chave.

Test data

Aqui estão alguns dados de teste que você pode usar, o que você diz sobre eles?

Test-data
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha

Dicas para o procedimento
  1. Comece criando uma função que recebe texto.
  2. Use a função de decriptação para a cifra de César com rotação N no texto, N começando em 0.
  3. Crie uma tabela de frequência do resultado
  4. Descubra a distância do resultado em relação à tabela de frequência real
  5. Ou: a) mantenha o controle da distância em uma lista, ou b) mantenha o controle do valor mínimo e da rotação (esta será a chave)
  6. Aumente a rotação em 1 e repita os passos 2 a 6 até que N atinja 26 (rotação completa).
  7. Retorne o texto descriptografado, ou seja, a menor distância é a chave correta.