2011-12-29 20 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; 

     } 
    } 

です。 例:let 'key' = 'a'

例:INPUT: "I Like This" //これは正しく復号化されます。

INPUT:「私はリンゴが好きです」//「私の好きな人」だけが解読し、残りは現れません。

つまり、 'key'という文字(この場合は 'a')が検出されると、復号が停止されます。

何か助けていただければ幸いです。ありがとう!

+0

スペースの後に。バイナリファイルとの間でデータの読み書きを行っていることを確認してください。 –

+1

実際、 '\ 0'(' null')にXORする 'a'(キー)はありませんか?これは、本当にしたい前に文字列を終了します。 –

+1

文字列をbyte []およびFile :: WriteAllBytes()に変換して結果を保存するには、Encoding :: Default :: GetBytes()を使用します。 –

答えて

3

値xor'dは常に0を出力します。0 charはヌルターミネータ(0 == '\0')とも呼ばれます。 C++の文字列はNULLで終了します。別名では、NULL終止符で終わります。

簡単な例:「のように」おそらくゼロ値にXORされるばかり

#include <iostream> 

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

エラーを発見してくれてありがとう!彼のコメントで@Hans Passantが述べたように、これを行う正しい方法を悪用していると思います。 – arijeet