⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playfaircipher_codes.cpp

📁 Playfair Cipher 1.not even the large number of keys in a monoalphabetic cipher provides security 2
💻 CPP
字号:
#include <iostream>        
#include <stdlib.h>
using namespace std;

#define MAX 1000 

int main()
{
    FILE *fp;
    int ptn = 0, kn = 0;     
    char ch; 
    char plaintext[MAX], ciphertext[MAX], key[10];  
   
    fp = fopen("PlayfairCipher_codes.txt", "r");
    
    //read plaintext from hw1_playfair_95610047.txt
    do {
        ch = '\0'; 
        fscanf(fp, "%c", &ch);  
        plaintext[ptn++] = ch; 
    } while( ptn<MAX && plaintext[ptn-1] != '\n' );    
    
    ptn = ptn - 1; 
    
    
    //print Plaintext
    cout  << "Plaintext : " ; 
    
    for (int i=0 ; i<ptn ; i++)
         cout  << plaintext[i]; 
         
    cout << endl << endl; 
    
    //plaintext ('j' -> 'i') 
    for (int i=0 ; i<ptn ; i++)
    {
         if (plaintext[i] == 'j')
             plaintext[i] = 'i';
    }
  
  
    //cout << "<<" << ptn << ">>" << endl;  
    
     
    
    //read KEYWORD from hw1_playfair_95610047.txt
    do
    {
        ch = '\0'; 
        fscanf(fp, "%c", &ch);
        key[kn++] = ch;
    } while( kn<10 && key[kn-1] != '\0' );
      
    kn = kn-1; 
    
    //print KEYWORD 
    cout  << "Keyword : " ; 
    
    for (int i=0 ; i<kn ; i++)
         cout  << key[i]; 
         
    cout << endl << endl; 
    
    //key ('j' -> 'i') 
    for (int i=0 ; i<kn ; i++)
    {
         if (key[i] == 'j')
             key[i] = 'i';
    }
       
    //delete repeated letter from KEYWORD 
    for (int i=0 ; i<kn ; i++)
    { 
         for (int j=i+1 ; j<kn ; j++)
         { 
              if (key[i] == key[j])
              {
                  --kn; 
                  for (int s=j ; s<kn ; s++)
                       key[s] = key[s+1];
              }
         } 
    } 
    
    //cout << "<<" << kn << ">>" << endl; 
    
    
    char matrix[5][5];  //5*5 matrix of letters based on a KEYWORD 
    char temp[25];  
    
    //fill in letters of KEYWORD 
    for (int i=0 ; i<kn ; i++)
         temp[i] = key[i];
    
    //fill rest of matrix with other letters 
    for (int i=kn ; i<25 ; i++)
    { 
         for (int h=97 ; h<=122 ; h++)
         {
              if (h == 106)  //'j' -> 'i' 
                  continue;
              int is = 1;  
              for (int e=0 ; e<i ; e++)
              {
                   if (temp[e] == char(h))
                   {
                       is = 0;
                       break; 
                   }
              }
              if (is)
              { 
                  temp[i] = char(h);
                  break;
              }
         }
    }  
    
            
    //print 5*5 Matrix 
    cout  << "< Matrix >" << endl;  
      
    for (int i=0 ; i<25 ; i+=5)
    { 
         for (int j=i ; j<i+5 ; j++) 
              cout  << temp[j] << " "; 
         cout << endl; 
    }
    cout << endl;  
    
    
    //temp[25] -> matrix[5][5]
    int k = 0;     
    for (int i=0 ; i<5 ; i++)  
    {  
         k = i*5; 
         for (int j=0 ; j<5 ; j++)
         {  
              matrix[i][j] = temp[k]; 
              k++; 
         } 
    } 
    
    //if a pair is a repeated letter, insert filler like 'X'     
    
    int axn = ptn;    //number of filler 
    
    for (int i=0 ; i<axn/2 ; i++)   
    {
         if (plaintext[i*2] == plaintext[i*2+1]) 
         {
             for (int j=axn ; j>i*2+1 ; j--)
                  plaintext[j] = plaintext[j-1];
             plaintext[i*2+1] = 'x';
             axn++;
             i = (-1); 
         }
    }
    
    //if length of plaintext is odd, insert filler like 'X' 
    if ((axn%2) != 0)
    {
         plaintext[axn] = 'x';  
         axn++;    
    }
    
    cout  << "Temp : " ; 
    
    for (int i=0 ; i<axn ; i+=2)
         cout  << plaintext[i] << plaintext[i+1] << " "; 
         
    cout << endl << endl;     
    
    
    //Encrypting 
    int row1, column1; 
    int row2, column2;
    for (int r=0 ; r<(axn/2) ; r++)  //r -> round 
    {
         for (int i=0 ; i<5 ; i++)
         {
              for (int j=0 ; j<5 ; j++)
              {
                   if (plaintext[r*2] == matrix[i][j])
                   {
                       row1 = i;
                       column1 = j;
                   }
                   if (plaintext[r*2+1] == matrix[i][j])
                   {
                       row2 = i;
                       column2 = j; 
                   }
              }
         }
         
         if (row1 == row2)        //fall in the same row 
         {
             ciphertext[r*2] = matrix[row1][(column1+1)%5];
             ciphertext[r*2+1] = matrix[row2][(column2+1)%5];
         } else 
         if (column1 == column2)  //fall in the same column 
         {
             ciphertext[r*2] = matrix[(row1+1)%5][column1];
             ciphertext[r*2+1] = matrix[(row2+1)%5][column2];
         }
         else                     //otherwise 
         {
             ciphertext[r*2] = matrix[row1][column2];
             ciphertext[r*2+1] = matrix[row2][column1];
         }
    }
    
    cout  << "Ciphertext : " ; 
    
    for (int i=0 ; i<axn ; i+=2)
         cout  << ciphertext[i] << ciphertext[i+1] << " "; 
         
    cout << endl << endl; 
    
    fclose(fp);
    
    system ("pause");
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -