【问题标题】:Crypto++ output data lengthCrypto++ 输出数据长度
【发布时间】:2016-06-12 07:10:12
【问题描述】:

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

CBC_Mode<AES>::Encryption e;

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

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

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

【问题讨论】:

  • 感谢您的帮助。为什么投反对票?这不是一个合法的问题吗?

标签: aes crypto++


【解决方案1】:
virtual void ProcessData(byte *outString, const byte *inString, size_t length);

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

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

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

通常您直接使用ProcessData。您可以直接使用它,但您将对所有相关细节负责(更多详情见下文)。

通常您使用StreamTransformationFilter,但原因并不明显。 StreamTransformationFilter 根据需要提供输入缓冲、输出缓冲和填充。在 wiki 上的 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 适合等式的地方。

请务必查看 wiki 上的 Init-Update-Final。如果您习惯于 Java 或 OpenSSL 编程,它应该为您提供粘合剂。它应该有助于“让它点击”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2016-08-13
    • 2018-09-17
    • 2012-04-10
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多