C++實現(xiàn)單置換密碼
單表置換密碼的C++代碼實現(xiàn),供大家參考,具體內(nèi)容如下
本程序使用方法:需要在本程序所在的文件夾創(chuàng)建一個"密碼學.txt"文檔。
該程序所需要的數(shù)據(jù)全部由該文檔提供,然后運行即可得到結(jié)果,如需要修改數(shù)據(jù),必須從文檔中人工修改
文檔格式的要求:文檔總共包含兩行。第一行由一個1或2的數(shù)字和一個字符串組成,數(shù)字1代表加密,2代表解密,字符串表示密鑰
第二行僅包含一個字符串,這個字符串是需要加密或解密的內(nèi)容。
該程序運行結(jié)果直接由控制臺輸出
運行結(jié)果:
代碼:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
ifstream in("密碼學.txt");
void JiaMi(char ZhiHuan[]);   //加密函數(shù)
void JieMi(char ZhiHuan[]);   //解密函數(shù)
void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]);  //設置置換表函數(shù)
int main()
{
 int m;    //確定是加密或解密?加密為1,解密為2
 char ZhiHuanBiao['z'+1];   //正向置換表,加密時用
 char fanZhiHuanBiao['Z'+1];  //反向置換表,解密時用
 cout<<"加密按輸入1,解密輸入2"<<endl;
 in>>m;    //讀入m
 setZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //設置置換表
 switch(m) //判斷m值,執(zhí)行相應的功能
 {
 case 1: JiaMi(ZhiHuanBiao);break;
 case 2: JieMi(fanZhiHuanBiao);break;
 default:break;
 }
 return 0;
}
void JiaMi(char ZhiHuan[]) //加密
{
 string MingWen;  //保存明文
 cout<<endl<<"請輸入明文:";
 getline(in,MingWen); //讀入明文
 cout<<MingWen<<endl;  
 cout<<"加密后的密文為:"<<endl;
 for(int i=0; i<MingWen.length(); i++) //直接利用置換表輸出密文
 {
 if(MingWen[i]>='a' && MingWen[i]<='z')
 cout<<ZhiHuan[ MingWen[i] ];
 else cout<<MingWen[i];
 }
 cout<<endl;
}
void JieMi(char fanZhiHuan[])
{
 string MiWen;  //保存密文
 cout<<endl<<"請輸入密文:";
 getline(in,MiWen); //讀入密文
 cout<<MiWen<<endl;
 cout<<"解密后的明文為:"<<endl;
 for(int i=0; i<MiWen.length(); i++) //直接利用反置換表輸出明文
 {
 if(MiWen[i]>='A' && MiWen[i]<='Z')
 cout<<fanZhiHuan[ MiWen[i] ];
 else cout<<MiWen[i];
 }
 cout<<endl;
}
void setZhiHuan(char ZhiHuanBiao[],char fanZhiHuanBiao[])
{
 int i;  //i和j是循環(huán)變量,除此之外沒有任何意義
 char j;
 string s;  //密鑰
 cout<<"請輸入密鑰(大寫):"; 
 getline(in,s); //讀入密鑰
 cout<<s<<endl; //輸出密鑰
 cout<<"置換表為:"<<endl;
 string s1;    
 for(i = 0 ; i < s.length();i++) //對密鑰進行處理(去掉空格和重復的字符)
 {
 bool sign =0;  //標志變量
 if(s[i] >= 'A' && s[i] <='Z')
 {
 for(int j = 0; j < s1.length();j++)
 {
 if(s[i] == s1[j])
 {
  sign = 1;
  break;
 }
 }
 if(sign == 0) s1 = s1 + s[i];
 else sign = 0;
 }
 }
 for( j ='a';j<='z';j++)cout<<j<<" ";cout<<endl; //輸出小寫字母 從a到z 
 char ch='A';
 for( i = 'a' ;i <= 'z'; i++) //該循環(huán)利用密鑰得到置換表
 {
 if(i < 'a' + s1.length()) //前面直接用s1代替
 { 
 ZhiHuanBiao[i] = s1[i-'a'];  
 }
 else //后面將剩下的"貼"上去
 {
 
 for(int j = 'a'; j < 'a' + s1.length(); j++)
 {
 if(ch == ZhiHuanBiao[j])
 {
  ch++;
  j= 'a'; //每次都從頭開始搜索
  continue;
 }
 }
 ZhiHuanBiao[i] = ch;
  ch++;
 }
 cout<<ZhiHuanBiao[i]<<" "; //同時輸出置換表
 }
 cout<<endl;
 for( i='a'; i<= 'z'; i++) //該循環(huán)利用置換表得到反置換表
 {
 fanZhiHuanBiao[ ZhiHuanBiao[i] ] = i;
 }
 for( i='A'; i<= 'Z'; i++) //輸出反置換表
 {
 cout<< fanZhiHuanBiao[i] <<" ";
 }
 cout<<endl;
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10數(shù)據(jù)結(jié)構課程設計-用棧實現(xiàn)表達式求值的方法詳解
 - 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
 - 01-10深入理解C++中常見的關鍵字含義
 - 01-10求斐波那契(Fibonacci)數(shù)列通項的七種實現(xiàn)方法
 - 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運算符做加法
 - 01-10使用C++實現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實現(xiàn)DBSCAN聚類算法
 - 01-10深入全排列算法及其實現(xiàn)方法
 


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 04-02jquery與jsp,用jquery
 - 01-10delphi制作wav文件的方法
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10C#中split用法實例總結(jié)
 


