sábado, 25 de julio de 2015

CIFRADO DE VERNAM

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");
}


banner
Previous Post
Next Post

Hola, me llamo Andrés.Soy egresado de la carrera de Ingeniería Informática en la Universidad Nacional de Trujillo (Perú).Me considero autodidacta de corazón ,amante del mundo de la programación, software libre y hacking ético

0 comentarios: