次のプログラムは、文字列を暗号化してテキストファイルに保存し、ファイルを開き、復号化してメッセージを表示しようとします。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'(' null')にXORする 'a'(キー)はありませんか?これは、本当にしたい前に文字列を終了します。 –
文字列をbyte []およびFile :: WriteAllBytes()に変換して結果を保存するには、Encoding :: Default :: GetBytes()を使用します。 –