Cifra de Vigenère
Publicado por Felipe (última atualização em 07/10/2016)
[ Hits: 11.422 ]
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); }
Captura de Banners dos Serviços
[C] Criptografia por Inversão de bits
DoS criado em C para uso didáticos
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)