• 0
Sign in to follow this  
Henrique Menna

Criptografia

Question

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

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0
Guest

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? 

Share this post


Link to post
Share on other sites
  • 0
Guest

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

Share this post


Link to post
Share on other sites
  • 0
Guest

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

 

Edited by Guest
Falha na internet

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this