2011-12-29 26 views
0

以下程序尝试加密字符串并保存到文本文件中,并打开文件,解密并显示消息。Visual C++ XOR加密错误

这里是代码 -

private: System::Void saveToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { 
      SaveFileDialog^ dlg = gcnew SaveFileDialog(); 
      dlg->Filter = "Text Files|*.txt"; 
      char key = 'a'; 
      if(dlg->ShowDialog()==Windows::Forms::DialogResult::OK) 
      { 
       String^ stream = txtOutput->Text; 
       char* num = new char[stream->Length]; 
       char* xorchar = (char*)(void*)Marshal::StringToHGlobalAnsi(stream); 
       int i=0; 
       for(i=0;i<stream->Length;++i){ 
        num[i] = *xorchar^key; 
        *xorchar++; 
       } 

       num[i] = '\0'; //add trailing NULL 
       //Marshal::FreeHGlobal((System::IntPtr)(void*)xorchar); THIS WAS GIVING AN ERROR, NOT SURE WHY 
       String^ save = gcnew String(num); 
       System::IO::File::WriteAllText(dlg->FileName, save); 
      } 

     } 
private: System::Void openToolStripMenuItem_Click(System::Object^ sender,  System::EventArgs^ e) { 
     OpenFileDialog^ dlg = gcnew OpenFileDialog(); 
     dlg->Filter = "Text Files|*.txt"; 
     String^ stream; 
     char key = 'a'; 
     if(dlg->ShowDialog()==Windows::Forms::DialogResult::OK) 
     { 
      stream = System::IO::File::ReadAllText(dlg->FileName); 


      char* num = (char*)(void*)Marshal::StringToHGlobalAnsi(stream); 
      int i=0; 
      for (i=0;i<stream->Length;++i) 
      { 
       num[i] = num[i]^key; //DECRYPT 
      } 

      String^ orig_stream = gcnew String(num); 
      txtOutput->Text = orig_stream; 

     } 
    } 

现在的问题是,当我输入一个字符串,它只能是在不等于关键角色。 例如,让key ='a'

例如:INPUT:“我喜欢这个”//这将正确解密。

输入:“我喜欢苹果”//只有'我喜欢'才会解密,休息不会显示。

即,如果遇到字符“键”(在本例中为'a'),则停止解密。

任何帮助表示赞赏。谢谢!

+0

空间后的“Like”很可能越来越异或零值。确保你正在读/写二进制文件中的数据。 – 2011-12-29 19:56:13

+1

实际上,它不是''('关键'),它将异或为'\ 0'('null')吗?这会在你真正想要之前终止字符串。 – 2011-12-29 20:03:25

+1

使用Encoding :: Default :: GetBytes()将字符串转换为byte []和File :: WriteAllBytes()来保存结果。 – 2011-12-29 20:38:05

回答

3

与自身相差的值将始终为0. 0 char也称为空终止符(0 == '\0')。 C++中的字符串是空终止的,也就是说它们停在空终止符处。

简单的例子:

#include <iostream> 

int main(){ 
    char str[] = "hi there!\0this will not get printed."; 
    std::cout << str; 
} 
+0

感谢您发现错误!我想不能像@Hans Passant在他的评论中提到的那样使用正确的方式。 – arijeet 2011-12-30 05:33:52