Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制文件加密问题_C++_File_Binary_Xor - Fatal编程技术网

C++ 二进制文件加密问题

C++ 二进制文件加密问题,c++,file,binary,xor,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

我在加密文件中的某些数据时遇到问题。我用简单的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];
}
静态void编解码器(常量char*key、int-keySize、char*in、char*result、int-length)
{

对于(int i=0;i首先,确定数据写入磁盘时是否实际发生了更改。让程序在以下四个位置打印字符串:

  • 在加密之前
  • 加密后但写入磁盘之前
  • 从磁盘读取后但在解密之前
  • 解密后
  • #2和#3的结果是否相同?如果是,则文件在传输到磁盘和传输回磁盘的过程中不会被更改

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

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


    将数据写入磁盘并读取磁盘代码,部分问题可能就在这里。

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

  • 在加密之前
  • 加密后但写入磁盘之前
  • 从磁盘读取后但在解密之前
  • 解密后
  • #2和#3的结果是否相同?如果是,则文件在传输到磁盘和传输回磁盘的过程中不会被更改

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

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


    将您的写操作发送到磁盘并从磁盘代码中读取,部分问题可能就在那里。

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

    FILE *input_file = fopen(input_file_name, "rb");
    FILE *output_file = fopen(output_file_name, "wb");
    
    std::ifstream input_file(input_file_name, ios::in | ios::binary);
    std::ofstream output_file(output_file_name, ios::out | ios::binary);
    

    如果你被欺骗使用C++流,这意味着

    FILE *input_file = fopen(input_file_name, "rb");
    FILE *output_file = fopen(output_file_name, "wb");
    
    std::ifstream input_file(input_file_name, ios::in | ios::binary);
    std::ofstream output_file(output_file_name, ios::out | ios::binary);
    

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

    FILE *input_file = fopen(input_file_name, "rb");
    FILE *output_file = fopen(output_file_name, "wb");
    
    std::ifstream input_file(input_file_name, ios::in | ios::binary);
    std::ofstream output_file(output_file_name, ios::out | ios::binary);
    

    如果你被欺骗使用C++流,这意味着

    FILE *input_file = fopen(input_file_name, "rb");
    FILE *output_file = fopen(output_file_name, "wb");
    
    std::ifstream input_file(input_file_name, ios::in | ios::binary);
    std::ofstream output_file(output_file_name, ios::out | ios::binary);
    

    请注意,您需要以二进制模式打开文件(
    fopen
    )中的“rb”/“wb”而不是“r”/“w”)。Windows C实现在转换方面尤其存在问题


    使用
    无符号字符
    s进行算术和按位操作也是一个好主意;除了8位2的补码有符号字符以外的任何字符都可能会引起麻烦(当然,大多数实现使用对称异或加密,并且可能不会引起任何麻烦,但还是要小心。)

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


    使用
    无符号字符
    s进行算术和按位操作也是一个好主意;除了8位2的补码有符号字符以外的任何字符都可能会引起麻烦(当然,大多数实现使用对称异或加密,并且可能不会引起任何麻烦,但还是要小心。)

    在询问XOR问题时,你不能真正使用“加密”标签……任何家伙只需0.0001秒就可以找出你的“密钥”。你是如何写入/读取文件的?还有@Remus,他似乎在使用一次性键盘,因为他的代码使用的是密钥流。只要他不重复使用密码,这在技术上是安全的key.EDIT:哦,除非他使用的密钥比文件短。那么,是的,用零作为密钥进行异或很容易理解——你的算法工作吗?你是否假设文件名以NULL结尾,然后用加密删除NULL?@Remus Rusanu:这正是envcryption的意思。是的,异或很简单。但是giv这是一个很好的一次性按键,它可以抵抗大多数(不是政府而是个人)的突然强制。看看这需要多长时间(将每个字符转换为int以便我可以发布):“373112184673143306521105212171726192386213053975346975010120871208400282628151588102”当你问一个异或问题时,你不能真正使用“加密”标签……任何一个家伙都只需要0.0001秒就可以找到你的“密钥”。你是如何写/读文件的?还有@Remus,他似乎在使用一次性键盘,因为他的代码使用的是密钥流。只要他不重复使用密钥,这在技术上是安全的。编辑:哦,除非他使用的密钥比文件短。那么,是的,这将是一个很容易搞定的问题——用零作为密钥进行异或——你的算法工作吗?你是否假设一个以NULL结尾的文件名,然后用加密删除NULL?@Remus Rusanu:这正是环境加密的意思。是的,异或很简单。但是如果很好的一次性按键,它可以抵抗大多数(不是政府而是个人)的突然分裂。看看这需要多长时间(将每个字符转换成int,以便我可以发布):“37311286166731430652102105121717263119386213053975346975010120871208400262625151588102”