Cifra de Vigenère
Publicado por Felipe (última atualização em 07/10/2016)
[ Hits: 11.593 ]
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); }
Faz um crash no Kernel do Linux
genpass - gerador de senhas seguras
Esse código pode ser considerado um vírus?
Nenhum comentário foi encontrado.
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Minha rede tem um espaço invisível que não dá pra digitar o nome da re... (1)
Pedagogia no brasil não passa de alfabetização por m4sturbação mental ... (2)
compilação samba 4.22 rock linux 9.5 (3)
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (7)