2010-08-03 143 views
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]; 
} 

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

+3

您无法真正使用'加密'标签,当询问XOR问题时......任何家伙只需要0.0001秒就可以找出你的'钥匙'。 – 2010-08-03 22:55:57

+1

你是如何编写/阅读文件的?而@ Remus,他似乎在使用一次性键盘,因为他的代码使用了一串键。只要他不重用密钥,这在技术上是安全的。编辑:哦,除非他使用的文件比文件短。然后是的,这将是可笑的容易找出 – Xzhsh 2010-08-03 22:56:30

+0

尝试异或与它的零键 - 是你的算法? – 2010-08-03 23:03:36

回答

1

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

unsigned char用于算术和位运算也是一个好主意;除8位二进制补码之外的任何字符都可能会造成麻烦(这是允许的,大多数实现使用并且可能不会造成对称XOR加密的任何问题,但仍需谨慎。)

2

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

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

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

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

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

发布写入磁盘和从磁盘读取的代码也可能存在问题的一部分。

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);