Шифрование объектов, хранящихся на диске с использованием C ++ (для разработчика Java) - PullRequest
0 голосов
/ 12 февраля 2010

Это два вопроса в одном, но, надеюсь, тривиально для разработчика на C ++.

  1. Как я могу выделить объект так, чтобы я мог записать его на диск и получить его позже в C ++ или, если это неправильное ключевое слово, как я могу записать объект в виде двоичного потока и воссоздать его позже? Можно ли использовать наследование, чтобы сериализовать иерархию классов?
  2. Какой самый простой способ зашифровать / расшифровать поток двоичных данных, если у меня есть ключ шифрования;

    const vector & encryption_key

Это подтверждение концепции, поэтому надежность или непогрешимость шифрования менее важны, чем простой и легкий в объяснении код.

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

Спасибо

Гав

Ответы [ 2 ]

7 голосов
/ 12 февраля 2010

Boost.Serialization , вероятно, лучший вариант для этого в C ++. Если вы хотите сохранить двоичные данные, вам нужно создать boost::archive::binary_oarchive и связать его с вашим файлом:

std::ofstream ofs("my_file.dat");
boost::archive::binary_oarchive oarch(ofs);

Любой класс, который вы хотите сериализовать, должен иметь функцию-член serialize со специальной подписью, понятной библиотеке. Например:

class Foo
{
   int i;
   Baz baz;

   template<class Archive>
   void serialize(Archive &ar, unsigned int version) {
       ar & i;
       ar & baz; // Baz must be serializable
   }
};

Обратите внимание, что есть встроенная поддержка управления версиями, но это более сложная тема.

Сохранение объектов вашего класса в бинарный архив очень просто:

Foo foo;
oarch << foo;  // Serializes "foo"

Крутая вещь в Boost.Serialization заключается в том, что та же функция-член используется для десериализации объекта. Разница лишь в том, что теперь вы используете входной архив:

std::ifstream ifs("my_file.dat");
boost::archive::binary_iarchive iarch(ofs);
Foo foo;  
iarch >> foo; // Deserializes "foo"

Что касается шифрования, то библиотека Botan выглядит довольно зрелой, и ее C ++ отличается от OpenSSL тем, что она C и поэтому немного болезненна для использования. Вот как я думаю, вы можете выполнять сериализацию + шифрование в одном и том же рабочем процессе (десериализация будет аналогичной):

  1. Вы связываете свой архив со строкой в ​​памяти, а не с файлом:

    std::ostringstream oss;
    boost::archive::binary_oarchive oarch(oss);
    

    Все, что вы пишете в архив, будет храниться в строке.

  2. Вы сериализуете свои объекты так же, как и раньше:

    Foo foo;
    oarch << foo;  // Serializes "foo" (data goes to the string)
    
  3. Вы используете библиотеку Botan для шифрования вашей строки. Не воспринимайте это слишком буквально, но это должно быть что-то вроде:

    a) создать источник данных памяти Botan, связанный с вашей строкой (объект oss).

    b) создать приемник данных Botan, связанный с файлом, в который вы хотите записать ("myfile.dat").

    c) создать кодировщик, который соответствует вашим потребностям

    d) вызвать функцию кодирования, как в encode(source, sink);

РЕДАКТИРОВАТЬ: Изменено крипторекомендации с OpenSSL на Botan.

0 голосов
/ 12 февраля 2010

Для сериализации я могу рекомендовать повысить сериализацию . Для шифрования вы можете использовать openSSL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...