El cifrado de Playfair es un
ejemplo de sustitución digrámica, donde un par de letras de un texto en claro
(mensaje sin codificar) se convierten en otro par distinto, para de esta forma
codificar información que no deseamos sea leída.
El cifrado de Playfair trabaja con una matriz de 5x5
letras, cifrando por digramas (bloques de a dos caracteres).
IMPLEMENTACIÓN:
#include < iostream > #include < string.h > #include < stdio.h > #include < stdlib.h > #include < conio.h > using namespace std; bool comparar(char *clave,char a,int k){ for(int i=0;i < k;i++){ if(clave[i]==a) return false; } return true; } char *preMatriz(char *clave,char *letras,char *textCpy){ int k=0,i=0; bool band=true; while(k < 25){ if(clave[k]=='j') clave[k]='i'; if(clave[k]!='\0' && band==true){ if(clave[k]!=' ' && clave[k] > 96 && clave[k] < 123){ if(comparar(clave,clave[k],k)){ textCpy[i]=clave[k]; i++; } } } else{ if(band==true) k=0; band=false; if(comparar(textCpy,letras[k],i)){ textCpy[i]=letras[k]; i++; } } k++; } textCpy[25]='\0'; //cout < < "i: " < < i; return textCpy; } char *agrupar(char *text,char *textAgru){ int k=0,i=0; int cont=0; while(text[k]!='\0'){ if(text[k]=='j') text[k]='i'; if(text[k]!=' '){ if(cont!=2){ textAgru[i]=text[k]; cont++; i++; } else{ if(textAgru[i-2]==textAgru[i-1]){ textAgru[i-1]='x'; textAgru[i]=' '; textAgru[i+1]=text[k-1]; k--; i+=2; cont=1; } else{ textAgru[i]=' '; textAgru[i+1]=text[k]; i+=2; cont=1; } } } k++; } //cout < < "i: " < < i < < "\n"; if(textAgru[i-2]==' '){ textAgru[i]='x'; textAgru[i+1]='\0'; } else textAgru[i]='\0'; return textAgru; } void algoCifradoPlaySyFair(char *text,char *clave,char *letras){ char textCpy[25]; char textAgru[500]; char matriz[5][5]; int k=0,m=0,sum1,sum2; int f1,f2,c1,c2; bool band1=true,band2=true; strcpy(textCpy,preMatriz(clave,letras,textCpy)); for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++){ matriz[i][j]=textCpy[k]; k++; } } strcpy(textAgru,agrupar(text,textAgru)); cout < < "\n" < < textAgru; while(textAgru[m]!='\0'){ for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++){ if(matriz[i][j]==textAgru[m] && band1==true){ f1=i; c1=j; band1=false; } if(matriz[i][j]==textAgru[m+1] && band2==true){ f2=i; c2=j; band2=false; } } } if(f1==f2){ sum1=c1+1; sum2=c2+1; if(sum1 > 4) textAgru[m]=matriz[f1][0]; else textAgru[m]=matriz[f1][c1+1]; if(sum2 > 4) textAgru[m+1]=matriz[f2][0]; else textAgru[m+1]=matriz[f2][c2+1]; } else if(c1==c2){ sum1=f1+1; sum2=f2+1; if(sum1 > 4) textAgru[m]=matriz[0][c1]; else textAgru[m]=matriz[f1+1][c1]; if(sum2 > 4) textAgru[m+1]=matriz[0][c2]; else textAgru[m+1]=matriz[f2+1][c2]; }else{ textAgru[m]=matriz[f1][c2]; textAgru[m+1]=matriz[f2][c1]; } m=m+3; band1=true; band2=true; } cout < < "\n\n"; for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++) cout < < matriz[i][j] < < " "; cout < < endl; } cout < < "\n" < < textAgru; } void descifradoPlaySyFair(char *text,char *clave,char *letras){ char textCpy[25]; char textAgru[500]; char matriz[5][5]; int k=0,m=0,sum1,sum2; int f1,f2,c1,c2; bool band1=true,band2=true; strcpy(textCpy,preMatriz(clave,letras,textCpy)); for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++){ matriz[i][j]=textCpy[k]; k++; } } strcpy(textAgru,agrupar(text,textAgru)); cout < < "\n" < < textAgru; while(textAgru[m]!='\0'){ for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++){ if(matriz[i][j]==textAgru[m] && band1==true){ f1=i; c1=j; band1=false; } if(matriz[i][j]==textAgru[m+1] && band2==true){ f2=i; c2=j; band2=false; } } } if(f1==f2){ sum1=c1-1; sum2=c2-1; if(sum1 < 0) textAgru[m]=matriz[f1][4]; else textAgru[m]=matriz[f1][c1-1]; if(sum2 < 0) textAgru[m+1]=matriz[f2][4]; else textAgru[m+1]=matriz[f2][c2-1]; } else if(c1==c2){ sum1=f1-1; sum2=f2-1; if(sum1 < 0) textAgru[m]=matriz[4][c1]; else textAgru[m]=matriz[f1-1][c1]; if(sum2 < 0) textAgru[m+1]=matriz[4][c2]; else textAgru[m+1]=matriz[f2-1][c2]; }else{ textAgru[m]=matriz[f1][c2]; textAgru[m+1]=matriz[f2][c1]; } m=m+3; band1=true; band2=true; } cout < < "\n\n"; for(int i=0;i < 5;i++){ for(int j=0;j < 5;j++) cout < < matriz[i][j] < < " "; cout < < endl; } cout < < "\n" < < textAgru; } int main() { char letras[25]={'a','b','c','d','e', 'f','g','h','i','k', 'l','m','n','o','p', 'q','r','s','t','u', 'v','w','x','y','z'}; char text[500]; char clave[250]; int n; int opcion; cout < < "\t\tALGORITMO PLAYFAIR"; 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 < < "\t\tALGORITMO PLAYFAIR - CIFRAR\n"; cout < < "INGRESAR TEXTO(SIN ESPACIOS): "; fflush(stdin); gets(text); cout < < "INGRESE CLAVE: "; fflush(stdin); gets(clave); algoCifradoPlaySyFair(text,clave,letras); getch(); break; } case 2: { system("cls"); cout < < "\t\tALGORITMO PLAYFAIR - DESCIFRAR\n"; cout < < "INGRESAR TEXTO(SIN ESPACIOS): "; fflush(stdin); gets(text); cout < < "INGRESE CLAVE: "; fflush(stdin); gets(clave); descifradoPlaySyFair(text,clave,letras); getch(); break; } } } system("pause"); }
0 comentarios: