virtual void ProcessData(byte *outString, const byte *inString, size_t length);
看起来最后一个参数是输入数据的大小。不清楚的是为什么该方法不返回加密数据的大小......
ProcessData
是所有分组密码的主力(但不是流密码或其他类型的对象)。另请参阅 Crypto++ 手册和cryptlib.h 文件参考 http://www.cryptopp.com/docs/ref/cryptlib_8h.html. cryptlib.h
被描述为“为该库提供统一接口的抽象基类”.
ProcessData
对块大小的数据长度进行操作。所以INSIZE
等于OUTSIZE
等于BLOCKSIZE
。请注意,没有INSIZE
or OUTSIZE
- 我用它们来讨论。每个分组密码将提供一个常数BLOCKSIZE
。将会有一个AES::BLOCKSIZE
, DES_EDE::BLOCKSIZE
, etc.
通常你do not use ProcessData
直接地。您可以直接使用它,但您将对所有相关细节负责(更多细节如下)。
通常您使用StreamTransformationFilter
,但原因并不明显。StreamTransformationFilter
根据需要提供输入缓冲、输出缓冲和填充。其简要讨论于初始化-更新-最终 http://www.cryptopp.com/wiki/Init-Update-Final在维基上。
这是它在实践中的样子CBC mode http://www.cryptopp.com/wiki/CBC_modeCrypto++ wiki 上的示例:
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_mode
and StreamTransformationFilter
共同努力,给您想要的结果。CBC_mode
calls ProcessData
并处理密码链细节。StreamTransformationFilter
以首选大小提供纯文本。如果没有足够的纯文本,那么StreamTransformationFilter
在输入上缓冲它。如果没有输出缓冲区,那么StreamTransformationFilter
也缓冲密文。
StreamTransformationFilter
还将根据需要应用填充。有默认填充,但您可以覆盖它。StreamTransformationFilter
知道要应用什么填充,因为它询问模式(CBC_mode
)是否需要填充以及填充应该是什么。
...是否假设输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小只有一个字节,这是否有效?
这就是StreamTransformationFilter
符合方程。
一定要检查一下初始化-更新-最终 http://www.cryptopp.com/wiki/Init-Update-Final在维基上。如果您习惯于 Java 或 OpenSSL 编程,它应该会为您提供帮助。它应该可以帮助您“点击”。