C++实现单置换密码
单表置换密码的C++代码实现,供大家参考,具体内容如下
本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档。
该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改
文档格式的要求:文档总共包含两行。第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥
第二行仅包含一个字符串,这个字符串是需要加密或解密的内容。
该程序运行结果直接由控制台输出
运行结果:
代码:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
ifstream in("密码学.txt");
void JiaMi(char ZhiHuan[]); //加密函数
void JieMi(char ZhiHuan[]); //解密函数
void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]); //设置置换表函数
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值,执行相应的功能
{
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是循环变量,除此之外没有任何意义
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++) //该循环利用密钥得到置换表
{
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++) //该循环利用置换表得到反置换表
{
fanZhiHuanBiao[ ZhiHuanBiao[i] ] = i;
}
for( i='A'; i<= 'Z'; i++) //输出反置换表
{
cout<< fanZhiHuanBiao[i] <<" ";
}
cout<<endl;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
以上是 C++实现单置换密码 的全部内容, 来源链接: utcz.com/p/244363.html