将void指针的数据写入文件

时间:2017-02-22 10:40:32

标签: c++ void-pointers

我正在研究一些使用加密库的软件,我无法改变它的基本机制。当程序运行时,生成公钥和私钥大约需要10分钟,这在尝试调试软件的其他部分时非常令人沮丧。我想将密钥写入文件并将其读回以节省时间。

它们的键是无效指针:

Enc_Key_T secKey = nullptr;

Enc_Key_T定义为typedef void* Enc_Key_T

的位置

我用来尝试读取和写入密钥的代码如下(到目前为止只尝试写入密钥):

#ifdef WriteKey

    generate_Keys(parameters, &sec_key, &prv_key);

    FILE * pFile;
    pFile = fopen("sk.bin", "wb");
    fwrite(&sec_key, sizeof(Enc_Key_T), sizeof(&sec_key), pFile);
    fclose(pFile);

#else

    FILE * pFile;
    long lSize;
    char * buffer;
    pFile = fopen("sk.bin", "rb");
    if(pFile == NULL)
        fileError();

    fseek (pFile, 0 , SEEK_END);
    lsize = ftell (pFile);
    rewind (pFile);

    buffer = (char *) malloc (sizeof(char)*lSize);
    if(buffer == NULL)
        memError();

    sec_key = (void *) fread(buffer, 1, lSize, pFile);

    fclose(pFile);
    free(buffer);

#endif

当我写文件时,它出现为64字节文件,但是在密钥指针中读回它被设置为低值内存地址,这让我觉得我做错了。我找不到任何关于如何做到这一点的例子。我甚至不确定它是否可以,因为我不会创建任何底层结构,所以我只是尝试在指针提供的位置分配一些内存。

无论如何,这可以在不必触及生成密钥的底层库的情况下完成吗?

3 个答案:

答案 0 :(得分:2)

简短回答:一般来说,你不能正确地做到这一点。

答案很长: 您缺少的是结构,您无法保证只需编写内存内容即可序列化Enc_Key_T。另外,即使它只是原始的随机数据,也没有已知的长度。

此外,无法保证库没有自己的状态,与生成的键绑定。

代码问题:

写入时,您没有已知的数据长度。写入的数据是指针,然后是虚假的东西。

阅读时,您不需要辅助缓冲区;此外,fread返回读取的字节数,而不是指向数据的指针。所以而不是:

buffer = (char *) malloc (sizeof(char)*lSize);
if(buffer == NULL)
    memError();

sec_key = (void *) fread(buffer, 1, lSize, pFile);

你可以写:

sec_key = (void *) malloc (lSize);
if(sec_key == NULL)
    memError();

if ( 0 == fread(sec_key, 1, lSize, pFile) ) {
  // error
}

答案 1 :(得分:0)

我将假设您将密集调试此应用程序,以便您可以投入1小时来构建我建议的那些包装器。

只要您不知道底层结构并且此库是黑盒子,您必须执行以下操作:

void generate_KeysEx(...){
#if DEBUG
     // return dummy keys
#else
    // call this API
#endif
}

void EncryptEx(...){
#if DEBUG
     // return cipher same as plain text
#else
    // call this library API
#endif
}

答案 2 :(得分:0)

根据评论中的讨论,如果没有捕获库中的结构,这听起来不可能,这需要进行大量的代码更改。

我发现一个非常黑客的解决方案是更改一些密钥生成参数,这大大减少了运行时间。