使用管道加密文件

时间:2016-02-06 13:40:23

标签: c++ encryption crypto++

我刚开始使用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个字节吗?

1 个答案:

答案 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 ReferenceFileSource fs("source", false, new AuthenticatedEncryptionFilter(...)); fs.Skip(24); fs.PumpAll(); Skip的一部分; BufferedTransformationPumpAll的一部分。

还有一些wiki页面涵盖了EAX模式和经过身份验证的{en | de}加密过滤器。参见:

甚至还有一个关于使用类似Java的Init / Update / Final的页面:

下面的程序使用 Source ,但它很容易换成另一种密码和模式。它还演示了如何在堆栈中放置对象并在管道中使用它们,而不是使用 CFB_Mode<AES> 在堆上创建它们。

new