我刚开始使用crypto ++,我对piplenes以及如何使用它们加密文件有疑问。
我想使用AES来加密文件。
1.)仅仅这样做是否足够:
EAX<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(derived.data(), 16, ivb, ivb.size());
FileSource f("source", new AuthenticatedEncryptionFilter(encryptor,new FileSink("deststination")));
2。)如果我有一个巨大的输入文件,这种方法会自动加密块中的文件吗?
3。)如果输出文件不存在,会自动创建输出文件吗?
修改
好的,我用我的approch开始了。
2.)问题仍然存在,我有一个新问题:
我可以告诉它跳过文件的前24个字节吗?
答案 0 :(得分:1)
EAX<AES>::Encryption encryptor; encryptor.SetKeyWithIV(derived.data(), 16, ivb, ivb.size()); FileSource f("source", new AuthenticatedEncryptionFilter(encryptor,new FileSink("deststination")));
关闭。 AuthenticatedEncryptionFilter
将被强制转换为bool pumpAll
的{{1}}参数。所以你需要:
FileSink
另请参阅Crypto ++ wiki上的FileSource。手册中的FileSource Class Reference也可能会引起人们的兴趣。
如果我有一个巨大的输入文件,这种方法会自动加密块中的文件吗?
是。在内部,Crypto ++将会阻止&#34;阻止&#34;或&#34; chunk&#34;处理4096字节,IIRC。最近有关它的讨论发生在ios locking up during encryption的邮件列表上。
帖子中提供allows you to do the blocking的程序。如果需要,您可以使用它来限制处理,更新进度条或产生处理器的位置。它转载如下。
如果输出文件不存在,会自动创建输出文件吗?
是。 FileSource f("source", true, new AuthenticatedEncryptionFilter(encryptor,new FileSink("deststination")));
只是FileSource
包装,而std::ifstream
只是FileSink
包装。
同样,这里是维基页面:
我可以告诉它跳过文件的前24个字节吗?
是。在这种情况下,请使用std::ofstream
并将其设置为bool pumpAll
。然后做一些事情:
false
或者,您可以:
FileSource fs("source", false, new AuthenticatedEncryptionFilter(...));
fs.Skip(24);
size_t remaining = <size of file>;
size_t BLOCK_SIZE = 512;
while(remaining && !fs.SourceExhausted())
{
const unsigned int req = STDMIN(remaining, BLOCK_SIZE);
fs.Pump(req);
fs.Flush(false);
remaining -= req;
}
另见手册中的FileSource Class Reference。 FileSource fs("source", false, new AuthenticatedEncryptionFilter(...));
fs.Skip(24);
fs.PumpAll();
是Skip
的一部分; BufferedTransformation
是PumpAll
的一部分。
还有一些wiki页面涵盖了EAX模式和经过身份验证的{en | de}加密过滤器。参见:
甚至还有一个关于使用类似Java的Init / Update / Final的页面:
下面的程序使用 Source
,但它很容易换成另一种密码和模式。它还演示了如何在堆栈中放置对象并在管道中使用它们,而不是使用 CFB_Mode<AES>
在堆上创建它们。
new