是什么文件接收,StringSink,Filesource,StringSource加密的区别++(

2019-10-20 01:25发布

我读的图像中,对其进行加密,然后解密它。 我们的目标是最终被这个循环,并记录所花费的过程中完成的时间。 目前,我有什么它读取该文件,然后对其进行加密,加密,将创建一个基于恢复的数据的另一个文件。 我不需要再作文件与解密的图片。 以前我曾经使用过StringSourceStringSink ,但这只是工作的文本文件。 我收到一些帮助, 如何将图像读取加密加密++字符串从使用开始FileSinkFileSource

究竟是什么区别FileSinkStringSinkFileSourceStringSource

此外,在下面的例子中,为什么密码需要设置的东西? 以前,当我刚用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;
}

Answer 1:

到底是什么文件接收,StringSink,FileSourcem StringSource之间的差异。

源,过滤器和接收器是在加密+管道设计的一部分。 数据流从源中,通过过滤器转化,然后在水槽结束。

所有来源是可以互换的。 所有的过滤器是可以互换的。 和所有的水槽是可以互换的。 例如,在切换StringSinkFileSink ,您需要与提供文件名FileSink 。 否则,它们运行相同的。 再举一个例子,您可以在之间进行切换HexEncoderBase64Encoder没有变化。 最后一个例子,一个SocketSourceSocketSink将需要一个IP地址和端口。 什么可能(或可能不)需要改变依赖的对象。

有许多的来源。 从源类参考 :

  • FileSource
  • StringSource
  • RandomNumberSource
  • WindowPipeSource
  • SocketSource

有许多的过滤器。 您使用的是他们两个- AuthenticatedEncryptionFilterAuthenticatedDecryptionFilter 。 从过滤器类参考和FilterWithBufferedInput类参考 :

  • HexEncoder
  • HexEncoder
  • Base32Encoder
  • Base32Decoder
  • Base64Encoder
  • Base64Encoder
  • DefaultEncryptor
  • DefaultEncryptorWithMAC
  • DefaultDecryptor
  • DefaultDecryptorWithMAC
  • ...
  • StreamTransformationFilter
  • AuthenticatedEncryptionFilter
  • AuthenticatedDecryptionFilter

有许多汇。 从宿类别参考 :

  • ArraySink
  • BitBucket
  • RandomNumberSink
  • StringSink
  • FileSink
  • SocketSink
  • ...

有一些高级的话题,但我不认为他们无关紧要的时刻。 例如,角色BufferedTransformation什么,这意味着,如果Attachable返回true 。 答案是两个滤波器和接收器是BufferedTransformation的,和Attachable = true意味着它的一个过滤器(否则其一个散热器)。


...在下面的例子中,为什么密码需要设置的东西...

一个StringSourceStringSink需要什么,因为它只是在内存中轮空的数组。 一个FileSourceFileSink需要一个文件名,并且您正在使用cipher的文件名。 你必须提供文件名,因为对象的文件/流有关。 如果您使用的是SocketSourceSocketSink ,那么你就需要提供一个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 (std::ostream &out)
FileSink (const char *filename, bool binary=true)


文章来源: What is the difference between FileSink, StringSink, Filesource, StringSource Crypto++