我在加密文件中的某些数据时遇到问题。我正在使用简单的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 ......
答案 0 :(得分:2)
首先,确定数据在写入磁盘时是否实际被更改。让你的程序在这四个地方打印出字符串:
#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加密造成任何麻烦,但是要小心它仍然是好的。)