私はXTEAアルゴリズムを使用して暗号化/復号化プログラムを作成しています。 ENCIPHER /解読機能が正常に動作しますが、私は、ファイルを暗号化し、それを解読するとき、私は、ファイルの最後にいくつかの余分な文字を取得します:Ofstreamは出力に余分な文字を追加します
--- Original file ---
QwertY
--- Encrypted file ---
»¦æŸ[email protected]±
--- Deciphered from encrypted ---
QwertY ß*tÞÇ
私は「ß*tÞÇ」が表示され、なぜ分かりません最終的には。 私はコードが長すぎるので、コードの一部を投稿しますが、すべてではありません。暗号化/復号化機能は、64ビットのデータと128ビットのキーを取り、そのデータを同じブロックサイズ、すなわち64ビット(similar functions here)に暗号化/復号化する。新しいファイルに書き込むことができます。
long data[2]; // 64bits
ZeroMemory(data, sizeof(long)*2);
char password[16];
ZeroMemory(password, sizeof(char)*16);
long *key;
if(argc > 1)
{
string originalpath = argv[1];
string finalpath;
string eextension = "XTEA";
string extension = GetFileExtension(originalpath);
bool encipherfile = 1;
if(extension.compare(eextension) == 0) // If extensions are equal, dont encipher file
{
encipherfile = 0;
finalpath = originalpath;
finalpath.erase(finalpath.length()-5, finalpath.length());
}
ifstream in(originalpath, ios::binary);
ofstream out(finalpath, ios::binary);
cout << "Password:" << endl;
cin.get(password,sizeof(password));
key = reinterpret_cast<long *>(password);
while(!in.eof())
{
ZeroMemory(data, sizeof(long)*2);
in.read(reinterpret_cast<char*>(&data), sizeof(long)*2); // Read 64bits from file
if(encipherfile == 1)
{
encipher(data, key);
out.write(reinterpret_cast<char*>(&data), sizeof(data));
continue;
}
if(encipherfile == 0)
{
decipher(data, key);
out.write(reinterpret_cast<char*>(&data), sizeof(data));
}
}
[EOFが最後の行を繰り返すまでのテキストファイルからの読み込み]の可能な複製(http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line) –
ありがとうリンクが、私はあなたが私に与えたリンクで一度に1文字を読むことがわかります。私は一度に64ビットブロックを読んでいますが、ブロックはEOFの前に1バイトしか受信しませんが、それでも暗号化/復号化できるはずです。そしてループは再び実行されません。 – Janman
ブロックは実際にはEOFの前にゼロバイトを受け取ります。あなたはまだもう一度解読して書きます。ポイントは、 'in.eof()'は前の読み込みが失敗したかどうかを示し、次の読み込みが成功するかどうかを示します。 –