Cifra de Vigenère

Publicado por Felipe (última atualização em 07/10/2016)

[ Hits: 11.422 ]

Download 6507.teste.c




Código para gerar cifra de Vigenère em C com opção de auto-chave!

Esta cifra faz soma do carácter da chave com seu correspondente no texto claro a cifra é gerada encontrando seu correspondente em uma cifra de César tendo como chave o carácter da chave de Vigenère, a chave de Vigenère é gerada através de uma palavra que se repete ate atingir o tamanho do texto claro, Vegenère também propôs uma auto-chave que seria a chave sendo preenchida com o próprio texto claro ate atingir seu tamanho, assim dificultando a cripto-analise.

Equação:

C = C¹ + C² = E(K,P) = E[(k¹,K² ),(P¹,P²)] = (P¹+P¹) mod 26, (P² +P² ) mod 26

  



Esconder código-fonte

/*
CIFRA DE VIGENERE FEITA POR F. M.G.
*/

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

typedef struct sDados
   {
   char chave[200];
   char texto_claro[200];
   char texto_cifrado[200];
   }Dados;

/*
PEGA A CHAVE E VERIFICA CARACTER POR CARACTER PARA ENCONTRAR
ESPAÇO EM BRANCO, CASO ENCONTRE COPIA TODOS CARACTERES DO
ESPAÇO EM BRANCO PRA FRENTE UMA CASA A MENOS NO VETOR, REMOVENDO 
ASSIM ESPAÇOS EM BRANCO NA CHAVE.
*/
int pega_chave(Dados * dados)
   {
   strcpy(dados->chave,"");
   int c, i = 0;
   printf("Chave:\n");
   setbuf(stdin,NULL);
   scanf("%[^\n]",dados->chave);
   for(i=0;i<strlen(dados->chave);i++)
      {
      if(dados->chave[i] == ' ')
         {
         for(c=i;c<strlen(dados->chave);c++)
            {
            dados->chave[c] = dados->chave[c+1];
            }
         }
      else
         {
         dados->chave[i] = dados->chave[i];
         }
      }
   }

int pega_texto(Dados * dados)
   {
   printf("Texto Claro:\n");
   setbuf(stdin,NULL);
   scanf("%[^\n]",dados->texto_claro);
   }

/*
O PRIMEIRO FOR FAZ COM A QUE CHAVE SE REPITA ATE QUE SEU TAMANHO
SE IGUALE COM O TAMANHO DO TEXTO CLARO.
NO SEGUNDO FOR É CRIADO UM I PARA PERCORRER AS STRINGS E UM C
QUE VAI PERCORRER A CHAVE.
O PRIMEIRO IF VERIFICA SE HA UM ESPAÇO EM BRANCO CASO SIM
ELE É COPIADO NO T$ E C RECEBE -1 ASSIM NO PROXIMO PASSO
SE HOUVER UM CARACTER EM TCLARO[I] SERA SOMADO COM SEU
CORRESPONDENTE NA CHAVE
*/
int cifrar(Dados * dados)
   {
   int i,car, c=0, t=strlen(dados->chave);
   for(i=strlen(dados->chave);i<strlen(dados->texto_claro)+1;i++)
      {
      dados->chave[i] = dados->chave[c];
      c++;
      if(c==t)
         {
         c=0;
         }
      }
   for(i=0,c=0;i<strlen(dados->texto_claro);i++,c++)
      {
      if(dados->texto_claro[i] == ' ')
         {
         dados->texto_cifrado[i] = ' ';
         c--;
         }
      else 
         {
         car=(int)dados->texto_claro[i]+dados->chave[c]-97;
         if(car > 122)
            {
            car = car - 26;
            dados->texto_cifrado[i] = car;
            }
         else
            {
            dados->texto_cifrado[i] = car;
            }
         }
      }
   }

/*
PREENCHE A CHAVE COM O TEXTO CLARO
*/
int cifrar_auto(Dados * dados)
   {
   int i,car, c=0, t=strlen(dados->chave);
   for(i=strlen(dados->chave), c=0;i<strlen(dados->texto_claro);i++,c++)
      {
      if(dados->texto_claro[c] == ' ')
         {
         i--;
         }
      else
         {
         dados->chave[i] = dados->texto_claro[c];
         }
      }
   for(i=0,c=0;i<strlen(dados->texto_claro);i++,c++)
      {
      if(dados->texto_claro[i] == ' ')
         {
         dados->texto_cifrado[i] = ' ';
         c--;
         }
      else 
         {
         car=(int)dados->texto_claro[i]+dados->chave[c]-97;
         if(car > 122)
            {
            car = car - 26;
            dados->texto_cifrado[i] = car;
            }
         else
            {
            dados->texto_cifrado[i] = car;
            }
         }
      }
   }

void imprime(Dados * dados)
   {
   printf("Chave: %s\n",dados->chave);
   printf("Texto Claro: %s\n",dados->texto_claro);
   printf("Texto Cifrado: %s\n",dados->texto_cifrado);
   }

int menu(Dados * dados)
   {
   int op;
   do
      {
      printf("1-)Chave\n");
      printf("2-)Texto Claro\n");
      printf("3-)Cifrar\n");
      printf("4-)Cifrar com auto-chave\n");
      printf("5-)Imprime\n");
      scanf("%d",&op);
      switch(op)
         {
         case 1:
            {
            pega_chave(dados);
            break;
            }
         case 2:
            {
            pega_texto(dados);
            break;
            }
         case 3:
            {
            cifrar(dados);
            break;
            }
         case 4:
            {
            cifrar_auto(dados);
            break;
            }
         case 5:
            {
            imprime(dados);
            break;
            }
         }
      }while(op != 0);
   }

int main()
   {
   Dados * dados = (Dados *)malloc(sizeof(Dados));
   menu(dados);
   free(dados);
   }

Scripts recomendados

DoS Syn flood

Gerador de senhas

Captura de Banners dos Serviços

[C] Criptografia por Inversão de bits

DoS criado em C para uso didáticos


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts