Cifra de Vigenère

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

[ Hits: 10.960 ]

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

Cryptbit

Cálculo da chave secreta do protocolo Diffie-Hellmann

Esse código pode ser considerado um vírus?

Spieluhr - esse código pode ser considerado um vírus?

Captura de Banners dos Serviços


  

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