Ir para conteúdo
Fórum Script Brasil
  • 0

Criptografia


Henrique Menna

Pergunta

Escrever um programa, em linguagem C, que permita decifrar um determinado texto, escrito em língua portuguesa e que foi cifrado por um método de substituição mono-alfabético.

 

A tarefa será executada sem se conhecer a chave de substituição que deu origem ao texto cifrado.

 

A técnica para realizar o ataque tem como base a análise estatística dos caracteres da língua portuguesa. Por exemplo, o carácter que aparece mais vezes num texto de língua portuguesa é o a. Então, o símbolo que aparecer mais vezes na mensagem cifrada terá que corresponder ao original a. O segundo símbolo com maior frequência é o e e pela mesma lógica o símbolo com a segunda maior taxa de ocorrência na mensagem
cifrada corresponderá à letra original e. Para que este método de ataque funcione, o texto a decifrar terá que ser suficientemente longo. 


O texto a decifrar:

cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcncbfmxcmzsnenkcgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbmfocnczxbzmjifsziezmmcszsrfmkcgfsxcjsgfpezbmfxzvjccrfmkchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzjnfpezvcnvfseowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfmcxgjwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsjccngcmcxgzacsvcngfzcpezwzspezbfmfomcsacwzmfscsszacfgcwzjgcxfmvzwjozmvcngfkcnvcngfzsbcwhcmzjbfmvfgcbcmvzszcvcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifzgfvmfjcnfcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmcycnfcrcxcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmzwesjvcnfcpezxnzbvenfzxcmvzfozgzkzmcxkzsszvegffpezcxesccnvjickcnvcpezfevmfacwfmxcjscwvfszcwzacnvczafsvcijgzsxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxbmzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcjxzcifmcexsfxcwvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvzbfmpezgzafsscsciecsrzoffmgznzpezncfvznhcxznazyccsgzhjbfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzcimzsvzcazncfermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzckfmcfizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafsscpezcxcmvzvcnvfcyegcpezszzsbcwhzzszkcnvznfenjazmsfszvcfseowjxzbmzkfkcozzxazmsfzafsfozxncskjgcsziemcnkcgcwesjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgzcexznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxcmcajwhcrcvcwgcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcngzbzmcgfxengfcgzesgcmbcmvzimcngz

 

Tenha em atenção que, para simplificação, o texto fornecido não contém espaços, nem caracteres acentuados, nem caracteres de pontuação. Assim, o programa escrito em linguagem C não deverá apresentar o texto decifrado com espaços, nem com caracteres acentuados e nem com
caracteres de pontuação.


 

Para se construir o programa suponha-se que a sequência seguinte apresenta a ordem decrescente (da esquerda para a direita) da frequência dos caracteres na língua portuguesa:

 

a e o s r d n i t m u l c v p g q b f h j x z k y w
alguidem poderia me ajudar?

Capturar.JPG

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Olá. Para o exemplo postado na pergunta está dando certo, mas para o texto a ser decifrado negativo

Dá uma olhada no código para ver se é isso mesmo. Estou meio confuso com relação a que texto colocar para ser decifrado, mas, ao que parece, estava fazendo ao contrário. Olhe para a string "teste" no código, é ela q está sendo usada para o teste

Segue o código:

 

#include <stdio.h>
#include <string.h>

int main()
{
    char frase[] = { "cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcn"
                "cbfmxcmzsnenkcgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbm"
                "focnczxbzmjifsziezmmcszsrfmkcgfsxcjsgfpezbmfxzvjccrfm"
                "kchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzjnfpezvcnvfs"
                "eowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfm"
                "cxgjwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsj"
                "ccngcmcxgzacsvcngfzcpezwzspezbfmfomcsacwzmfscsszacfgc"
                "wzjgcxfmvzwjozmvcngfkcnvcngfzsbcwhcmzjbfmvfgcbcmvzszc"
                "vcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifzgfvmfjcn"
                "fcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmc"
                "ycnfcrcxcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmz"
                "wesjvcnfcpezxnzbvenfzxcmvzfozgzkzmcxkzsszvegffpezcxes"
                "ccnvjickcnvcpezfevmfacwfmxcjscwvfszcwzacnvczafsvcijgz"
                "sxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxb"
                "mzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcj"
                "xzcifmcexsfxcwvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvz"
                "bfmpezgzafsscsciecsrzoffmgznzpezncfvznhcxznazyccsgzhj"
                "bfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzcimzsvzcazncf"
                "ermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzck"
                "fmcfizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafs"
                "scpezcxcmvzvcnvfcyegcpezszzsbcwhzzszkcnvznfenjazmsfsz"
                "vcfseowjxzbmzkfkcozzxazmsfzafsfozxncskjgcsziemcnkcgcw"
                "esjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgzc"
                "exznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxc"
                "mcajwhcrcvcwgcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcn"
                "gzbzmcgfxengfcgzesgcmbcmvzimcngz"};

    int size,i;
    char texto[2000];
    char teste[] = { "otesouroestanaestig" };

    size = strlen(teste);

    strcpy(texto, teste);

    for(i = 0; i < size; i++)
    {
        switch (texto[i])
        {
        case 'a':
            texto[i] = 'w';
            break;
        case 'b':
            texto[i] = 'm';
            break;
        case 'c':
            texto[i] = 'a';
            break;
        case 'd':
            texto[i] = 't';
            break;
        case 'e':
            texto[i] = 'k';
            break;
        case 'f':
            texto[i] = 'z';
            break;
        case 'g':
            texto[i] = 'i';
            break;
        case 'h':
            texto[i] = 'n';
            break;
        case 'i':
            texto[i] = 'l';
            break;
        case 'j':
            texto[i] = 'b';
            break;
        case 'k':
            texto[i] = 'h';
            break;
        case 'l':
            texto[i] = 'x';
            break;
        case 'm':
            texto[i] = 'g';
            break;
        case 'n':
            texto[i] = 'p';
            break;
        case 'o':
            texto[i] = 'e';
            break;
        case 'p':
            texto[i] = 'f';
            break;
        case 'q':
            texto[i] = 'c';
            break;
        case 'r':
            texto[i] = 'j';
            break;
        case 's':
            texto[i] = 'o';
            break;
        case 't':
            texto[i] = 's';
            break;
        case 'u':
            texto[i] = 'q';
            break;
        case 'v':
            texto[i] = 'r';
            break;
        case 'x':
            texto[i] = 'd';
            break;
        case 'w':
            texto[i] = 'v';
            break;
        case 'y':
            texto[i] = 'u';
            break;
        case 'z':
            texto[i] = 'y';
            break;
        }
    }

    printf("Novo texto: %s\n", texto);
}

Agora, caso seja isso mesmo q tenha q ser feito, a questão é saber qual a chave para decifrar o conteúdo dado como exercício.

Mas, conhecendo agora a lógica d como fazer, quem sabe você consegue. Manda bala aí! 

Exemplo de saída:

Novo texto: eskoeqjekoswpwkosli

 

 

Se for ao contrário me desculpa. Mas deu trabalho isso 

Se for ao contrário me desculpa. Mas deu trabalho isso 

Só q fica para você a parte de descobrir a chave q está sendo usada para o texto a ser decifrado.

Até gostaria d fazer algo assim, mas o problema é o tempo mesmo. Teria dar uma pausa nos meus estudos para fazer isso e não vejo q seria uma boa ideia essa

Se deu p ajudar avisa, ok? 

Só q fica para você a parte de descobrir a chave q está sendo usada para o texto a ser decifrado.

Até gostaria d fazer algo assim, mas o problema é o tempo mesmo. Teria dar uma pausa nos meus estudos para fazer isso e não vejo q seria uma boa ideia essa

Se deu p ajudar avisa, ok? 

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, amigo. Fiz a correção necessária para o exemplo q estou usando. Peguei a mensagem cifrada e por meio do código decifrei a mesma, que é o exemplo passado na descrição do exercício

O texto que estou usando para ser decifrado é esse: "eskoeqjekoswpwkosli" baseado na chave que foi dada como exemplo

Segue o código:

 

#include <stdio.h>
#include <string.h>

int main()
{
    char frase[] = { "cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcn"
                "cbfmxcmzsnenkcgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbm"
                "focnczxbzmjifsziezmmcszsrfmkcgfsxcjsgfpezbmfxzvjccrfm"
                "kchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzjnfpezvcnvfs"
                "eowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfm"
                "cxgjwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsj"
                "ccngcmcxgzacsvcngfzcpezwzspezbfmfomcsacwzmfscsszacfgc"
                "wzjgcxfmvzwjozmvcngfkcnvcngfzsbcwhcmzjbfmvfgcbcmvzszc"
                "vcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifzgfvmfjcn"
                "fcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmc"
                "ycnfcrcxcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmz"
                "wesjvcnfcpezxnzbvenfzxcmvzfozgzkzmcxkzsszvegffpezcxes"
                "ccnvjickcnvcpezfevmfacwfmxcjscwvfszcwzacnvczafsvcijgz"
                "sxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxb"
                "mzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcj"
                "xzcifmcexsfxcwvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvz"
                "bfmpezgzafsscsciecsrzoffmgznzpezncfvznhcxznazyccsgzhj"
                "bfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzcimzsvzcazncf"
                "ermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzck"
                "fmcfizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafs"
                "scpezcxcmvzvcnvfcyegcpezszzsbcwhzzszkcnvznfenjazmsfsz"
                "vcfseowjxzbmzkfkcozzxazmsfzafsfozxncskjgcsziemcnkcgcw"
                "esjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgzc"
                "exznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxc"
                "mcajwhcrcvcwgcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcn"
                "gzbzmcgfxengfcgzesgcmbcmvzimcngz"};

    int size,i;
    char texto[2000];
    char teste[] = {"eskoeqjekoswpwkosli"}; // mensagem cifrada que está sendo usada como exemplo

    size = strlen(teste);

    strcpy(texto, teste); // copia o conteúdo da string teste para a string texto

    for(i = 0; i < size; i++)
    {
        switch (texto[i])
        {
        case 'w':         // em cada case vai o código a ser usado para decifrar a mensagem, no caso, caracteres
            texto[i] = 'a';
            break;
        case 'm':
            texto[i] = 'b';
            break;
        case 'a':
            texto[i] = 'c';
            break;
        case 't':
            texto[i] = 'd';
            break;
        case 'k':
            texto[i] = 'e';
            break;
        case 'z':
            texto[i] = 'f';
            break;
        case 'i':
            texto[i] = 'g';
            break;
        case 'n':
            texto[i] = 'h';
            break;
        case 'l':
            texto[i] = 'i';
            break;
        case 'b':
            texto[i] = 'j';
            break;
        case 'h':
            texto[i] = 'k';
            break;
        case 'x':
            texto[i] = 'l';
            break;
        case 'g':
            texto[i] = 'm';
            break;
        case 'p':
            texto[i] = 'n';
            break;
        case 'e':
            texto[i] = 'o';
            break;
        case 'f':
            texto[i] = 'p';
            break;
        case 'c':
            texto[i] = 'q';
            break;
        case 'j':
            texto[i] = 'r';
            break;
        case 'o':
            texto[i] = 's';
            break;
        case 's':
            texto[i] = 't';
            break;
        case 'q':
            texto[i] = 'u';
            break;
        case 'r':
            texto[i] = 'v';
            break;
        case 'd':
            texto[i] = 'x';
            break;
        case 'v':
            texto[i] = 'w';
            break;
        case 'u':
            texto[i] = 'y';
            break;
        case 'y':
            texto[i] = 'z';
            break;
        }
    }

    printf("texto decifrado: %s\n", texto);
}

Coloquei alguns comentários para q você consiga entender melhor o q está acontecendo

A saída ao executar esse código é essa:

texto decifrado: otesouroestanaestig

Link para o comentário
Compartilhar em outros sites

  • 0

Já deu para chegar a esse resultado com ralação a quantidade de vezes q uma letra aparece no texto:

 

// letra a = 25, b = 25, c = 215, d = 0, e = 58, f = 129, g = 79, h = 10, i = 24, j = 68, k = 34, l = 0, m = 89, n = 79, o = 17, p = 20, q = 1
// letra r = 15, s = 104, t = 1, u = 0, v = 68, x = 63, w = 36, y = 4, z = 193

a questão agora é trabalhar na substituição de maneira adequada

A letra "c" é a q aparece mais vezes. Logo, presumi-se q equivale a letra "a", e assim vai

 

Editado por Visitante
Falha na internet
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...