一、主要内容及要求

功能描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。接下来,我们要在密码之上再加一套密码,虽然简单但也安全。假设元子原来有一个BBS上的密码为zvbo941992,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1992,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8, wxyz--9, 0--0,就这么简单,元子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则变成对应的小写字母之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

程序输入:输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾。

程序输出:正真的密文

要求及说明:

(1)设计并编写的应用程序需要体现C++面向对象程序设计语言的基本特性;

(2)使用菜单选择操作,具有友好的人机交互提示和显示,方便用户输入及查看程序运行过程、结果;

(3)采取模块化方式进行程序设计,例如:小写字母变成对应数字的功能以及大写字母变小写字母并后移一位的功能分别用两个函数来实现;

(4)程序可以根据用户的选择多次运行,直到用户选择退出;

(5)对于运行解决问题的步骤(例如从键盘输入的数据、输出到显示器的结果),除了能够在显示器上显示以外,能够处理后的结果用文件的方式保存到outfile.txt文件中。

二、一种设计思路

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class key{
private:string k1,k2;int m;
public:void in(){cout<<"请输入明文:";cin>>k1;m=k1.length();k2=k1;cout<<"读取成功"<<endl;}void change1()//大写字母变小写字母并后移一位的功能{const char *k3=k1.data();//将string转char*,方便后续直接通过ASCII实现转换for(int i=0;i<m;i++){if(k1[i]=='Z'){k2[i]='a';}else if(k1[i]>='A'&&k1[i]<'Z'){k2[i]=k3[i]+33;}elsecontinue;}}void change2()//小写字母变成对应数字的功能{for(int i=0;i<m;i++){if(k1[i]>='a'&&k1[i]<='c'){k2[i]='2';}else if(k1[i]>='d'&&k1[i]<='f'){k2[i]='3';}else if(k1[i]>='g'&&k1[i]<='i'){k2[i]='4';}else if(k1[i]>='j'&&k1[i]<='l'){k2[i]='5';}else if(k1[i]>='m'&&k1[i]<='o'){k2[i]='6';}else if(k1[i]>='p'&&k1[i]<='s'){k2[i]='7';}else if(k1[i]>='t'&&k1[i]<='v'){k2[i]='8';}else if(k1[i]>='w'&&k1[i]<='z'){k2[i]='9';}elsecontinue;}}void decryption()//对输入的明文进行解密{if(k2.length()!=0){change2();change1();cout<<"解密成功"<<endl;cout<<k2<<endl;}elsecout<<"请先输入明文!"<<endl;}void outfile()//将解密后得到的密文输出到文件里{if(k2.length()!=0){decryption();ofstream fout("outfile.txt",ios::app);//每次在末尾输出一行密文,若没有文件则自动生成该文件if(!fout){cout<<"无法打开文件,写入失败"<<endl;}else{fout<<k2<<endl;fout.close();cout<<"写入成功"<<endl;}}elsecout<<"请先输入明文!"<<endl;}
};
int main()
{key a;int n;while(1)程序可以根据用户的选择多次运行,直到用户选择退出{cout<<endl<<"请选择你的操作:"<<endl;cout<<"1---输入明文"<<endl<<"2---解密"<<endl<<"3---解密后输出到文件"<<endl<<"4---退出"<<endl;cin>>n;if(n==1){a.in();}else if(n==2){a.decryption();}else if(n==3){a.outfile();}else if(n==4){break;}else{cout<<"无此选项,请重新选择!"<<endl;}}//此处输入时仅允许数字输入,若为非数字字符会导致死循环,这个问题尚在解决中
}

代码运行结果

在代码保存的相同路径下,可找到新建的“outfile”文本文件

***我的代码编写和测试均通过CB完成,如果有不同多有见谅。

***在编写时参考了@七七高7777 的菜单编写方式,十分感谢。

***由于使用string类编写,没有考虑到ASCII的转换问题,参考了这篇文章的string转char,十分感谢。C++中string、char *、char[]的转换 - xqz_Pillar - 博客园 (cnblogs.com)

---------------------------------------------------------手动分界线---------------------------------------------------------

关于上面的一个办法中的ASCII转换的问题,我偶然发现啊,这个string转char*不转换也是可以滴,在此呢还是把新的代码贴出来以供交流学习。

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
class key{
private:string k1,k2;int m;
public:void in(){cout<<"请输入明文:";cin>>k1;m=k1.length();k2=k1;cout<<"读取成功"<<endl;}void change1()//大写字母变小写字母并后移一位的功能{for(int i=0;i<m;i++){if(k1[i]=='Z'){k2[i]='a';}else if(k1[i]>='A'&&k1[i]<'Z'){k2[i]=k1[i]+33;//此处的ASCII加法可以直接实现,并不需要做一次转换}elsecontinue;}}void change2()//小写字母变成对应数字的功能{for(int i=0;i<m;i++){if(k1[i]>='a'&&k1[i]<='c'){k2[i]='2';}else if(k1[i]>='d'&&k1[i]<='f'){k2[i]='3';}else if(k1[i]>='g'&&k1[i]<='i'){k2[i]='4';}else if(k1[i]>='j'&&k1[i]<='l'){k2[i]='5';}else if(k1[i]>='m'&&k1[i]<='o'){k2[i]='6';}else if(k1[i]>='p'&&k1[i]<='s'){k2[i]='7';}else if(k1[i]>='t'&&k1[i]<='v'){k2[i]='8';}else if(k1[i]>='w'&&k1[i]<='z'){k2[i]='9';}elsecontinue;}}void decryption()//对输入的明文进行解密{if(k2.length()!=0){change2();change1();cout<<"解密成功"<<endl;cout<<k2<<endl;}elsecout<<"请先输入明文!"<<endl;}void outfile()//将解密后得到的密文输出到文件里{if(k2.length()!=0){decryption();ofstream fout("outfile.txt",ios::app);//每次在末尾输出一行密文,若没有文件则自动生成该文件if(!fout){cout<<"无法打开文件,写入失败"<<endl;}else{fout<<k2<<endl;fout.close();cout<<"写入成功"<<endl;}}elsecout<<"请先输入明文!"<<endl;}
};
int main()
{key a;double n;//double型可以略去小数带来的死循环while(1)//程序可以根据用户的选择多次运行,直到用户选择退出{cout<<endl<<"请选择你的操作:"<<endl;cout<<"1---输入明文"<<endl<<"2---解密"<<endl<<"3---解密后输出到文件"<<endl<<"4---退出"<<endl;cin>>n;if(n==1){a.in();}else if(n==2){a.decryption();}else if(n==3){a.outfile();}else if(n==4){cout<<"感谢您的使用!";break;}else{cout<<"无此选项,请重新选择!"<<endl;}}//此处输入时仅允许数字输入,若为非数字字符会导致死循环,这个问题尚在解决中
}

---------------------------------------------------------手动分界线*2-----------------------------------------------------

偶然发现哈,要求里面居然有这么一个括号,我细细一想,那我这要求还不达标呢,但是老师也没关注这个。即使如此,个人还是按照要求,在上面的基础上写了一份,经过反复调试和检查,发现基本满足了要求,而代码也达到了惊人的176行。

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
ofstream f;//文件输出流对象,全局定义方便在任何位置使用
class key{
private:string k1,k2;int m;
public:void in(){f.open("outfile.txt",ios::app);cout<<"请输入明文:";cin>>k1;m=k1.length();k2=k1;cout<<"读取成功"<<endl;f<<"请输入明文:"<<k1<<endl<<"读取成功"<<endl;f.close();}void change1()//大写字母变小写字母并后移一位的功能{for(int i=0;i<m;i++){if(k1[i]=='Z'){k2[i]='a';}else if(k1[i]>='A'&&k1[i]<'Z'){k2[i]=k1[i]+33;//此处的ASCII加法可以直接实现,并不需要做一次转换}elsecontinue;}}void change2()//小写字母变成对应数字的功能{for(int i=0;i<m;i++){if(k1[i]>='a'&&k1[i]<='c'){k2[i]='2';}else if(k1[i]>='d'&&k1[i]<='f'){k2[i]='3';}else if(k1[i]>='g'&&k1[i]<='i'){k2[i]='4';}else if(k1[i]>='j'&&k1[i]<='l'){k2[i]='5';}else if(k1[i]>='m'&&k1[i]<='o'){k2[i]='6';}else if(k1[i]>='p'&&k1[i]<='s'){k2[i]='7';}else if(k1[i]>='t'&&k1[i]<='v'){k2[i]='8';}else if(k1[i]>='w'&&k1[i]<='z'){k2[i]='9';}elsecontinue;}}void decryption()//对输入的明文进行解密{if(k2.length()!=0){change2();change1();cout<<"解密成功"<<endl;cout<<k2<<endl;f.open("outfile.txt",ios::app);f<<"解密成功"<<endl<<k2<<endl;f.close();}else{cout<<"请先输入明文!"<<endl;f.open("outfile.txt",ios::app);f<<"请先输入明文!"<<endl;f.close();}}void tofile()//将解密后得到的密文输出到文件里{ofstream fout("password.txt",ios::app);//每次在末尾输出一行密文,若没有文件则自动生成该文件if(k2.length()!=0){decryption();if(!fout){cout<<"无法打开文件,写入失败"<<endl;f.open("outfile.txt",ios::app);f<<"无法打开文件,写入失败"<<endl;f.close();}else{fout<<k2<<endl;fout.close();cout<<"写入成功"<<endl;f.open("outfile.txt",ios::app);f<<"写入成功"<<endl;f.close();}}else{cout<<"请先输入明文!"<<endl;f.open("outfile.txt",ios::app);f<<"请先输入明文!"<<endl;f.close();}}
};
int main()
{key a;double n;//double型可以略去小数带来的死循环while(1)//程序可以根据用户的选择多次运行,直到用户选择退出{cout<<"请选择你的操作:"<<endl;cout<<"1---输入明文"<<endl<<"2---解密"<<endl<<"3---解密后输出到文件"<<endl<<"4---退出"<<endl;cin>>n;f.open("outfile.txt",ios::app);f<<"请选择你的操作:"<<endl;f<<"1---输入明文"<<endl<<"2---解密"<<endl<<"3---解密后输出到文件"<<endl<<"4---退出"<<endl;f<<n<<endl;f.close();if(n==1){a.in();}else if(n==2){a.decryption();}else if(n==3){a.tofile();}else if(n==4){cout<<"感谢您的使用!";f.open("outfile.txt",ios::app);f<<"感谢您的使用!"<<endl;f.close();break;}else{cout<<"无此选项,请重新选择!"<<endl;f.open("outfile.txt",ios::app);f<<"无此选项,请重新选择!"<<endl;f.close();}}//此处输入时仅允许数字输入,若为非数字字符会导致死循环,这个问题尚在解决中f.open("outfile.txt",ios::app);f<<"---该次测试结束---"<<endl<<endl;f.close();
}

该程序运行后会在保存代码的相同路径产生outfile.txt和password.txt

这个password.txt文本单独保存密码,跟上面的outfile一样,而这个outfile.txt在这个新程序里保存所有输入输出,由此体现出整个的测试过程,如图。

最后放一张丑丑的流程图

C++课程设计之密码加密相关推荐

  1. 密码学课程设计——多人加密聊天系统

    实验设计要求: 模块: 用户认证:数字签名方案 信息加密:公钥加密方案 信息隐藏:LSB方案 要求: 实现登陆验证,信息发送和接收(文本和图片),信息加密解密,信息签名和签名验证 关键代码解释说明: ...

  2. java文件加密解密实验报告_《网络信息安全技术》_实验报告_破译vigenamp#232;re_密码加密的密文...

    <<网络信息安全技术>_实验报告_破译vigen&amp#232;re_密码加密的密文>由会员分享,可在线阅读,更多相关<<网络信息安全技术>_实验报 ...

  3. c语言课程设计加密程序,C语言课程设计文件加密解密.doc

    C语言课程设计文件加密解密 C语言程序设计 课程设计 学 院 计算机工程 班 级 计算1313 姓 名 学 号 201321121089 成 绩 指导老师 2014年6月26日 计算1313班C语言程 ...

  4. Java课程设计——文本文件加密与解密软件设计与实现

    源文件链接: Java文本文件加密与解密-其它文档类资源-CSDN文库 摘要 随着现代网络技术的飞速发展,人们的个人信息.文件传递以及电子商务等方面都需要大力的保护,文件加密技术也应运而生.本次使用J ...

  5. 密码学课程设计之DES对称加密

    前言 最近在进行密码学课程设计, 感觉拿python进行设计会显得比较简洁易懂,本人python比较渣渣,所以就拿出来练一练.用零零碎碎的时间写了五六天才把主干部分写完,真是菜哭我自己了.在此还需要感 ...

  6. Express接口综合案例(创建项目、配置常用中间件、路由设计、提取控制器模块、配置错误统一处理中间件、用户注册的数据验证,密码加密)

    一.创建项目 二.目录结构 三.配置常用中间件 3.1 解析请求体 express.json() express.urlencoded() 3.2 日志输出 morgan() 3.3 为客户端提供跨域 ...

  7. java 密码生成器_Java课程设计-随机密码生成器

    1.团队课程设计博客链接 2.个人负责模板 设计程序运行界面,数据的输入,判断数据输入类型的错误,判断密码类型是否选择. 3.自己的代码提交记录截图 4自己负责模块或任务详细说明 (一)总体设计 1. ...

  8. 51单片机汇编密码锁(可修改密码,课程设计,含论文)!(大三上)

    单片机课程设计 设计课题:密码锁 一上来不bb太多,提供所有文件下载地址. 点击下载所有文件(汇编51单片机密码锁(含论文.程序.AD图)单片机课程设计) https://download.csdn. ...

  9. 基于C++的文件加密解密(密码学课程设计)

    资源下载地址:https://download.csdn.net/download/sheziqiong/86882054 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. 如何用TensorFlow在安卓设备上实现深度学习推断
  2. [LintCode] Single Number 单独的数字
  3. ListView中添加Button后,Button的点击事件和ListView的点击事件冲突
  4. STL之multiset中equal_range,multimap中的equal_range,bitset容器,string字符串操作,lambda表达式
  5. flex 固定一列_css实现两列固定与一列自适应的几种方法
  6. vi 编辑意外中断处理办法
  7. canvas的基础使用。
  8. axios_的默认配置_使用演示---axios工作笔记008
  9. UI设计中标签栏图标设计规范
  10. 单片机c语言中的精确延时程序,单片机精确毫秒延时函数
  11. Python爬虫:浅谈【破解某易云音乐加密-JS逆向】
  12. 挪车电话也有商机,易扫挪车App
  13. 克莱姆森大学计算机排名,2020年克莱姆森大学排名TFE Times美国最佳计算机科学硕士专业排名第102...
  14. BAT批处理判断是否是文件夹,是则遍历
  15. 系统服务之下载管理(DownloadManager)
  16. 关于微信小程序与Java后台交互数据中中文乱码问题的讨论
  17. POJ3608-旋转卡壳
  18. 接口测试——postman文件夹介绍以及批量执行用例
  19. redis安装和启动
  20. chatgpt智能提效职场办公-ppt怎么压缩文件大小

热门文章

  1. c语言排列组合还可以这样求
  2. GB/T 28181国标2022版本变化
  3. ICML的出版社问题
  4. IDC FutureScape:全球政府行业2019年预测——中国启示
  5. mysql-5.7.32的三种安装详解
  6. 外盘国际期货招商:原油市场热点话题
  7. Matlab中的DSP应用中的tf2zp函数及zplane(z,p)
  8. Vue组件之间的传参方式小总结
  9. Ztree树的复选框和获取选择的节点实例和代码
  10. CollapsingToolbarLayout的使用及折叠事件监听