El cifrado de Vernam también llamado máscara desechable es
parecido al cifrado de Vigenère solo que aquí la clave es aleatoria y tan larga
como el mensaje, además se debe utilizar una sola vez. Claude Shannon en su
trabajo “Teoría de las comunicaciones secretas” demostró que estas
características hacen que este cifrado sea perfectamente seguro ya que no hay
manera de criptoanalizarlo (es matemáticamente complicado).
En este
criptosistema tanto el texto plano, el texto cifrado y la clave son números
modulo 2 (binario).
El método
de cifrado y descifrado utilizan la función lógica XOR.
La
longitud del texto (plano o cifrado) es obligatoriamente igual a la longitud de
la clave.
Implementación
#include < iostream > #include < bitset > #include < string.h > #include < stdio.h > #include < stdlib.h > #include < conio.h > using namespace std; void algorCifraVernam(char *cadena, char *clave){ char textEn[100]; int tamCad,tamCla,cad,clav; int output[100][100]; tamCad=strlen(cadena); tamCla=strlen(clave); strcpy(textEn,cadena); if(tamCad==tamCla){ for(int i=0;i < tamCad;i++){ for(int j=0;j < 7;j++){ cad=(cadena[i] > > (6-j))&1; clav=(clave[i] > > (6-j))&1; output[i][j]=cad^clav; } } cout < < "TEXTO CIFRADO: "; for(int i=0;i < tamCad;i++){ for(int j=0;j < 7;j++) if(j==6) {cout < < output[i][j];} } cout < < "\n"; }else cout < < "LA LONGUITUD DE LA CADENA Y LA CLAVE DEBE DE SER LA MISMA"; } void descripVernam(char *cadena, char *clave){ char textEn[100]; int tamCad,tamCla; int output[100]; tamCad=strlen(cadena); tamCla=strlen(clave); strcpy(textEn,cadena); if(tamCad==tamCla){ for(int i=0;i < tamCad;i++){ output[i]=cadena[i]^clave[i]; } cout < < "TEXTO DESCIFRADO: "; for(int i=0;i < tamCad;i++){ cout < < output[i]; } cout < < "\n"; }else cout < < "LA LONGUITUD DE LA CADENA Y LA CLAVE DEBE DE SER LA MISMA"; } int main() { char cadena[100]; char clave[100]; int opcion; while(1) { system("cls"); cout < < "\n\t\tALGORITMO DE VERNAM\n\n"; cout < < "1. ENCRIPTAR\n"; cout < < "2. DESENCRIPTAR\n"; cout < < "INGRESE OPCION: "; cin > > opcion; switch(opcion) { case 1: { system("cls"); cout < < "\n\t\tALGORITMO DE VERNAM - CIFRADO \n\n"; cout < < "INGRESE TEXTO: "; fflush(stdin); gets(cadena); cout < < "INGRESE CLAVE: "; fflush(stdin); gets(clave); algorCifraVernam(cadena,clave); getch(); break; } case 2: { system("cls"); cout < < "\n\t\tALGORITMO DE VERNAM - DESCIFRADO \n\n"; cout < < "INGRESE TEXTO: "; fflush(stdin); gets(cadena); cout < < "INGRESE CLAVE: "; fflush(stdin); gets(clave); descripVernam(cadena,clave); getch(); break; } } } system("pause"); }
0 comentarios: