我正在使用XTEA算法進行加密/解密程序。該加密器/解密功能正常工作,但是當我加密被一個文件,然後破譯它,我得到一些額外的字符在文件的結尾:Ofstream將額外字符添加到我的輸出中
--- Original file ---
QwertY
--- Encrypted file ---
»¦æŸ[email protected]±
--- Deciphered from encrypted ---
QwertY ß*tÞÇ
我不知道爲什麼「SS *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) – 2012-04-09 09:57:32
感謝您的鏈接,但我可以向你保證這不是重複的......你在你給我的鏈接中看到,他們一次只讀1個字符。我一次讀取一個64位塊,即使塊在EOF之前只接收1個字節,我仍然可以對它進行加密/解密,然後循環將不會再次運行。 – Janman 2012-04-09 11:35:18
該塊實際上在EOF之前接收到零個字節。你仍然破譯並再寫一次。關鍵是'in.eof()'告訴我們上一次讀取是否失敗,而不是下一次讀取是否成功。 – 2012-04-09 12:36:01