Cifra de Vigenère
Publicado por Felipe (última atualização em 07/10/2016)
[ Hits: 11.904 ]
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
/*
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);
}
Código C para gerar hashes DES e MD5
Faz um crash no Kernel do Linux
Captura de Banners dos Serviços
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (6)
O programa assinador digital (5)









