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

📄 permutation.cpp

📁 Column permutation cipher是基于置换的加密解密方式。利用本程序可实现Column permutation cipher的加密和解密。
💻 CPP
字号:
#include<iostream>
#include<string>


using namespace std;

class Permutation {
private:
	string key;
	int kl;
	string text;
	string result;
    int *order;
public:
	Permutation () {
             text="";
             key="";
             result="";
			 order=new int[];
			 //result = new char[];
	}

	void orderArray () {
	 order=new int[kl];
     for (int i=0;i<kl;i++) order[i]=kl;
	 for (int m=0;m<kl;m++)
	     for (int j=0;j<kl;j++) 
		 {
             if (key[m]==key[j]&&j<=m) order[m]=order[m];
			 if (key[m]<key[j]) order[m]--;
		 }
	 
	}   //根据密钥判断矩阵列数的取出次序

    void encryption (string plt,string k) {
		key=k;
		text=plt;
		int pl=text.length();
		kl=key.length();
        for (int i=0;i<pl;i++)
		{
          if (i!=pl&&text[i]=='\0')
		  {
           for (int j=i;j<pl;j++) text[j] =text[j+1];
           pl--;
		  }
		}   //消除明文中的空字符

        int rnum=pl/kl;
		int yu=pl%kl;
		if (yu!=0) rnum++;    //计算矩阵的行数

		//建立二维数组存储明文
       char **pMatrix = new char*[rnum];
       for (int p = 0; p < rnum; p++)
          pMatrix[p] = new char[kl];

       for (int q=0;q<rnum;q++)
           for (int j=0;j<kl;j++)
		   {
           char a = text[q*kl+j];
           if (a==NULL) break;
           else {
           pMatrix[q][j] =a;
		   }
		   }    //将明文字符按行存放入矩阵
       
        orderArray(); //调用函数判断矩阵列数的取出次序

      for (int j=0;j<kl;j++)	{
			int num= order[j]-1;   //不能忘记减1
           for (int i=0;i<rnum;i++) 
		   {   
			   char f=pMatrix[i][num];
               if (f!='\0')   
				   result.append(1,f);//取出矩阵中相应列的元素
		   }
		}
        
        cout<<result<<endl;

		delete[] order;
        order= NULL;
        for (int m = 0; m < rnum; m++)
		{
          delete[] pMatrix[m];
		}
        delete[] pMatrix;
        pMatrix= NULL;   //释放内存空间

	}

      void decryption (string cpt,string k) {
		key=k;
		text=cpt;
		int pl=text.length();
		kl=key.length();
        
        orderArray(); //调用函数判断矩阵列数的取出次序

		int rnum=pl/kl;
		int yu=pl%kl;
		if (yu!=0) {
			rnum++;    //计算矩阵的行数,给密文中加入空字符
            for (int n=0;n<kl;n++) {
				if ((order[n]-1)>=yu) text.insert(rnum*n+rnum-1,'\0');
			}
		}


       //建立二维数组存储明文
       char **pMatrix = new char*[rnum];
       for (int i = 0; i < rnum; i++)
          pMatrix[i] = new char[kl];

       for (int p=0;p<kl;p++) {
           int col=order[p];
              for (int j=0;j<rnum;j++)
              pMatrix[j][col-1]= text[p*rnum+j]; //
	   }

	  for (int q=0;q<rnum;q++)
		   for (int j=0;j<kl;j++) {
			
			   char b=pMatrix[q][j];
			   result.append (1,b);
		   }

		cout<<result<<endl;

	   delete[] order;
        order= NULL;
        for (int m = 0; m < rnum; m++)
		{
          delete[] pMatrix[m];
		}
        delete[] pMatrix;
        pMatrix= NULL;   //释放内存空间
}
        
};

void main () 
{
		cout<<"Please input the plaintext and the keyword"<<endl;
		string s1,s2;
        cin>>s1>>s2;
        Permutation p1;
        p1.encryption(s1,s2);
		cout<<"Please input the ciphertext and the keyword"<<endl;
        string s3,s4;
		cin>>s3>>s4;
        Permutation p2;
		p2.decryption(s3,s4);
}

⌨️ 快捷键说明

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