comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Playfair

  • 5 Respuestas
  • 2796 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil
« en: Marzo 04, 2014, 08:34:13 am »
Estaba en esto de querer aprender c plus plus y alguien me recomendo que hiciera este cifrado como ejercicio, dejo el código por si a alguien le sirve o mejor aún si a alguien se le ocurre una forma mejor

El cifrado playfair es ... bueno, es complicado de explicar, ya que va sustituyendo de a pares, usando una matriz de 5 x 5 que es generada por una clave y que contiene las letras del abecedario, salvo una , ya que son 26 letras y 5 x5 = 25, y despues aplica al mensaje un par de reglas para hacer la sustitución... mucho mejor les dejo el link a la wikipedia :D You are not allowed to view links. Register or Login y en esta página puedes verlo en funcionamiento You are not allowed to view links. Register or Login

Código: C++
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. class PlayFair{
  8.   private:
  9.     char matriz[5][5];
  10.   public:
  11.     string cifrado(string, int);
  12.     string descifrar(string);
  13.     int inMatriz(char);
  14.     void limpiaMatriz();
  15.     void setMatriz(string);
  16.     void showMatriz();
  17. };
  18.  
  19. int main(){
  20.   string clave,msj;
  21.   PlayFair pf;
  22.  
  23.   cout << "Cifrado PlayFair"<<endl<<endl;
  24.   cout << "introduce la clave > ";
  25.   //getline(cin,clave);
  26.   clave = "playfairexample";
  27.   cout <<endl;
  28.  
  29.   pf.setMatriz(clave);
  30.   pf.showMatriz();
  31.  
  32.   cout << endl;
  33.   cout << "introduce el mensaje a cifrar > ";
  34.   getline(cin,msj);
  35.  
  36.   string cifrado = pf.cifrado(msj,1);
  37.   cout << "Mensaje cifrado : " << cifrado << endl;
  38.   cout << "Msj. descifrado : " << pf.cifrado(cifrado,2) << endl;
  39.  
  40. }
  41.  
  42.  
  43. int PlayFair::inMatriz(char valor){
  44.     for(int i=0;i<5;i++){
  45.       for(int j=0;j<5;j++){
  46.         if(matriz[i][j] == valor){
  47.           return 1;
  48.         }
  49.       }
  50.     }
  51.     return 0;
  52. }
  53.  
  54. void PlayFair::limpiaMatriz(){
  55.   for(int i=0;i<5;i++){
  56.     for(int j=0;j<5;j++){
  57.       matriz[i][j] = ' ';
  58.     }
  59.   }
  60. }
  61.  
  62. void PlayFair::setMatriz(string clave){
  63.   PlayFair::limpiaMatriz();
  64.   int i=0;
  65.   int j=0;
  66.   //coloca la clave en la matriz
  67.   for(int a=0;a<clave.size();a++){
  68.     if(PlayFair::inMatriz(clave[a]) == 0)
  69.       matriz[i][j++] = tolower(clave[a]);
  70.     if (j==5){
  71.       j = 0;
  72.       i++;
  73.     }
  74.   }
  75.   char abc[26]={'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'};
  76.   //termina llenar la matriz con el abecedario
  77.   for(int a=0;a<26;a++){
  78.     if(PlayFair::inMatriz(abc[a]) == 0)
  79.       matriz[i][j++] = abc[a];
  80.     if (j==5){
  81.       j = 0;
  82.       if(i==5){
  83.         continue;
  84.       }
  85.       i++;
  86.     }
  87.   }
  88. }
  89.  
  90. /*
  91. Metodo cifrado -> tipo 1: cifrar, tipo 2: desifrar
  92. */
  93. string PlayFair::cifrado(string msj, int tipo=1){
  94.   string result,msj2;
  95.  
  96.   //Verifica que el mensaje este en la matriz, si 2 caracteres se repiten pone una 'x' en medio, y pasa a minusculas.
  97.   char ant;
  98.   for(int i=0;i<msj.size();i++){
  99.       for(int x=0;x<5;x++){
  100.         for(int y=0;y<5;y++){
  101.           if(matriz[x][y]==tolower(msj[i])){
  102.             if(msj[i]==ant){
  103.                 msj2 += "x";
  104.             }
  105.             msj2 += tolower(msj[i]);
  106.             ant = tolower(msj[i]);
  107.           }
  108.         }
  109.       }
  110.   }
  111.   msj = msj2;
  112.   //Si el largo del mensaje es impar, agrega una 'x' al final.
  113.   if ((msj.size()%2)!=0){
  114.     msj += "x";
  115.   }
  116.  
  117.   //Recorre el msj
  118.   for(int i=0;i<msj.size();i++){
  119.     int j= i+1;
  120.     int pos_x1 = 0;
  121.     int pos_y1 = 0;
  122.     int pos_x2 = 0;
  123.     int pos_y2 = 0;
  124.     int flag = 0;
  125.     int in_fila = 0;
  126.  
  127.     // verifica caracteres en horizontal
  128.     for(int x=0;x<5;x++){
  129.       for(int y=0;y<5;y++){
  130.         if(matriz[x][y]== msj[i]){
  131.           pos_x1 = x;
  132.           if(tipo ==1){
  133.               if(y<4){
  134.                 pos_y1 = y+1;
  135.               }
  136.               else{
  137.                 pos_y1 = 0;
  138.               }
  139.           }
  140.           else{
  141.               if(y>0){
  142.                 pos_y1 = y-1;
  143.               }
  144.               else{
  145.                 pos_y1 = 4;
  146.               }
  147.           }
  148.           in_fila++;
  149.         }
  150.         if(matriz[x][y]== msj[j]){
  151.           pos_x2 = x;
  152.           if(tipo ==1){
  153.               if(y<4){
  154.                 pos_y2 = y+1;
  155.               }
  156.               else{
  157.                 pos_y2 = 0;
  158.               }
  159.           }
  160.           else{
  161.               if(y>0){
  162.                 pos_y2 = y-1;
  163.               }
  164.               else{
  165.                 pos_y2 = 4;
  166.               }
  167.           }
  168.           in_fila++;
  169.         }
  170.       }
  171.       if (in_fila == 2){
  172.         flag = 1;
  173.       }
  174.       in_fila = 0;
  175.     }
  176.  
  177.     // verifica caracteres en vertical
  178.     if (flag==0){
  179.         for(int y=0;y<5;y++){
  180.           for(int x=0;x<5;x++){
  181.             if(matriz[x][y]== msj[i]){
  182.               pos_y1 = y;
  183.               if(tipo==1){
  184.                 if(x<4){
  185.                     pos_x1 = x+1;
  186.                 }
  187.                 else{
  188.                     pos_x1 = 0;
  189.                 }
  190.               }
  191.               else{
  192.                   if(x>0){
  193.                     pos_x1 = x-1;
  194.                   }
  195.                   else{
  196.                     pos_x1 = 4;
  197.                   }
  198.               }
  199.               in_fila++;
  200.             }
  201.             if(matriz[x][y]== msj[j]){
  202.               pos_y2 = y;
  203.               if(tipo==1){
  204.                 if(x<4){
  205.                     pos_x2 = x+1;
  206.                 }
  207.                 else{
  208.                     pos_x2 = 0;
  209.                 }
  210.               }
  211.               else{
  212.                   if(x>0){
  213.                     pos_x2 = x-1;
  214.                   }
  215.                   else{
  216.                     pos_x2 = 4;
  217.                   }
  218.               }
  219.               in_fila++;
  220.             }
  221.           }
  222.           if (in_fila == 2){
  223.             flag = 1;
  224.           }
  225.           in_fila = 0;
  226.         }
  227.     }
  228.  
  229.     //verifica rectangulos
  230.     if (flag==0){
  231.       for(int x=0;x<5;x++){
  232.         for(int y=0;y<5;y++){
  233.           if(matriz[x][y]== msj[i]){
  234.             pos_x1 = x;
  235.             pos_y2 = y;
  236.           }
  237.           if(matriz[x][y]== msj[j]){
  238.             pos_x2 = x;
  239.             pos_y1 = y;
  240.           }
  241.         }
  242.       }
  243.  
  244.     }
  245.  
  246.     result += toupper(matriz[pos_x1][pos_y1]);
  247.     result += toupper(matriz[pos_x2][pos_y2]);
  248.     result += " ";
  249.  
  250.     i++;
  251.   }
  252.   return result;
  253. }
  254.  
  255.  
  256. void PlayFair::showMatriz(){
  257.   //muestra la matriz
  258.   for(int i=0;i<5;i++){
  259.     for(int j=0;j<5;j++){
  260.       cout << PlayFair::matriz[i][j];
  261.     }
  262.     cout << endl;
  263.   }
  264. }
  265.  
  266.  
