Cifra de Cesar - Cripto-Analise
Publicado por Felipe (última atualização em 07/10/2016)
[ Hits: 3.429 ]
A Cifra de César usa de um sistema de substituição monoalfabético, onde cada letra leva um valor (a=0,z=25) que é substituído modularmente com a soma de uma chave(0,25).
C=E(k,p) = (k+p)mod26
Esta cifra é facilmente quebrada aplicando um analise de frequência nos caracteres do texto cifrado.
O script abaixo recebe duas entradas uma chave(0,25) e um texto claro podendo ter espaços e letras maiúsculas e minusculas, através disso gera um texto cifrado.
A criptoanálise é feita achando os caracteres de texto cifrado com maior repetições e substituindo com os caracteres que mais aparecem na linguá Portuguesa, gerando 5 possíveis textos claro.
Há um problema nessa criptoanalise, apesar da cifra de César ser fácil quebrar se o texto claro for muito pequeno dificultara bons resultados imediatos.
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> typedef struct sDados { int chave; int max_freq[5]; int rep[26]; char alf[26]; char txt_claro[200]; char txt_cifrado[200]; char pos_txt[5][200]; }Dados; int zerar_txts(Dados * dados) { int i; strcpy(dados->txt_claro,""); strcpy(dados->txt_cifrado,""); for(i=0;i<5;i++) { strcpy(dados->pos_txt[i],""); } } int iniciar_dados(Dados * dados) { int i; dados->max_freq[0] = 97; dados->max_freq[1] = 101; dados->max_freq[2] = 105; dados->max_freq[3] = 111; dados->max_freq[4] = 115; strcpy(dados->alf,"abcdefghijklmnopqrstuvwxyz"); for(i=0;i<26;i++) { dados->rep[i] = 0; } } void imprime(Dados * dados) { int i, n; printf("\nChave: %d\n",dados->chave); printf("Texto Claro: %s\n",dados->txt_claro); printf("Texto Cifrado: %s\n\n",dados->txt_cifrado); printf("Repeticoes"); for(i=0;i<10;i++) { printf(" %c = %d |",dados->alf[i],dados->rep[i]); } printf("\n\nPossiveis texto-claro\n"); for(n=0;n<5;n++) { for(i=0;i<strlen(dados->txt_cifrado);i++) { printf("%c",dados->pos_txt[n][i]); } printf("\n"); } } int M_m(Dados * dados) { int i; for(i=0;i<strlen(dados->txt_claro);i++) { dados->txt_claro[i] = tolower(dados->txt_claro[i]); } } int cifrar(Dados * dados) { int i, c; for(i=0;i<strlen(dados->txt_claro);i++) { if(dados->txt_claro[i] == ' ') { dados->txt_cifrado[i] = ' '; } else { c=(int)dados->txt_claro[i]+dados->chave; if(c > 122) { c = c-26; dados->txt_cifrado[i] = c; } else { dados->txt_cifrado[i] = c; } } } } int conta_rep(Dados * dados) { int i, n; for(i=0;i<26;i++) { for(n=0;n<strlen(dados->txt_cifrado);n++) { if(dados->alf[i]==dados->txt_cifrado[n]) { dados->rep[i]++; } } } } int ord_rep(Dados * dados) { int i, n, v_max; char c; for(i=0;i<26;i++) { for(n=(i+1);n<26;n++) { if(dados->rep[i]<dados->rep[n]) { v_max = dados->rep[i]; c = dados->alf[i]; dados->rep[i] = dados->rep[n]; dados->alf[i] = dados->alf[n]; dados->rep[n] = v_max; dados->alf[n] = c; } } } } int cripto_analise(Dados * dados) { int i, n,cifra, tc; char c; c = dados->alf[0]; for(n=0;n<5;n++) { cifra = (int)c - dados->max_freq[n]; for(i=0;i<strlen(dados->txt_cifrado);i++) { if(dados->txt_cifrado[i] == ' ') { dados->pos_txt[n][i] = ' '; } else { tc =(int)dados->txt_cifrado[i]-cifra; if(tc < 97) { tc = tc + 26; dados->pos_txt[n][i] = tc; } if(tc > 122) { tc = tc - 26; dados->pos_txt[n][i] = tc; } else { dados->pos_txt[n][i] = tc; } } } } } int menu(Dados * dados) { int op; do { printf("\n1-)Incluir chave\n"); printf("2-)Incluir texto\n"); printf("3-)Cifrar\n"); printf("4-)Cripto-Analise\n"); printf("5-)Imprimir\n"); printf("0-)Sair\n"); scanf("%d",&op); switch(op) { case 1: { do { printf("Digite a chave\n"); scanf("%d",&dados->chave); }while(dados->chave > 25); break; } case 2: { printf("Digite a mensagem\n"); setbuf(stdin,NULL); scanf("%[^\n]",dados->txt_claro); M_m(dados); break; } case 3: { cifrar(dados); break; } case 4: { iniciar_dados(dados); conta_rep(dados); ord_rep(dados); cripto_analise(dados); break; } case 5: { imprime(dados); break; } } }while(op!=0); } int main() { Dados * dados = (Dados *)malloc(sizeof(Dados)); menu(dados); free(dados); }
Cálculo da chave secreta do protocolo Diffie-Hellmann
Spieluhr - esse código pode ser considerado um vírus?
Captura de Banners dos Serviços
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta