首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将空指针的数据写入文件

将空指针的数据写入文件
EN

Stack Overflow用户
提问于 2017-02-22 18:40:32
回答 3查看 1.6K关注 0票数 0

我正在开发一些使用加密库的软件,其底层机制我无法更改。当程序运行时,大约需要10分钟来生成公钥和私钥,当试图调试软件的其他部分时,这是非常令人沮丧的。我想把密钥写到一个文件中,然后再读回来,以节省时间。

键是空指针:

Enc_Key_T secKey = nullptr;

其中,Enc_Key_T定义为typedef void* Enc_Key_T

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

代码语言:javascript
代码运行次数:0
运行
复制
#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字节的文件,但在密钥指针中读回它会被设置为一个低值的内存地址,这让我觉得我做错了什么。我找不到任何可以做到这一点的例子。我甚至不确定它是否可以,因为我不会创建任何底层结构,所以我只是尝试在指针提供的位置分配一些内存。

有没有什么方法可以在不接触生成密钥的底层库的情况下完成这项工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-22 18:47:38

简而言之:一般来说,你不能正确地做到这一点。

冗长的答案:您缺少的是结构,您不能保证Enc_Key_T可以通过简单地写入内存内容来序列化。此外,即使它只是原始的随机数据,也没有已知的长度。

此外,不能保证库没有自己的状态,绑定到生成的密钥。

代码问题:

在写入时,您没有已知的数据长度。写入的数据是一个指针,然后是伪造的东西。

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

代码语言:javascript
代码运行次数:0
运行
复制
buffer = (char *) malloc (sizeof(char)*lSize);
if(buffer == NULL)
    memError();

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

你可以这样写:

代码语言:javascript
代码运行次数:0
运行
复制
sec_key = (void *) malloc (lSize);
if(sec_key == NULL)
    memError();

if ( 0 == fread(sec_key, 1, lSize, pFile) ) {
  // error
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-22 19:05:22

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

只要你不知道底层结构,并且这个库是一个黑盒,你就必须执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
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
}
票数 0
EN

Stack Overflow用户

发布于 2017-02-22 23:42:03

从评论中的讨论来看,如果不捕获库中的结构,这听起来是不可能的,这将需要重大的代码更改。

我发现一个非常老套的解决方案是更改几个关键的生成参数,这将极大地减少运行时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42388873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档