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

📄 playfair.c

📁 基于C语言编程环境下的一个能够简单执行playfair的加密算法。
💻 C
字号:
#include <iostream.h>
#include <stdlib.h>

#define MAX 1000  //明文空间最大字符数

int main()
{
 FILE *fp;
 int i=0;
 char a[MAX],b[MAX],k[20];   //数组a存放明文字符,数组b存放密文字符,数组k存放密钥字符
 fp=fopen("f:\plaintext.txt","r");

//将plaintext.txt中的明文读入明文数组a
 do
 {
  char ch=NULL;
  fscanf(fp,"%c",&ch);   //数组a存放明文字符
  if(ch!=' ')   //滤除输入中的空格
   a[i++]=ch;
 }
 while(i<MAX&&a[i-1]!='\n');
 static int q=i;   //q为回车位,明文共q-1个字符

//提示可能的明文空间溢出
// if(q-1>=1900)
 // cout<<"May be overflow..."<<endl;

//将明文中的字符j换为i
 for(i=0;i<q-1;i++)
 {
  if(a[i]=='j')
   a[i]='i';
 }

//将plaintext中的密钥读入密钥数组k
 i=0;
 do
 {
  fscanf(fp,"%c",&k[i++]);
 }
 while(i<20&&k[i-1]!='\n');
 int p=i-1;   //共p位密钥

//将密钥中的字符j换为i
 for(i=0;i<p;i++)
 {
  if(k[i]=='j')
   k[i]='i';
 }

//删掉密钥中重复的字符
 for(i=1;i<p;i++)
  for(int j=0;j<i;j++)
   if(k[i]==k[j])
   {
    for(int l=i;l<p-1;l++)
     k[l]=k[l+1];
    p--;
   }

 char m[5][5];  //密钥矩阵
 char m1[25];   //暂存密钥矩阵元素的辅助数组

//将密钥元素填入数组m1
 for(i=0;i<p;i++)
  m1[i]=k[i];
 
//将密钥后的其它字母补入数组m1
 for(i=p;i<25;i++)
  for(int h=97;h<=122;h++)
  {
   if(h==106)  //////////不要字符j//////////////////
    continue;
   int is=1;  //判断后补入m1的元素是否和密钥重复
   for(int e=0;e<i;e++)
   {
    if(m1[e]==char(h))
    {
     is=0;
     break;  //break只能跳for和while循环
    }
   }
   if(is)
   { 
    m1[i]=char(h); 
    break;
   }
  }
 
//将数组m1的元素赋给矩阵m
 int j,l;      //i为矩阵行标,j为列标,l指m1数组位标
 for(i=0;i<5;i++)    
  for(j=0,l=i*5;j<5,l<(i+1)*5;j++,l++)
   m[i][j]=m1[l]; 
 
//在明文连续相同字符间插入字符x      
 int ix=0; //判断是否需要插x
 int nx=0; //计算插入x的个数
 for(i=0;i<q/2;i++)
 {
  if(ix) 
  {
   i=0;  //如果插过x,数组奇偶排列已打乱,需重新处理
   ix=0;
  }
  if(a[i*2]==a[i*2+1]) 
  {
   for(j=q-1;j>=i*2+1;j--)
    a[j]=a[j-1];
   a[i*2+1]='x';
   nx++;
   ix=1;
  }
 }

//如果明文总长为奇数,在后面再补一个x
 if((q-1+nx)%2!=0)
 {
  a[q-1+nx]='x';  
  nx++;    //现明文总长为q-1+nx,且为偶数
 }

//利用playfair密钥矩阵,将明文空间映射到密文空间
 int r1=5,l1=5;   //r和l分别为矩阵m的行标和列标
 int r2=5,l2=5;
 for(int g=0;g<(q-1+nx)/2;g++)  //g为数组a和b的行标
 {
  for(i=0;i<5;i++)
   for(j=0;j<5;j++)
   {
    if(a[g*2]==m[i][j])
    {
     r1=i;
     l1=j;
    }
    if(a[g*2+1]==m[i][j])
    {
     r2=i;
     l2=j;
    }
   }
  if(r1==r2)  //在同一行
  {
   b[g*2]=m[r1][(l1+1)%5];
   b[g*2+1]=m[r2][(l2+1)%5];
  }
  else if(l1==l2)   //在同一列
  {
   b[g*2]=m[(r1+1)%5][l1];
   b[g*2+1]=m[(r2+1)%5][l2];
  }
  else if(l1<l2)   
  {
   b[g*2]=m[r1][l2];
   b[g*2+1]=m[r2][l1];
  }
  else
  {
   b[g*2]=m[r2][l1];
   b[g*2+1]=m[r1][l2]; 
  }
 }

//输出密文到ciphertext.txt
 FILE* fo=fopen("ciphertext.txt","w");
 for(g=0;g<q-1+nx;g++)
  fprintf(fo,"%c",b[g]);
 fprintf(fo,"\n");
 fclose(fp);
 fclose(fo);
   return 0;
}

⌨️ 快捷键说明

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