我正在读取图像,对其进行加密,然后对其进行解密。目标是最终循环这个并记录完成该过程所需的时间。目前我有它读取文件,然后它加密它,加密它,根据恢复的数据创建另一个文件。我不需要用解密图片制作另一个文件。以前我一直在使用StringSource
和StringSink
,但这只适用于文本文件。我在How to read an image to a string for encrypting Crypto++收到了一些帮助,并开始使用FileSink
和FileSource
。
FileSink
,StringSink
,FileSource
和StringSource
之间究竟有什么区别?
另外,在下面的例子中,为什么需要将密码设置为某种东西?以前,当我刚刚使用StringSource
时,我的字符串密码未初始化,但现在我正在使用FileSource
,因此需要对其进行初始化才能使其正常工作。
int main(int argc, char* argv[])
{
AutoSeededRandomPool prng_blowfish;
SecByteBlock key_blowfish(Blowfish::DEFAULT_KEYLENGTH);
prng_blowfish.GenerateBlock(key_blowfish, key_blowfish.size());
byte iv_blowfish[Blowfish::BLOCKSIZE];
prng_blowfish.GenerateBlock(iv_blowfish, sizeof(iv_blowfish));
string ifilename = "sample_files/1MB.jpg";
string cipher = "1MB.enc";
string rfilename = "r1MB.jpg";
try
{
EAX<Blowfish>::Encryption e_blowfish;
e_blowfish.SetKeyWithIV(key_blowfish, key_blowfish.size(), iv_blowfish, sizeof(iv_blowfish));
std::ifstream ifile(ifilename.c_str(), ios::binary);
std::ifstream::pos_type size = ifile.seekg(0, std::ios_base::end).tellg();
ifile.seekg(0, std::ios_base::beg);
FileSource fs1(ifilename.c_str(), true, new AuthenticatedEncryptionFilter(e_blowfish, new FileSink(cipher.c_str())));
EAX<Blowfish>::Decryption d_blowfish;
d_blowfish.SetKeyWithIV(key_blowfish, key_blowfish.size(), iv_blowfish, sizeof(iv_blowfish));
FileSource fs2(cipher.c_str(), true, new AuthenticatedDecryptionFilter(d_blowfish, new FileSink(rfilename.c_str()), AuthenticatedDecryptionFilter::THROW_EXCEPTION));
}
catch (const Exception& ex)
{
cerr << ex.what() << endl;
}
return 0;
}
答案 0 :(得分:1)
FileSink,StringSink,FileSourcem StringSource之间究竟有什么区别。
Sources,Filters和Sinks是Crypto ++中Pipeline设计的一部分。来自源的数据流由过滤器转换,然后在接收器处结束。
所有来源都可以互换。所有过滤器都是可互换的。所有水槽都可以互换。例如,要在StringSink
和FileSink
之间切换,您需要提供带有FileSink
的文件名。否则,他们的运作方式相同。另一个例子是,您可以在HexEncoder
和Base64Encoder
之间切换而不做任何更改。作为最后一个示例,SocketSource
或SocketSink
将需要IP地址和端口。可能(或可能不)需要更改的内容取决于对象。
有许多来源。来自Source Class Reference:
FileSource
StringSource
RandomNumberSource
WindowPipeSource
SocketSource
有许多过滤器。您正在使用其中两个 - AuthenticatedEncryptionFilter
和AuthenticatedDecryptionFilter
。来自Filter Class Reference和FilterWithBufferedInput Class Reference:
HexEncoder
HexEncoder
Base32Encoder
Base32Decoder
Base64Encoder
Base64Encoder
DefaultEncryptor
DefaultEncryptorWithMAC
DefaultDecryptor
DefaultDecryptorWithMAC
StreamTransformationFilter
AuthenticatedEncryptionFilter
AuthenticatedDecryptionFilter
有许多水槽。来自Sink Class Reference:
ArraySink
BitBucket
RandomNumberSink
StringSink
FileSink
SocketSink
有一些高级主题,但我认为它们目前不重要。例如,BufferedTransformation
的作用以及Attachable
返回true
时的含义。答案是过滤器和接收器都是BufferedTransformation
,而Attachable = true
表示过滤器(否则是接收器)。
...在下面的例子中,为什么需要将密码设置为某种东西......
StringSource
和StringSink
不需要任何东西,因为它只是内存中的一组字节。 FileSource
和FileSink
需要文件名,而您使用cipher
作为文件名。您有提供文件名,因为文件/流相关的对象。如果您使用的是SocketSource
或SocketSink
,那么您需要提供IP地址和端口(更准确地说,是socket_t
)。
以下是来自FileSource Class Reference的FileSource
构造函数。您正在使用代码中的第三个构造函数。
FileSource (BufferedTransformation *attachment=NULL)
FileSource (std::istream &in, bool pumpAll, BufferedTransformation *attachment=NULL)
FileSource (const char *filename, bool pumpAll, BufferedTransformation *attachment=NULL, bool binary=true)
以下是来自FileSink Class Reference的FileSink
构造函数。您正在使用代码中的第二个构造函数。
FileSink (std::ostream &out)
FileSink (const char *filename, bool binary=true)