InBlock.gif#include <iostream.h>
InBlock.gif#include < string.h>
InBlock.gif#include <stdio.h>
InBlock.gif#include <stdlib.h>
InBlock.gif /*************************
InBlock.giftime:2011 -3 -11 11:00
InBlock.giffunction:Playfair 算法
InBlock.gif
InBlock.gif**************************/

InBlock.gif
InBlock.gif //事先定义好的一个字母
InBlock.gif#define     MYWORD     'x'    
InBlock.gif
InBlock.gif
InBlock.gif
InBlock.gif //-----------------------
InBlock.gif //Playfair 算法
InBlock.gif void Playfair( char cinput[] , char matrix[5][5]);
InBlock.gif
InBlock.gif //----------------------
InBlock.gif //CreateKeyMatrix 创建密匙矩阵
InBlock.gif void CreateKeyMatrix( char matrix[5][5] , char key[]);
InBlock.gif
InBlock.gif
InBlock.gif void main()
InBlock.gif{
InBlock.gif   //密匙矩阵
InBlock.gif   char matrix[5][5]={ 0} ;
InBlock.gif   //待输入密匙
InBlock.gif   char ccode[25]={0} ;
InBlock.gif   //待输入加密数据
InBlock.gif   char cinput[1024]={0} ;
InBlock.gif   //加密后数据
InBlock.gif   char coutput[1024] ={0} ;
InBlock.gif   int i,j ;
InBlock.gif
InBlock.gif  cout<< "Playfair加密算法程序"<<endl;
InBlock.gif  cout<< "请输入密匙:" ;
InBlock.gif  cin>>ccode;
InBlock.gif   //创建密匙矩阵
InBlock.gif  CreateKeyMatrix(matrix,ccode);
InBlock.gif
InBlock.gif  cout<< "请输入待加密数据:"<<endl;
InBlock.gif   //cin>>cinput ;
InBlock.gif  scanf( "%s",cinput);
InBlock.gif
InBlock.gif   //Playfair 加密
InBlock.gif  Playfair(cinput,matrix);
InBlock.gif
InBlock.gif  cout<< "Playfair加密得到的密文:"<<endl;
InBlock.gif  cout<<cinput <<endl;
InBlock.gif
InBlock.gif  system( "pause") ;
InBlock.gif
InBlock.gif}
InBlock.gif
InBlock.gif //---------------------
InBlock.gif //Playfair算法第一步骤,
InBlock.gif //将2个字母一样的中间插入事先已经约定好的字母MYWORD
InBlock.gif void Playfair1( char cinput[])
InBlock.gif{
InBlock.gif   char ctmp ;
InBlock.gif   char cinput1[1024] ;
InBlock.gif   int i,j ;
InBlock.gif   int len    =strlen(cinput);
InBlock.gif
InBlock.gif   for(i =0;i <len -1; i=i+2)
InBlock.gif  {
InBlock.gif     if(cinput[i] ==cinput[i+1])
InBlock.gif    {
InBlock.gif       //如果相邻2个字母一样的话
InBlock.gif       //将cinput[i+1]之后的数据全部向后移动一位
InBlock.gif      len =strlen(cinput) ;
InBlock.gif       for(j =len ;j>    i+1;j--)    
InBlock.gif      {
InBlock.gif        cinput[j] =cinput[ j-1] ;
InBlock.gif      }
InBlock.gif       //将事先定义好的字母MYWORD插入到cinput[i+1]中
InBlock.gif      cinput[i+1] =MYWORD ;
InBlock.gif        
InBlock.gif    }
InBlock.gif
InBlock.gif     //如果有字母插入cinput中,那么就要更新原数据长度
InBlock.gif    len=strlen(cinput);
InBlock.gif
InBlock.gif  }
InBlock.gif}
InBlock.gif
InBlock.gif //-----------------------------
InBlock.gif //Playfair 算法第2步
InBlock.gif //如果该明文不是2的倍数,那么在最后面加上事先定义好的MYWORD
InBlock.gif void Playfair2( char cinput[])
InBlock.gif{
InBlock.gif   int len=strlen(cinput) ;
InBlock.gif   if((len %2) ==0)
InBlock.gif  {
InBlock.gif     //如果是2的位数
InBlock.gif     return ;
InBlock.gif  }
InBlock.gif   else
InBlock.gif  {
InBlock.gif     //如果不是2的倍数
InBlock.gif    cinput[len]= MYWORD ;
InBlock.gif     return ;
InBlock.gif  }
InBlock.gif}
InBlock.gif
InBlock.gif //--------------------------------
InBlock.gif //Playfair 算法第345步
InBlock.gif //如果2个字母在同一行,那么循环左移
InBlock.gif //如果2个字母在同一列,那么循环上移
InBlock.gif //如果2个字母既不在同一列,也不再同一行,交叉互换
InBlock.gif void Playfair345( char &a, char &b , char matrix[5][5])
InBlock.gif{
InBlock.gif   int i,j ;
InBlock.gif   int rowa ,rowb ; //2个字母分别所在行
InBlock.gif   int cola ,colb ; //2个字母分别所在列
InBlock.gif
InBlock.gif   for( i=0;i<5 ;i++)
InBlock.gif  {
InBlock.gif     for( j=0;j< 5 ;j++)
InBlock.gif    {
InBlock.gif       //记录下a b 的行和列
InBlock.gif       if(matrix [i][j] == a)
InBlock.gif      {
InBlock.gif        rowa = i ;
InBlock.gif        cola = j ;
InBlock.gif      }
InBlock.gif       if(matrix[i][j] ==b)
InBlock.gif      {
InBlock.gif        rowb =i;    
InBlock.gif        colb = j;
InBlock.gif      }
InBlock.gif
InBlock.gif    }
InBlock.gif  }
InBlock.gif
InBlock.gif   //-------------------
InBlock.gif   //判断rowa 是否等于 rowb
InBlock.gif   if(rowa == rowb )
InBlock.gif  {
InBlock.gif     //如果 a 和 b在同一行
InBlock.gif     if(cola != 4)
InBlock.gif    {
InBlock.gif       //如果a 不再这行的第5个,那么只需要将后面一个移动到前面一个就OKl    
InBlock.gif      a =matrix[rowa][cola +1] ;
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif       //如果 a 在这行的第5个,那么将这个数和第一个数交换
InBlock.gif      a = matrix[rowa][0];
InBlock.gif    }
InBlock.gif
InBlock.gif     if(colb != 4)
InBlock.gif    {
InBlock.gif       //如果b 不再这行的第5个,那么只需要将后面一个移动到前面一个就OKl    
InBlock.gif      b =matrix[rowb][colb +1] ;
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif       //如果 b 在这行的第5个,那么将这个数和第一个数交换
InBlock.gif      b = matrix[rowb][0];
InBlock.gif
InBlock.gif    }
InBlock.gif
InBlock.gif     //直接返回就OK了
InBlock.gif     return ;
InBlock.gif
InBlock.gif  }
InBlock.gif
InBlock.gif   //---------------------
InBlock.gif   //判断是否为同一列
InBlock.gif   if(cola ==colb)
InBlock.gif  {
InBlock.gif     //如果 a 和 b 是同一列
InBlock.gif     if(rowa !=4)
InBlock.gif    {
InBlock.gif       //如果a所在行不是第5行,
InBlock.gif      a =matrix[rowa+1][cola] ;
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif       //如果a所在行是第5行
InBlock.gif      a =matrix[0][cola] ;
InBlock.gif    }
InBlock.gif
InBlock.gif     if(rowb !=4)
InBlock.gif    {
InBlock.gif       //如果b所在行不是第5行,
InBlock.gif      b =matrix[rowb+1][colb] ;
InBlock.gif    }
InBlock.gif     else
InBlock.gif    {
InBlock.gif       //如果a所在行是第5行
InBlock.gif      b =matrix[0][colb] ;
InBlock.gif    }
InBlock.gif
InBlock.gif     //直接返回就OK 了
InBlock.gif     return ;
InBlock.gif  }
InBlock.gif
InBlock.gif   //-----------------------
InBlock.gif   //判断 a 和 b 是否不为同一列,不为同一行
InBlock.gif   if((rowa !=rowb) &&(cola !=colb))
InBlock.gif  {
InBlock.gif    a = matrix[rowa][colb] ;
InBlock.gif    b = matrix[rowb][cola] ;
InBlock.gif
InBlock.gif     return ;
InBlock.gif  }
InBlock.gif}
InBlock.gif
InBlock.gif //-----------------------
InBlock.gif //Playfair 算法
InBlock.gif void Playfair( char cinput[] , char matrix[5][5])
InBlock.gif{
InBlock.gif   int i ,len;
InBlock.gif  Playfair1(cinput);
InBlock.gif  Playfair2(cinput);
InBlock.gif  len =strlen(cinput);
InBlock.gif   for(i =0; i<len-1;i=i+2)
InBlock.gif  {
InBlock.gif    Playfair345(cinput[i],cinput[i+1] ,matrix);
InBlock.gif  }
InBlock.gif
InBlock.gif}
InBlock.gif
InBlock.gif //----------------------
InBlock.gif //CreateKeyMatrix 创建密匙矩阵
InBlock.gif void CreateKeyMatrix( char matrix[5][5] , char key[])
InBlock.gif{
InBlock.gif   bool bin ;
InBlock.gif   bool bi,bj;
InBlock.gif   int i,j ,k ,m,n;
InBlock.gif   int len ;
InBlock.gif   char cword[27] = "abcdefghijklmnopqrstuvwxyz" ;
InBlock.gif
InBlock.gif   //将key 放入到matix中
InBlock.gif   for(i =0;i<5;i++)
InBlock.gif  {
InBlock.gif     for(j =0;j <5 ;j++)
InBlock.gif    {
InBlock.gif       if(key[i*5+j] != NULL)
InBlock.gif      {
InBlock.gif         //如果key[]不为空
InBlock.gif        matrix[i][ j] =key[i*5+j] ;
InBlock.gif      }
InBlock.gif    }
InBlock.gif  }
InBlock.gif    
InBlock.gif  k =0 ;
InBlock.gif   //将剩余字母放入到matrix中
InBlock.gif   for(i =0;i<5;i++)
InBlock.gif  {
InBlock.gif     for(j =0;j <5 ;j++)
InBlock.gif    {
InBlock.gif       if(matrix[i][j] == NULL)
InBlock.gif      {
InBlock.gif         //如果matrix 中为空,那么加入剩余的字母
InBlock.gif
InBlock.gifWordContinue:
InBlock.gif
InBlock.gif        bi= false;
InBlock.gif        bj = false;
InBlock.gif         //如果cword[k] ==i 或者 j,那么直接continue
InBlock.gif         if((cword[k] =='i') || (cword[k] =='j'))
InBlock.gif        {
InBlock.gif           for(m=0;m <5;m++)
InBlock.gif          {
InBlock.gif             for(n=0;n<5;n++)
InBlock.gif            {
InBlock.gif               if(matrix[m][n] == 'i')
InBlock.gif              {
InBlock.gif                bi = true;
InBlock.gif              }
InBlock.gif               if(matrix[m][n] == 'j')
InBlock.gif              {
InBlock.gif                bj = true ;
InBlock.gif              }
InBlock.gif            }
InBlock.gif          }
InBlock.gif
InBlock.gif           if( (bi == false ) && (bj == false))
InBlock.gif          {
InBlock.gif             //如果 i ,j 都不存在
InBlock.gif             goto AddContinue;
InBlock.gif          }
InBlock.gif
InBlock.gif          k++ ;
InBlock.gif           goto    WordContinue;
InBlock.gif        }
InBlock.gif
InBlock.gifAddContinue:
InBlock.gif         //设置字母不在matrix中
InBlock.gif        bin = false;
InBlock.gif         for(m = 0;m<5;m++)
InBlock.gif        {
InBlock.gif           for(n =0;n<5; n++)
InBlock.gif          {
InBlock.gif             if(matrix[m][n] ==cword[k])
InBlock.gif            {
InBlock.gif               //如果发现当前字符在密匙矩阵中,那么直接返回
InBlock.gif              bin = true ;
InBlock.gif              k++ ;
InBlock.gif               goto    WordContinue;
InBlock.gif
InBlock.gif            }
InBlock.gif          }
InBlock.gif
InBlock.gif           if(bin == true)
InBlock.gif          {
InBlock.gif             //如果发现字母存在Matrix中,那么直接break
InBlock.gif            k++ ;
InBlock.gif             goto    WordContinue;
InBlock.gif          }
InBlock.gif
InBlock.gif        }
InBlock.gif
InBlock.gif         if(bin == true )
InBlock.gif        {
InBlock.gif           //....什么都不做
InBlock.gif          k++ ;
InBlock.gif           goto    WordContinue;
InBlock.gif        }
InBlock.gif         else
InBlock.gif        {
InBlock.gif           //如果字母不存在在Matrix中,那么添加到matrix中
InBlock.gif          matrix[i][j] = cword[k] ;
InBlock.gif        }
InBlock.gif        
InBlock.gif
InBlock.gif
InBlock.gif        k++ ;
InBlock.gif
InBlock.gif      }
InBlock.gif    }
InBlock.gif  }
InBlock.gif
InBlock.gif}