永发信息网

程序设计——加解密处理

答案:1  悬赏:80  手机版
解决时间 2021-05-10 21:18

加解密处理

1、系统的基本功能

编写一个对文件(由数字或字母组成)进行加密解密的程序。可以将所需要的内容(整个文件或者输入的一行字符)加密,也可以将存储的加密文件翻译回来。例如加密时可以将选取内容的每个字符依次反复加上”49632873”中的数字,如果范围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(既N%122).解密与加密的顺序相反。

2、要求及提示2.1 程序执行过程

(1)从键盘输入要进行加密的一行字符串或者需要加密的文件名。

(2)显示菜单:

1.       设置加密方法

2.       加密

3.       解密

4.       显示原始文件和解密文件

(3)选择菜单,进行相应的操作。加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到文件中;解密是将加了密的文件还原并保存到文件中,同时应比较与原始文件的一致性;显示是将文件在屏幕上显示出来,供人工校对。

2.2数据结构

1 加密方法用结构表示

struct password    

{ char ps[10];     

long l;         

long wd;}      

2定义原始文件sourse.txt、加密文件result.txt和还原文件recall.txt

3 程序模块及函数功能:

(1)       在屏幕上显示文件 void printtxt();

(2)       加密void encode();

(3)       解密void decode();

(4)       文件比较void cmptxt();

2.2 算法提示

(1)加密时,每个字符依次反复加上”49632873”中的数字,如果范围超过ASCII码值的032(空格)—122(‘z’),则进行模运算(即N%122).

 例如:加密the

(t)116+4,(h)104+9,(e)101+6

变为xqk

(2) 解密:解密过程与加密过程的顺序正好相反,即从第一个字符开始,每个字符依次反复减去”49632873”中的数字,若执行减法后得到一个负数,则把这个负数加122然后取余,即 (N+122)%122, 其中N为负数。

   例如:把xqk解密

   (x) 120-4  (q)111-9  (k) 107-6

   变为 the

2.3 其他要求

(1)变量、函数命名符合规范。

(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

(3)程序的层次清晰,可读性强。

3 开发环境

可以选择TC2.0、TC3.0、VC++6.0等开发环境。

最佳答案
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
struct password
{
char ps[10];
long l;
long wd;
}password;
char *s=new char[100];
void set()
{
cout<<endl<<"输入加密字符串:";
cin>>password.ps;
cout<<endl<<"输入加密间隔字节数:";
cin>>password.l;
cout<<endl<<"输入加密字节数:";
cin>>password.wd;
}
void printtxt()
{
    ifstream fs1(s,ios::nocreate);//以输入方式打开文件
ifstream fs2("result.txt");
ifstream fs3("recall.txt");
char c;
cout<<endl<<"原始文件:";
if(!fs1)
{
cout<<s;
}
else
{
while(fs1.get())
cout<<c;
}
cout<<endl;;
cout<<endl<<"加密文件:";
while(fs2.get())
 cout<<c;
cout<<endl;
cout<<endl<<"解密文件:";
while(fs3.get())
 cout<<c;
cout<<endl;
fs1.close();//关闭文件
fs2.close();
fs3.close();
}
void encode()
{
int n=strlen(password.ps);
char N;
char c;
ofstream out("result.txt");
ifstream fs(s,ios::nocreate);
if(!fs)   //文件为空则为对字符串s进行加密
{
int m=strlen(s);
for(int i=0;i<m;i++)
{
if(i%password.l==0)
{
static int a=0;
if(a<password.wd)
{
N=s[i]+password.ps[a%n]-48;
if(N>122)
{
N=N%122;
}
out.put(N);
a++;
}
else out.put(s[i]);
}
else out.put(s[i]);
}
}
else//文件非空,为对文件进行加密
{
    for(int i=0;fs.get();i++)
{
if(i%password.l==0)
{
   static int a=0;
   if(a<password.wd)
   {
   N=c+password.ps[a%n]-48;
    if(N>122)
   {
   N=N%122;
   }
   out.put(N);
    a++;
   }
   else out.put(N);    
}
else out.put(N);
}
}
cout<<endl<<"加密成功!"<<endl;
out.close();
fs.close();
}
void cmptxt()
{
ifstream fs1(s,ios::nocreate);
ifstream fs2("recall.txt");
char c1,c2;
if(!fs1)   //fs1文件空,为对字符串和fs2之间比较
{
for(int i=0;s[i];i++)
{
    fs2.get(c2);
if(s[i]!=c2)  //若出现不同的字符则解密失败
{
cout<<endl<<"错误!解密失败!"<<endl;
fs1.close();
fs2.close();
return;
}
}
if(fs2.get(c2))   //若字符串s已被判断完毕但文件fs2中未终止则解密失败
{
cout<<endl<<"错误!解密失败!"<<endl;
fs1.close();
fs2.close();
return;
}
}
else  //对两个文件进行比较
{
    while(fs1.get(c1)&&fs2.get(c2))  
 {
    if(c1!=c2)    //若出现不同字符则解密失败
 {
    cout<<endl<<"错误!解密失败!"<<endl;
 fs1.close();
 fs2.close();
 return;
 }
 }
    if(fs1.get(c1)||fs2.get(c2))   //若已有一个文件到达结尾但另一文件中仍有字符则解密失败
 {
 cout<<endl<<"错误!解密失败!"<<endl;
 fs1.close();
 fs2.close();
 return;
 }
}
cout<<endl<<"解密成功!"<<endl;
fs1.close();
fs2.close();
}
void decode()
{
ofstream out("recall.txt");
ifstream fs("result.txt");
char c,N;
int n=strlen(password.ps);
for(int i=0;fs.get();i++)
{
if(i%password.l==0)
{
static int a=0;
if(a<password.wd)
{
N=c-(password.ps[a%n]-48);
if(N<0)
{
N=(N+122)%122;
out.put(N);
}
else
{
if(N==0) out.put('z');
else out.put(N);
}
a++;
}
else out.put(N);
}
else out.put(N);
}
fs.close();
out.close();
cmptxt();
}
void main()
{
cout<<"请输入需要加密的内容"<<endl;
    cin>>s;
    int a=0;
while (a!=5)
{
    cout<<endl<<"★★★选择菜单★★★"<<endl;//显示提示的信息
cout<<"1.设置加密方法"<<endl;
cout<<"2.加密"<<endl;
cout<<"3.解密"<<endl;
cout<<"4.显示原始文件和解密文件"<<endl;
cout<<"5.退出"<<endl;
cout<<"请选择:";
cin>>a;
    switch(a)
{
case 1://用单条件多选择语句实现调用与循环
set();
cout<<endl;
break;
case 2:
encode();
cout<<endl;
break;
case 3:
decode();
cout<<endl;
break;
case 4:
printtxt();
cout<<endl;
break;
case 5:
cout<<endl<<"谢谢使用!"<<endl<<endl;
break;
default:
cout<<endl<<"输入错误 请再次输入"<<endl;
}
}
}
 有不会的直接QQ联系我吧    736092703
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请问人体最大的器官是什么?
网络爱情可以现实化不????
怎样才让女人死心的跟这你
诺基亚3600S怎么老是花屏呀!我去年才买的谁
那里有会计考证的书买?
如果月经延后一般会延长几天?
关于最值的问题
诛仙佛九黎门派加点这样加如何
Q宠物大乐斗级别高的为什么不能批准加到门派
找侠盗飞车版本
长期服用紧急避孕药会不会发胖
安装系统到一半弹出A.什么TXT怎么办
绿色征途武术选什么职业好怎么加点
征求好看的玄幻小说
优美文章出处及赏析,优美段落摘抄(标明出处)
推荐资讯
处女第一次是不是必须得出血?
赛尔号开朗鲁斯王刷什么好
如何观察到空气中的光束路径
网吧怎么下不了歌,还把俺的内存卡也搞坏了
各位高手帮忙参考下配置
金鑫五交化在什么地方啊,我要过去处理事情
http://v.youku.com/v_show/id_XOTI4Nzk2MDg=
晚上老是感觉很怕,是不是被什么东西吓到了?
刹车是向左跑偏,特别的厉害
DNF中这个怎么打开或者怎么付魔??
北京师范大学八年级上册数学概念
数码相机家用哪种适合?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?