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

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];
}

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

有帮助吗?

解决方案

请注意,你需要以二进制方式打开文件(“RB” /“白平衡”,而不是“R” /“W”为fopen)。在特定的Windows C实现具有关于\n问题< - >。\r\n转换

这也是一个好主意,使用unsigned chars用于算术和位操作;什么,但8位二进制补签署字符可能会引起麻烦(其中,理所当然的,大多数实现使用,并不一定导致对称XOR加密任何麻烦,但它仍然是很好的要小心。)

其他提示

首先,确定数据在写入磁盘时是否确实被更改。让你的程序在这四个地方打印出字符串:

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

#2 和 #3 的结果相同吗?如果是这样,则文件在磁盘传输和传回期间不会发生更改。

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

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

也发布您的写入磁盘和读取磁盘的代码,部分问题可能就在那里。

您必须以二进制方式打开该文件。如果使用C I / 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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top