Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;异或加密_C++_Encryption_Cryptography - Fatal编程技术网

C++ C++;异或加密

C++ C++;异或加密,c++,encryption,cryptography,C++,Encryption,Cryptography,在阅读了几篇关于密码学和运行时PE密码器的白皮书之后,我决定自己写一篇。它非常简单,并且只用于教育目的 以下是GitHub回购协议: 我有两个问题 首先,为什么我必须不断更改文件权限才能启动 每个输出的.exe(由Builder.exe而不是编译器创建的文件)?它创建了一个共享的文件。我必须右键单击它并选择与无人共享。这是否与文件访问和安全权限有关?我正在使用CreateFile()和Readfile读取和写入输入和输出文件 第二,我似乎无法让XOR加密工作。它看起来很漂亮 对我所做的

在阅读了几篇关于密码学和运行时PE密码器的白皮书之后,我决定自己写一篇。它非常简单,并且只用于教育目的

以下是GitHub回购协议:

我有两个问题

  • 首先,为什么我必须不断更改文件权限才能启动 每个输出的.exe(由Builder.exe而不是编译器创建的文件)?它创建了一个共享的文件。我必须右键单击它并选择与
    无人共享
    。这是否与文件访问和安全权限有关?我正在使用
    CreateFile()
    Readfile
    读取和写入输入和输出文件

  • 第二,我似乎无法让XOR加密工作。它看起来很漂亮 对我所做的一切直截了当。字节大小相同。在我进行调查时,我让构建器和存根各自输出一个未加密文件数据的文件。它们是一样的。然后我尝试加密数据。毫无疑问,数据是用密码加密的,但是当存根稍后对其解密时,它将显示为空白。我很困惑
以下是我的XOR实现:

fs=字节大小 Rsize=字节大小 应该是一样的

建造商:

 char cipher[] ="penguin";
      for (int i = 0; i < fs; i++)
        {   
                FB[i] ^= cipher[i % strlen(cipher)]; // Simple Xor chiper
        }
char-cipher[]=“企鹅”;
for(int i=0;i
存根:

char-cipher[]=“企鹅”;
对于(int i=0;i
如果我在生成器和存根中注释掉加密函数,加密文件运行良好。嗯,除了权限错误


我还试图包括一个选项菜单,用户可以在其中选择使用的加密方法。也许我在那里做错了什么?Builder.exe将包含用户选择的一个字节添加到
FB
缓冲区的末尾。Stub.exe读取并确定使用哪种加密方法解密数据

根据您的内容数据,在调用strcat(FB,choice)时,您可以在“C++Builder/main.cpp”中由FB指向的或在它之后()的分配内存中写入char选项

修复:在FB中为数据+选项字符分配足够的空间。在处理二进制数据时,不应使用字符串函数(例如:)

首先,使用XOR“加密”,您的“加密”和“解密”函数应该相同:

void xor_crypt(const char *key, int key_len, char *data, int data_len)
{
    for (int i = 0; i < data_len; i++)
        data[i] ^= key[ i % key_len ];
}
然后在调用该函数的程序中,您将声明:

std::string key = "penguin";
你可以这样读你的文件:

std::vector<char> file_data;  // With your current program, make this a global.

fs = GetFileSize(efile, NULL);
file_data.resize(fs);    // set vector length equal to file size

// Note:  Replace &( file_data[0] ) with file_data.data() if you have C++11 support
ReadFile(efile, (LPVOID)( &( file_data[0] )), fs, &bt, NULL);   

if (fs != bt)
    // error reading file:  report it here.
我怀疑真正的问题在于您使用的Windows API。
LoadResource
是否为您提供可变数据,或者您是否需要复制它?我不知道Windows API,但如果
LoadResource
提供只读副本,我也不会感到惊讶

如果您确实需要创建自己的副本来修改资源,那么在“存根”程序中,恢复XOR加密的资源应该如下所示:

std::vector<char> RData;

void Resource(int id)
{
    size_t Rsize;

    HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(1), RT_RCDATA);
    HGLOBAL temp = LoadResource(NULL, hResource);
    Rsize = SizeofResource(NULL, hResource);
    RData.resize(RSize);
    memcpy( (void*)&(RData[0]), temp, RSize );  // replace &RData[0] with RData.data() if C++11
}
一旦对数据进行异或加密,一些字节将变为零。因此,
strlen()
函数不会返回
RData
中最后一个字节的索引。还有一个不同的更微妙的错误:返回字符串的最后一个字节,而不是资源的最后一个字节。我真的看不出这句话是怎么正确的;相反,我怀疑你的程序是在加密被禁用时工作的,尽管加密本身是无效的,因为它通过开关盒的
默认值

如果您真的打算根据资源负载的最后一个字节来区分不同类型的数据,那么您真的应该使用Windows API返回的大小来查找该字节


如果您按照我上面的建议切换到使用
vector
,那么您可以使用
RData.back()
找到它。否则,如果您继续使用
char*
,那么该字节将是
RData[RSize-1]

您是否记得以
binary
打开文件?@JoeZ我认为CreateFile()和ReadFile()总是以二进制模式打开文件。文件权限与加密无关,或编程。@EJP它是由my Builder.exe输出的文件。不是编译器。编译器可以很好地构建Builder.exe和Stub.exe。我不确定为什么输出的文件总是
共享的
。我必须右键单击它并选择与
无人共享
,才能运行该文件。我有一个问题。为什么我只为FB分配5个空间?更新,应该是数据大小而不是4。。。我的错误嗯,不知道为什么它不起作用。我决定删除选项菜单。必须是加密的东西。使用
std::vector
,而不是
new
。这不是C。感谢您花时间阅读我的代码,并给我一个非常详细的答案。我采纳了你的建议,用你建议的那些注释掉了我的C风格函数。我唯一需要修复的部分是确保xor函数中的
file\u data
data
是相同的。否则我只是对
文件\u数据的副本进行异或加密
谢谢你的帮助,我的项目中包括了你的名字。我现在要解决的唯一问题是弄清楚为什么加密文件总是作为共享文件输出<代码>\u UINT8*XorCipher(\u UINT8*arr,size\t arrLen,\u UINT64 key){//分配输出缓冲区\u UINT8*outArr=new\u UINT8[arrLen];//将64位密钥引用为8字节字节数组\u UINT8*keyArr=(\u UINT8*)&key;(size\t i=0;i
使用这种方法时需要注意的一件事,@IngeHenriksen,就是endianness。在这种情况下,将使用同一类型的计算机进行加密和加密
std::string key = "penguin";
std::vector<char> file_data;  // With your current program, make this a global.

fs = GetFileSize(efile, NULL);
file_data.resize(fs);    // set vector length equal to file size

// Note:  Replace &( file_data[0] ) with file_data.data() if you have C++11 support
ReadFile(efile, (LPVOID)( &( file_data[0] )), fs, &bt, NULL);   

if (fs != bt)
    // error reading file:  report it here.
// replace &( file_data[0] ) with file_data.data() if C++11
WriteToResources(output, 1, (BYTE *)&( file_data[0] ), file_data.size() ); 
std::vector<char> RData;

void Resource(int id)
{
    size_t Rsize;

    HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(1), RT_RCDATA);
    HGLOBAL temp = LoadResource(NULL, hResource);
    Rsize = SizeofResource(NULL, hResource);
    RData.resize(RSize);
    memcpy( (void*)&(RData[0]), temp, RSize );  // replace &RData[0] with RData.data() if C++11
}
    switch (RData[strlen(RData)-1])