Crypto ++输出数据长度

时间:2016-06-07 17:01:07

标签: aes crypto++

我正在尝试使用Crypto ++ libary的AES加密:

CBC_Mode<AES>::Encryption e;

我有一个需要加密的二进制数据块。为了这个目的,该类似乎提供了一个名为ProcessData的方法:

virtual void ProcessData(byte *outString, const byte *inString, size_t length);

看起来最后一个参数是输入数据的大小。不清楚的是为什么该方法不会返回加密数据的大小。是否假设输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小只是一个字节,这是否有效?问候。

1 个答案:

答案 0 :(得分:1)

virtual void ProcessData(byte *outString, const byte *inString, size_t length);
     

看起来最后一个参数是输入数据的大小。不清楚的是,为什么该方法不会返回加密数据的大小......

ProcessData是所有分组密码的主力(但不是流密码或其他类型的对象)。另请参阅Crypto ++手册和cryptlib.h File Referencecryptlib.h被描述为&#34;抽象基类,为此库提供统一的接口&#34;

ProcessData对块大小的数据进行操作。因此INSIZE等于OUTSIZE等于BLOCKSIZE。请注意,没有INSIZEOUTSIZE - 我将它们用于讨论。每个分组密码将为BLOCKSIZE提供常量。会有AES::BLOCKSIZEDES_EDE::BLOCKSIZE

通常,您直接使用ProcessData。您可以直接使用它,但是您将负责所有相关的详细信息(详情请参阅下面的详细信息)。

通常你使用StreamTransformationFilter,但其原因并不明显。 StreamTransformationFilter根据需要提供输入缓冲,输出缓冲和填充。它在维基上的Init-Update-Final进行了简要讨论。

以下是Crypto ++ wiki上CBC mode示例的实际效果:

try
{
    cout << "plain text: " << plain << endl;

    CBC_Mode< AES >::Encryption e;
    e.SetKeyWithIV( key, key.size(), iv );

    // The StreamTransformationFilter adds padding
    //  as required. ECB and CBC Mode must be padded
    //  to the block size of the cipher.
    StringSource ss( plain, true, 
        new StreamTransformationFilter( e,
            new StringSink( cipher )
        ) // StreamTransformationFilter      
    ); // StringSource
}
catch( const CryptoPP::Exception& e )
{
    cerr << e.what() << endl;
    exit(1);
}

在上文中,CBC_modeStreamTransformationFilter一起工作,为您提供所需的结果。 CBC_mode调用ProcessData并处理密码链接详细信息。 StreamTransformationFilter以其首选大小提供纯文本。如果没有足够的纯文本,则StreamTransformationFilter将其缓冲在输入上。如果没有输出缓冲区,那么StreamTransformationFilter也会缓冲密文。

StreamTransformationFilter也会根据需要应用填充。这是默认填充,但您可以覆盖它。 StreamTransformationFilter知道要应用哪个填充,因为它询问模式(CBC_mode)是否需要填充以及填充应该是什么。

  

...是否假设输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小只是一个字节,这是否有效?

这是StreamTransformationFilter符合等式的地方。

请务必查看维基上的Init-Update-Final。如果您习惯使用Java或OpenSSL编程,它应该为您提供粘合剂。它应该有助于“点击”#34;对你而言。