加密时文件末尾出现奇怪的字符

Weird characters appear at the end of file when encrypting it

我从没想过我必须求助于 SO 来解决这个问题。

好吧,为了更深入地了解我正在制作自己的加密程序。 我并不想让它变得更好或任何它只是一个个人项目。 该程序正在做的是翻转字符的每个字节中的某些位,使其不可读。

然而,每次我 运行 程序和解密时,我都会在输出中得到奇怪的字符。这些字符似乎与以下行数匹配:

^^ 我要加密的文本

^^ 加密后。 (很多文字被截断了)

^^解密后。有 10 个空字符对应于换行符的数量。似乎还有另一个奇怪的“?”字符。这些字节来自哪里??

我已经尝试了很多东西。这是我的代码,如果有人需要的话(它是用默认标志编译的):

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>

#define ENCRYPTFILE "Encrypted.oskar"

typedef unsigned char BYTE; 

char saltFunc(BYTE salt, char chr) {
   for(int i = 0; i < 8; i++) {
      if((salt >> i) & 1U) {
         chr ^= 1UL << i;
      }
   }

   return chr;
}

int main () {
   std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in);
   std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in);
   unsigned int length;
   unsigned int lineLength;
   BYTE salt = 0b00000001;
   std::string line;

   std::cin.unsetf(std::ios::dec);
   std::cin.unsetf(std::ios::hex);
   std::cin.unsetf(std::ios::oct);

   //std::cout << "input salt in hex with a prefix 0x so for example. 0xA2" << std::endl;
   //std::cin >> std::hex >> salt;

   inputFile.seekg(0, inputFile.end);
   length = inputFile.tellg();
   inputFile.seekg(0, inputFile.beg);

   std::cout << lineLength << std::endl;

   char* fileBuffer = new char[length];
   char* encryptFileBuffer = new char[length];
   memset(fileBuffer, 0, length);
   memset(encryptFileBuffer, 0, length);

   while (inputFile.good()) { // just get file length in bytes.
      static int i = 0;
      fileBuffer[i] = inputFile.get();
      i++;
   }

   while (std::getline(inputFile, line))
      ++lineLength;

   inputFile.clear();
   encryptFile.clear();

   std::cout << "file size: " << length << std::endl;

   for(int i = 0; i < length; i++) {
      encryptFileBuffer[i] = saltFunc(salt, fileBuffer[i]);
      encryptFile << encryptFileBuffer[i];
   }

   inputFile.close();
   encryptFile.close();
   delete[] encryptFileBuffer;
   delete[] fileBuffer;
   return 0;
}

问题是您正在测量 字节 的文件长度,对于文本文件,这与 个字符的长度不同。但是您随后将其作为字符读取,因此您最终读取了太多字符,然后在输出文件结束后写入了额外的垃圾。

由于每行多了一个字符,很可能您在 Windows 上 运行,其中行结束字符是文件中的两个字节。这就是您看到的额外不正确长度的来源。

对于 encryption/decryption 你可能想要做的是以 binary 模式读写文件,所以你正在读写 bytes 不是 个字符 。您可以通过在打开文件时将 std::ios::binary 添加到标志中来执行此操作:

std::ofstream encryptFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);
std::ifstream inputFile(ENCRYPTFILE, std::ifstream::in | std::ios::binary);