0

我在加密文件中的某些数据时遇到问题。我为此使用了简单的异或。假设我有这个结构:

struct MyFile{
char fileName[128];
int account;
float balance;};

将其保存为二进制文件可以正常工作,但是当我使用 xor 加密结构中的文件名并将结构保存到 hd 时,读取结构和解密文件名没有正确显示字符。我将这个简单的功能用于加密/解密目的。

static void Codec(const char *key,int keySize,char* in,char *result,int length)  
{
    for(int i=0;i<length;i++)
        result[i]=in[i]^key[i%keySize];
}

请注意,当我加密文件名并直接在内存中解密时,结果是正确的。我错过了什么,为什么保存在硬盘上时会被更改。请尽快回复并提前tnx ...

4

3 回答 3

2

首先,确定数据在写入磁盘时是否实际被更改。让您的程序在以下四个位置打印出字符串:

  1. 在加密之前
  2. 在加密之后但在将其写入磁盘之前
  3. 从磁盘读取它之后但在解密之前
  4. 解密后

#2 和 #3 的结果是否相同?如果是这样,那么文件在传输到磁盘和返回期间不会被更改。

如果 #2 和 #3 不同,请尝试将未加密的字符串写入磁盘并将其读回。这是否成功?

仅将一个这样的结构写入文件并在十六进制编辑器中检查文件的内容。文件在磁盘上时是什么样子的?

也发布您的写入磁盘和从磁盘读取的代码,部分问题可能出在此处。

于 2010-08-03T23:04:24.533 回答
2

您必须以二进制模式打开文件。如果你使用 CI/O(就像我通常做的那样),这意味着

FILE *input_file = fopen(input_file_name, "rb");
FILE *output_file = fopen(output_file_name, "wb");

相反,如果您被欺骗使用 C++ 流,这意味着

std::ifstream input_file(input_file_name, ios::in | ios::binary);
std::ofstream output_file(output_file_name, ios::out | ios::binary);
于 2010-08-03T23:05:11.457 回答
1

请注意,您需要以二进制模式打开文件(“rb”/“wb”而不是“r”/“w” fopen)。\n特别是 Windows C 实现在<->\r\n转换方面存在问题。

unsigned char将s 用于算术和按位运算也是一个好主意;除了 8 位二进制补码符号字符之外的任何东西都可能会导致麻烦(当然,大多数实现都使用对称 XOR 加密,并且可能不会对对称 XOR 加密造成任何问题,但还是要小心。)

于 2010-08-03T23:13:41.000 回答