2017-02-22 17 views
0

Я работаю над некоторым программным обеспечением, использующим библиотеку шифрования, основную механику которой я не могу изменить. Когда программа запускается, для генерации открытого и закрытого ключей требуется около 10 минут, что крайне сложно при попытке отладки других частей программного обеспечения. Я хотел бы написать ключи к файлу и прочитать их, чтобы сэкономить время.Запись данных указателя void на файл

Они ключи являются недействительными указатели:

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 байтовый файл, но чтение его в указателе секретного ключа устанавливается на адрес памяти с низким значением, что заставляет меня думать, что я делаю что-то неправильно. Я не могу найти примеров того, как это можно сделать. Я даже не уверен, что это возможно, поскольку я не буду создавать какие-либо структуры underling, поэтому я просто пытаюсь выделить некоторую память в месте, указанном указателем.

Можно ли это сделать, не касаясь базовой библиотеки, которая генерирует ключи?

+0

По крайней мере, 'sizeof (& sec_key)' это неправильно. Это должно быть 'sizeof (sec_key)'. –

+0

Вы должны понимать, как хранятся ключи. Прямо сейчас, вы делаете эквивалент попытки копировать что-то, зная только там, где оно есть. Но то, как вы копируете лист бумаги, отличается от того, как вы копируете звук. Вы должны точно знать, что это значит - скопировать, а не только где. –

+0

Скажите, пожалуйста, тип «Enc_Key_T» - это класс или структура или что? Можете ли вы опубликовать свою декларацию, если она у вас есть? sizeof не будет вам полезен, если вы не покажете мне объявление Enc_Key_T –

ответ

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 
} 
+0

Кроме того, он понятия не имеет, сколько байтов писать. Кроме того, как вы указываете, любая уверенность в том, что он написал что-либо, что имеет какой-то смысл, это может быть просто адрес того, чего не будет, когда он снова запустит программу. –

+0

@DavidSchwartz oh. Я пропустил эту часть письма, также ошибался. Неизвестной длины вообще нет. – Lyth

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 
} 
0

Из обсуждений в комментариях это не звучит, как это возможно без захвата структуры в библиотеке, что потребует значительных изменений кода.

Очень тяжелое решение, которое я нашел, заключалось в том, чтобы изменить несколько ключевых параметров генерации ключей, которые значительно сокращают время запуска.