Playfair 算法

#include <iostream.h>
#include < string.h>
#include <stdio.h>
#include <stdlib.h>
/*************************
time:2011 -3 -11 11:00
function:Playfair 算法

**************************/

//事先定义好的一个字母
#define     MYWORD     'x'    



//-----------------------
//Playfair 算法
void Playfair( char cinput[] , char matrix[5][5]);

//----------------------
//CreateKeyMatrix 创建密匙矩阵
void CreateKeyMatrix( char matrix[5][5] , char key[]);


void main()
{
   //密匙矩阵
   char matrix[5][5]={ 0} ;
   //待输入密匙
   char ccode[25]={0} ;
   //待输入加密数据
   char cinput[1024]={0} ;
   //加密后数据
   char coutput[1024] ={0} ;
   int i,j ;

  cout<< "Playfair加密算法程序"<<endl;
  cout<< "请输入密匙:" ;
  cin>>ccode;
   //创建密匙矩阵
  CreateKeyMatrix(matrix,ccode);

  cout<< "请输入待加密数据:"<<endl;
   //cin>>cinput ;
  scanf( "%s",cinput);

   //Playfair 加密
  Playfair(cinput,matrix);

  cout<< "Playfair加密得到的密文:"<<endl;
  cout<<cinput <<endl;

  system( "pause") ;

}

//---------------------
//Playfair算法第一步骤,
//将2个字母一样的中间插入事先已经约定好的字母MYWORD
void Playfair1( char cinput[])
{
   char ctmp ;
   char cinput1[1024] ;
   int i,j ;
   int len    =strlen(cinput);

   for(i =0;i <len -1; i=i+2)
  {
     if(cinput[i] ==cinput[i+1])
    {
       //如果相邻2个字母一样的话
       //将cinput[i+1]之后的数据全部向后移动一位
      len =strlen(cinput) ;
       for(j =len ;j>    i+1;j--)    
      {
        cinput[j] =cinput[ j-1] ;
      }
       //将事先定义好的字母MYWORD插入到cinput[i+1]中
      cinput[i+1] =MYWORD ;
        
    }

     //如果有字母插入cinput中,那么就要更新原数据长度
    len=strlen(cinput);

  }
}

//-----------------------------
//Playfair 算法第2步
//如果该明文不是2的倍数,那么在最后面加上事先定义好的MYWORD
void Playfair2( char cinput[])
{
   int len=strlen(cinput) ;
   if((len %2) ==0)
  {
     //如果是2的位数
     return ;
  }
   else
  {
     //如果不是2的倍数
    cinput[len]= MYWORD ;
     return ;
  }
}

//--------------------------------
//Playfair 算法第345步
//如果2个字母在同一行,那么循环左移
//如果2个字母在同一列,那么循环上移
//如果2个字母既不在同一列,也不再同一行,交叉互换
void Playfair345( char &a, char &b , char matrix[5][5])
{
   int i,j ;
   int rowa ,rowb ; //2个字母分别所在行
   int cola ,colb ; //2个字母分别所在列

   for( i=0;i<5 ;i++)
  {
     for( j=0;j< 5 ;j++)
    {
       //记录下a b 的行和列
       if(matrix [i][j] == a)
      {
        rowa = i ;
        cola = j ;
      }
       if(matrix[i][j] ==b)
      {
        rowb =i;    
        colb = j;
      }

    }
  }

   //-------------------
   //判断rowa 是否等于 rowb
   if(rowa == rowb )
  {
     //如果 a 和 b在同一行
     if(cola != 4)
    {
       //如果a 不再这行的第5个,那么只需要将后面一个移动到前面一个就OKl    
      a =matrix[rowa][cola +1] ;
    }
     else
    {
       //如果 a 在这行的第5个,那么将这个数和第一个数交换
      a = matrix[rowa][0];
    }

     if(colb != 4)
    {
       //如果b 不再这行的第5个,那么只需要将后面一个移动到前面一个就OKl    
      b =matrix[rowb][colb +1] ;
    }
     else
    {
       //如果 b 在这行的第5个,那么将这个数和第一个数交换
      b = matrix[rowb][0];

    }

     //直接返回就OK了
     return ;

  }

   //---------------------
   //判断是否为同一列
   if(cola ==colb)
  {
     //如果 a 和 b 是同一列
     if(rowa !=4)
    {
       //如果a所在行不是第5行,
      a =matrix[rowa+1][cola] ;
    }
     else
    {
       //如果a所在行是第5行
      a =matrix[0][cola] ;
    }

     if(rowb !=4)
    {
       //如果b所在行不是第5行,
      b =matrix[rowb+1][colb] ;
    }
     else
    {
       //如果a所在行是第5行
      b =matrix[0][colb] ;
    }

     //直接返回就OK 了
     return ;
  }

   //-----------------------
   //判断 a 和 b 是否不为同一列,不为同一行
   if((rowa !=rowb) &&(cola !=colb))
  {
    a = matrix[rowa][colb] ;
    b = matrix[rowb][cola] ;

     return ;
  }
}