« Última modificación: Marzo 04, 2014, 05:04:38 pm por deni_celine »

Conectado rollth

  • *
  • Moderator
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #1 en: Marzo 04, 2014, 04:27:20 pm »
que cifrado es ese? podrias explicar un poco mejor como va todo el programa y todo eso xD
la verdad es que sabes mucha mas programacion que yo (soy muy novato)

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil
« Respuesta #2 en: Marzo 04, 2014, 05:08:58 pm »
Tienes razón faltaba un poquito explicar que hacía jejje, pero en la Wiki esta bien explicado el cifrado en si, si tienes alguna duda respecto al programa me preguntas, antes programaba en otros lenguajes pero en c++ tb soy noob :D, aunque la mayoría de los lenguajes se parecen de alguna u otra forma

Conectado rollth

  • *
  • Moderator
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #3 en: Marzo 04, 2014, 06:46:08 pm »
He hecho un copypaste y la verdad el programa no me funciona del todo bien, solo me sale
me sale esto directamente


y cuando pongo la clave se va sin decirme la solucion

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil
« Respuesta #4 en: Marzo 05, 2014, 01:43:33 am »
esta tomando una clave por default que es 'playfair example' , si descomentas la linea 25 y comentas la 26 podrás cambiar la clave , y si tienes razón se cierra sin mostrar el resultado es que lo estaba ejecutando de la consola xd , si estas en windows ponele SYSTEM("PAUSE"); al final, onda línea 39

Conectado rollth

  • *
  • Moderator
  • Mensajes: 875
  • Actividad:
    1.67%
  • Reputación 16
  • El conocimiento es libre.
    • Ver Perfil
    • Whateversec
    • Email
  • Twitter: @RoloMijan
« Respuesta #5 en: Marzo 05, 2014, 08:13:14 am »
vale xD, pero estaria bien que el programa le pidiera al usuario la clave.

Rollth
Buen hacker mejor persona.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

 

¿Te gustó el post? COMPARTILO!