C ++使用文件加密和解密秘密消息

时间:2014-12-09 05:15:00

标签: c++ encryption

我在头文件中有我的原型,但我需要一些帮助。我在整个程序编译过程中遇到了一些麻烦。它似乎陷入了输入的循环中。可能是功能的一些问题。提前感谢任何意见。

 #include <iostream>
  #include <conio.h>
   #include "header.h" 
   #include <fstream>  
 class Caesar  
  {  
  public: void readText(char *input);  
      void encrypt(char *input,char *output,char *key);  
     void decrypt(char *input,char *output,char *key);  

    }; 

void main()  
 {  
Caesar a;  
 char key[1000];  
ifstream fin;
 int choice;
char input[100],output[100];  

 cout<<"\n Enter input file: ";  
 cin>>input;  
 cout << input;
 cout<<"\n Enter output file: ";  
 cin>>output; 
 cout <<output;
 cout<<"\n Enter key: ";  
 cin>>key; 
 cout <<key;
 cout<<"\n\n 1. Encrypt\n 2. Decrypt\n\n Select choice(1 or 2): "<< endl;  
 cin >> choice;
 cout << choice;
 a.readText(input); 
 if(choice==1)  
 {
   a.encrypt(input,output,key);  
 }
 if(choice==2)  
 {
     a.decrypt(input,output,key);  
 }
  else  
 {
    cout<<"\n\n Unknown choice";  
 }

 }    

void Caesar::readText(char *input)  
{  
 ifstream reader;  
 char buf;  
 reader.open(input);  
 cout<<"\n\n <--- "<<input<<" --->\n";  
 buf=reader.get();  
 while(!reader.eof())  
 {  
  cout<<buf;  
  buf=reader.get();  
 }  
 reader.close();  
 }  

  void Caesar::encrypt(char *input,char *output,char *key)  
  {  
  ifstream reader;  
  ofstream writer;  
  char buf;  
  reader.open(input);  
  writer.open(output);  
  buf=reader.get();  
  while(!reader.eof())  
  {  
    if(buf>='a'&&buf<='z')  
   {  
     buf-='a';  
     buf+=key[buf];  
     buf%=26;  
     buf+='A';  
    }  
    writer.put(buf);  
    buf=reader.get();  
    }  
   reader.close();  
   writer.close();  
   readText(input);  
   readText(output);  
   }  

  void Caesar::decrypt(char *input,char *output,char *key)  
  {  
   ifstream reader;  
   ofstream writer;  
   char buf;  
   reader.open(input);  
   writer.open(output);  
   buf=reader.get();  
   while(!reader.eof())  
  {  
  if(buf>='A'&&buf<='Z')  
  {  
     buf-='A';  
     buf+=26-key[buf];  
     buf%=26;  
     buf+='a';  
   }  
   writer.put(buf);  
   buf=reader.get();  
   }  
  reader.close();  
  writer.close();  
  readText(input);  
  readText(output);  
 }  

3 个答案:

答案 0 :(得分:0)

if(choice=1)  

应该是

if(choice==1)  

以及其他if

在您的情况下,您要将值1分配给choice,然后测试choice是否为true,它是,因为任何非零数字类型隐含地投放到bool true

答案 1 :(得分:0)

我刚刚执行了您的代码,并尝试对其进行调试并进行了屏幕截图

你输入选择后程序进入循环。cin>>没有问题。

enter image description here

答案 2 :(得分:0)

从您的评论中,您似乎只是想尝试调试main。一切似乎都很好。你输入什么钥匙?如果它是一个非常大的整数,那可能是你的问题,因为它可能超过最大整数范围并导致溢出。

您的密钥是整数变量。您正在输入包含密钥的文件名的字符串,因此应将其更改为C字符串数组。将所有传递的关键参数更改为char *而不是int。

调用readText()函数时,你有一个无限循环。

也许试试这个:

void Caesar::readText(char *input)  
{  
    ifstream reader(input);
    if(reader.is_open())
    {
        char buf;
        cout<<"\n\n <--- "<<input<<" --->\n"; 
        while(reader.get(buf))
        {
            cout << buf;
        }
    }    
    reader.close();  
}

确保您的文本文件与代码位于同一文件夹中。有关详细信息,请参阅此处:ifstream not opening file