Ich mache ein Chiffrierungs-/Entschlüsselungsprogramm mit XTEA-Algorithmus. Die chiffrieren/dechiffrieren Funktionen funktionieren, aber wenn ich eine Datei verschlüsseln und dann entschlüsseln, bekomme ich einige zusätzliche Zeichen am Ende der Datei hinzu:Ofstream fügt zusätzliche Zeichen zu meiner Ausgabe hinzu
--- Original file ---
QwertY
--- Encrypted file ---
»¦æŸ[email protected]±
--- Deciphered from encrypted ---
QwertY ß*tÞÇ
Ich habe keine Ahnung, warum das „ß * tÞÇ“ erscheint schlussendlich. Ich poste etwas von meinem Code, aber nicht alles, da es zu lang wäre. Die Verschlüsselungs-/Entschlüsselungsfunktion benötigt 64 Bit Daten und 128 Bit Schlüssel und verschlüsselt/entschlüsselt die Daten auf die gleiche Blockgröße, die wiederum 64 Bit beträgt(). Es kann dann in eine neue Datei geschrieben werden.
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));
}
}
mögliches Duplikat von [Aus Textdatei lesen, bis EOF die letzte Zeile wiederholt] (http://stackoverflow.com/questions/21647/reading-from-text-file-until-eof-repeats-last-line) –
Danke für die Link, aber ich kann dir versichern, dass dies kein Duplikat ist ... Du siehst in dem Link, den du mir gegeben hast, sie lasen jeweils 1 Zeichen auf einmal. Ich lese einen 64-Bit-Block zu einer Zeit, und obwohl der Block nur 1 Byte vor EOF empfängt, sollte ich noch in der Lage sein, es zu verschlüsseln/zu entschlüsseln, und dann wird die Schleife nicht erneut ausgeführt. – Janman
Der Block empfängt vor dem EOF tatsächlich null Bytes. Sie entziffern und schreiben noch einmal. Der Punkt ist, dass 'in.eof()' uns sagt, ob der vorherige Lesevorgang fehlgeschlagen ist und nicht, ob der nächste Lesevorgang erfolgreich sein wird. –