FileSink、StringSink、Filesource、StringSource Crypto++之间有什么区别
What is the difference between FileSink, StringSink, Filesource, StringSource Crypto++
我正在读取一个图像,对其进行加密,然后解密。目标是最终循环并记录完成过程所需的时间。目前,它读取文件,然后对其进行加密,加密,并根据恢复的数据创建另一个文件。我不需要用解密后的图片制作另一个文件。以前我一直使用StringSource
和StringSink
,但这只适用于文本文件。我在"如何将图像读取为字符串以加密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;
}
FileSink、StringSink、FileSourcem和StringSource之间到底有什么区别。
源、过滤器和接收器是Crypto++中管道设计的一部分。数据从源流出,经过过滤器转换,然后在汇点结束。
所有来源都是可互换的。所有过滤器都是可互换的。所有的水槽都可以互换。例如,要在StringSink
和FileSink
之间切换,需要提供一个带有FileSink
的文件名。否则,它们的操作相同。作为另一个示例,您可以在HexEncoder
和Base64Encoder
之间切换而不进行任何更改。最后一个例子是,SocketSource
或SocketSink
需要一个IP地址和端口。可能需要(也可能不需要(更改的内容取决于对象。
有许多来源。来源类别参考:
FileSource
StringSource
RandomNumberSource
WindowPipeSource
SocketSource
有许多筛选器。您正在使用其中的两个AuthenticatedEncryptionFilter
和AuthenticatedDecryptionFilter
。来自Filter类引用和FilterWithBufferedInput类引用:
HexEncoder
HexEncoder
Base32Encoder
Base32Decoder
Base64Encoder
Base64Encoder
DefaultEncryptor
DefaultEncryptorWithMAC
DefaultDecryptor
DefaultDecryptorWithMAC
StreamTransformationFilter
AuthenticatedEncryptionFilter
AuthenticatedDecryptionFilter
有许多水槽。来自接收器类别参考:
ArraySink
BitBucket
RandomNumberSink
StringSink
FileSink
SocketSink
有一些高级话题,但我认为它们目前并不重要。例如,BufferedTransformation
的角色以及如果Attachable
返回true
意味着什么。答案是Filters和Sink都是BufferedTransformation
的,Attachable = true
意味着它是Filter(否则就是Sink(。
在下面的例子中,为什么密码需要设置为。。。
StringSource
和StringSink
不需要任何东西,因为它只是内存中的byes数组。FileSource
和FileSink
需要一个文件名,而您正在使用cipher
作为文件名。必须提供文件名,因为对象与文件/流相关。如果您使用的是SocketSource
或SocketSink
,则需要提供IP地址和端口(更准确地说,是socket_t
(。
以下是FileSource类引用中的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类引用中的FileSink
构造函数。您正在代码中使用第二个构造函数。
FileSink (std::ostream &out)
FileSink (const char *filename, bool binary=true)
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?