//-----------------------
//Playfair 算法
void Playfair( char cinput[] , char matrix[5][5])
{
   int i ,len;
  Playfair1(cinput);
  Playfair2(cinput);
  len =strlen(cinput);
   for(i =0; i<len-1;i=i+2)
  {
    Playfair345(cinput[i],cinput[i+1] ,matrix);
  }

}

//----------------------
//CreateKeyMatrix 创建密匙矩阵
void CreateKeyMatrix( char matrix[5][5] , char key[])
{
   bool bin ;
   bool bi,bj;
   int i,j ,k ,m,n;
   int len ;
   char cword[27] = "abcdefghijklmnopqrstuvwxyz" ;

   //将key 放入到matix中
   for(i =0;i<5;i++)
  {
     for(j =0;j <5 ;j++)
    {
       if(key[i*5+j] != NULL)
      {
         //如果key[]不为空
        matrix[i][ j] =key[i*5+j] ;
      }
    }
  }
    
  k =0 ;
   //将剩余字母放入到matrix中
   for(i =0;i<5;i++)
  {
     for(j =0;j <5 ;j++)
    {
       if(matrix[i][j] == NULL)
      {
         //如果matrix 中为空,那么加入剩余的字母

WordContinue:

        bi= false;
        bj = false;
         //如果cword[k] ==i 或者 j,那么直接continue
         if((cword[k] =='i') || (cword[k] =='j'))
        {
           for(m=0;m <5;m++)
          {
             for(n=0;n<5;n++)
            {
               if(matrix[m][n] == 'i')
              {
                bi = true;
              }
               if(matrix[m][n] == 'j')
              {
                bj = true ;
              }
            }
          }

           if( (bi == false ) && (bj == false))
          {
             //如果 i ,j 都不存在
             goto AddContinue;
          }

          k++ ;
           goto    WordContinue;
        }

AddContinue:
         //设置字母不在matrix中
        bin = false;
         for(m = 0;m<5;m++)
        {
           for(n =0;n<5; n++)
          {
             if(matrix[m][n] ==cword[k])
            {
               //如果发现当前字符在密匙矩阵中,那么直接返回
              bin = true ;
              k++ ;
               goto    WordContinue;

            }
          }

           if(bin == true)
          {
             //如果发现字母存在Matrix中,那么直接break
            k++ ;
             goto    WordContinue;
          }

        }

         if(bin == true )
        {
           //....什么都不做
          k++ ;
           goto    WordContinue;
        }
         else
        {
           //如果字母不存在在Matrix中,那么添加到matrix中
          matrix[i][j] = cword[k] ;
        }
        


        k++ ;

      }
    }
  }

}

你可能感兴趣的:(算法,职场,休闲,Playfair)