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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10深入理解C++中常见的关键字含义
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10深入全排列算法及其实现方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10C#中split用法实例总结