二进制文件加密问题

时间:2010-08-03 22:52:20

标签: c++ file binary xor

我在加密文件中的某些数据时遇到问题。我正在使用简单的xor。 让我说我有这个结构:

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

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

3 个答案:

答案 0 :(得分:2)

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

  1. 加密之前
  2. 加密之后但在将其写入磁盘之前
  3. 从磁盘读取之后但在解密之前
  4. 解密后
  5. #2和#3的结果是否相同?如果是这样,那么在传输到磁盘和返回期间文件不会被更改。

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

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

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

答案 1 :(得分:2)

您必须以二进制模式打开文件。如果您使用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);

答案 2 :(得分:1)

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

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