gav*_*gav 1 c++ encryption serialization caching
这是两个问题,但对C++开发人员来说无疑是微不足道的.
考虑到我有加密密钥,加密/解密二进制数据流的最简单方法是什么?
const vector&encryption_key
这是一个概念证明,因此加密的强度或可靠性不如简单易懂的代码重要.
我可以根据需要扩展问题的任何一部分,因为您可能已经猜到我需要将一些数据保存到文件中的硬盘中,然后在另一次运行的应用程序中检索它,文件很大,这是我的方式缓存通过网络检索的数据.
谢谢,
GAV
Boost.Serialization可能是在C++中执行此操作的最佳选择.如果要保存二进制数据,则需要创建boost::archive::binary_oarchive并将其与文件关联:
std::ofstream ofs("my_file.dat");
boost::archive::binary_oarchive oarch(ofs);
Run Code Online (Sandbox Code Playgroud)
您要序列化的任何类都必须具有成员函数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
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,内置支持版本控制,但这是一个更高级的主题.
将类的对象保存到二进制存档非常简单:
Foo foo;
oarch << foo; // Serializes "foo"
Run Code Online (Sandbox Code Playgroud)
关于Boost.Serialization的一个很酷的事情是,使用相同的成员函数来反序列化对象.唯一的区别是现在您使用输入存档:
std::ifstream ifs("my_file.dat");
boost::archive::binary_iarchive iarch(ofs);
Foo foo;
iarch >> foo; // Deserializes "foo"
Run Code Online (Sandbox Code Playgroud)
至于加密部分,Botan库似乎相当成熟,它的C++与OpenSSL不同,它是C,所以使用起来有点痛苦.这就是我认为您可以在同一工作流程中进行序列化+加密的方式(反序列化将类似):
您将归档关联到内存中的字符串而不是文件:
std::ostringstream oss;
boost::archive::binary_oarchive oarch(oss);
Run Code Online (Sandbox Code Playgroud)
您写入存档的所有内容都将存储在字符串中.
您像以前一样序列化对象:
Foo foo;
oarch << foo; // Serializes "foo" (data goes to the string)
Run Code Online (Sandbox Code Playgroud)您使用Botan库来加密您的字符串.不要太过于字面意思,但它应该是这样的:
a)创建与您的字符串(oss对象)相关联的Botan内存数据源.
b)创建与您要写入的文件关联的Botan数据接收器("myfile.dat").
c)创建一个适合您需求的编码器
d)调用编码函数,如 encode(source, sink);
编辑:改变了从OpenSSL到Botan的加密建议.
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |