将 void 指针的数据写入文件
Writing the data of a void pointer to a file
我正在开发一些使用加密库的软件,我无法更改其底层机制。当程序运行时,它需要大约 10 分钟来生成 public 和私钥,这在尝试调试软件的其他部分时非常令人沮丧。我想将密钥写入文件并读回它们以节省时间。
它们的键是空指针:
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 字节文件形式出现,但在密钥指针中读回它时被设置为低值内存地址,这让我觉得我做错了什么。我找不到任何关于如何做到这一点的例子。我什至不确定它是否可以,因为我不会创建任何底层结构,所以我只是想在指针提供的位置分配一些内存。
是否可以在不接触生成密钥的底层库的情况下完成此操作?
简短回答:一般来说,您无法正确地做到这一点。
长答案:
你缺少的是结构,你不能保证 Enc_Key_T 可以通过简单地写入内存内容来序列化。此外,即使它只是原始随机数据,也没有已知长度。
此外,不能保证库没有自己的状态,绑定到生成的键。
代码问题:
写入时,您不知道数据的长度。写入的数据是指针,然后是伪造的。
阅读时,不需要二级缓冲区;此外,fread returns 读取的字节数,而不是指向数据的指针。所以代替:
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 小时来构建我建议的那些包装器。
只要你不知道底层结构并且这个库是一个黑盒子,你就必须执行以下操作:
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
}
从评论中的讨论来看,如果不捕获库中的结构,这听起来不太可能,这需要对代码进行重大更改。
我发现一个非常 hacky 的解决方案是更改一些关键的生成参数,这大大减少了 运行 时间。
我正在开发一些使用加密库的软件,我无法更改其底层机制。当程序运行时,它需要大约 10 分钟来生成 public 和私钥,这在尝试调试软件的其他部分时非常令人沮丧。我想将密钥写入文件并读回它们以节省时间。
它们的键是空指针:
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 字节文件形式出现,但在密钥指针中读回它时被设置为低值内存地址,这让我觉得我做错了什么。我找不到任何关于如何做到这一点的例子。我什至不确定它是否可以,因为我不会创建任何底层结构,所以我只是想在指针提供的位置分配一些内存。
是否可以在不接触生成密钥的底层库的情况下完成此操作?
简短回答:一般来说,您无法正确地做到这一点。
长答案: 你缺少的是结构,你不能保证 Enc_Key_T 可以通过简单地写入内存内容来序列化。此外,即使它只是原始随机数据,也没有已知长度。
此外,不能保证库没有自己的状态,绑定到生成的键。
代码问题:
写入时,您不知道数据的长度。写入的数据是指针,然后是伪造的。
阅读时,不需要二级缓冲区;此外,fread returns 读取的字节数,而不是指向数据的指针。所以代替:
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 小时来构建我建议的那些包装器。
只要你不知道底层结构并且这个库是一个黑盒子,你就必须执行以下操作:
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
}
从评论中的讨论来看,如果不捕获库中的结构,这听起来不太可能,这需要对代码进行重大更改。
我发现一个非常 hacky 的解决方案是更改一些关键的生成参数,这大大减少了 运行 时间。