C++實(shí)現(xiàn)單置換密碼
單表置換密碼的C++代碼實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
本程序使用方法:需要在本程序所在的文件夾創(chuàng)建一個(gè)"密碼學(xué).txt"文檔。
該程序所需要的數(shù)據(jù)全部由該文檔提供,然后運(yùn)行即可得到結(jié)果,如需要修改數(shù)據(jù),必須從文檔中人工修改
文檔格式的要求:文檔總共包含兩行。第一行由一個(gè)1或2的數(shù)字和一個(gè)字符串組成,數(shù)字1代表加密,2代表解密,字符串表示密鑰
第二行僅包含一個(gè)字符串,這個(gè)字符串是需要加密或解密的內(nèi)容。
該程序運(yùn)行結(jié)果直接由控制臺(tái)輸出
運(yùn)行結(jié)果:

代碼:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
ifstream in("密碼學(xué).txt");
void JiaMi(char ZhiHuan[]); //加密函數(shù)
void JieMi(char ZhiHuan[]); //解密函數(shù)
void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]); //設(shè)置置換表函數(shù)
int main()
{
int m; //確定是加密或解密?加密為1,解密為2
char ZhiHuanBiao['z'+1]; //正向置換表,加密時(shí)用
char fanZhiHuanBiao['Z'+1]; //反向置換表,解密時(shí)用
cout<<"加密按輸入1,解密輸入2"<<endl;
in>>m; //讀入m
setZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //設(shè)置置換表
switch(m) //判斷m值,執(zhí)行相應(yīng)的功能
{
case 1: JiaMi(ZhiHuanBiao);break;
case 2: JieMi(fanZhiHuanBiao);break;
default:break;
}
return 0;
}
void JiaMi(char ZhiHuan[]) //加密
{
string MingWen; //保存明文
cout<<endl<<"請(qǐng)輸入明文:";
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<<"請(qǐng)輸入密文:";
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<<"請(qǐng)輸入密鑰(大寫):";
getline(in,s); //讀入密鑰
cout<<s<<endl; //輸出密鑰
cout<<"置換表為:"<<endl;
string s1;
for(i = 0 ; i < s.length();i++) //對(duì)密鑰進(jìn)行處理(去掉空格和重復(fù)的字符)
{
bool sign =0; //標(biāo)志變量
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]<<" "; //同時(shí)輸出置換表
}
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;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 用C/C++代碼檢測(cè)ip能否ping通(配合awk和system可以做到批量檢測(cè))
- c++文件監(jiān)控之FileSystemWatcher
- C++獲取MD5算法實(shí)現(xiàn)代碼
- C/C++格式化日志庫(kù)實(shí)現(xiàn)代碼
- C++獲取特定進(jìn)程CPU使用率的實(shí)現(xiàn)代碼
- 基于C++11的threadpool線程池(簡(jiǎn)潔且可以帶任意多的參數(shù))
- C++11獲取線程返回值的實(shí)現(xiàn)代碼
- C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?
- C++單例類模板詳解
- C++中rapidjson組裝map和數(shù)組array的代碼示例
相關(guān)文章
C++如何實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
C語(yǔ)言入門篇--sizeof與strlen基礎(chǔ)理論
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要為大家介紹了C語(yǔ)言的sizeof與strlen的基本理論知識(shí),希望可以幫助大家快速入門c語(yǔ)言的世界,更好的理解c語(yǔ)言2021-08-08
OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定示例詳解
相機(jī)標(biāo)定是圖像處理的基礎(chǔ),現(xiàn)在市面上買到的相機(jī),都存在著或多或少的畸變。本文將介紹如何利用一系列棋盤照片進(jìn)行攝像機(jī)標(biāo)定的,感興趣的小伙伴可以關(guān)注一下2021-11-11
C++共享智能指針shared_ptr的實(shí)現(xiàn)
在C++中沒有垃圾回收機(jī)制,必須自己釋放分配的內(nèi)存,否則就會(huì)造成內(nèi)存泄露,解決這個(gè)問(wèn)題最有效的方法是使用智能指針,本文主要介紹了C++共享智能指針shared_ptr的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12
Unreal學(xué)習(xí)之簡(jiǎn)單三角形的繪制詳解
之所以寫這個(gè)繪制簡(jiǎn)單三角形的實(shí)例其實(shí)是想知道如何在Unreal中通過(guò)代碼繪制自定義Mesh,如果你會(huì)繪制一個(gè)三角形,那么自然就會(huì)繪制復(fù)雜的Mesh了。所以這是很多圖形工作者的第一課,快跟隨小編一起學(xué)習(xí)起來(lái)吧2023-02-02

