我正在尝试使用Crypto++ libary中的AES加密:
CBC_Mode<AES>::Encryption e;我有一个需要加密的二进制数据块。这个类似乎为此提供了一个名为ProcessData的方法:
virtual void ProcessData(byte *outString, const byte *inString, size_t length);看起来最后一个参数是输入数据的大小。不清楚的是为什么该方法不返回加密数据的大小。是否假定输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小仅为一个字节,这也有效吗?致以问候。
发布于 2016-06-07 21:02:33
虚拟空ProcessData(字节*输出字符串,字节*inString,size_t长度); 看起来最后一个参数是输入数据的大小。不清楚的是为什么该方法不返回加密数据的大小.
ProcessData是所有块密码(但不是流密码或其他类型的对象)的工作马。还请参阅Crypto++手册和密码lib.h文件引用。cryptlib.h被描述为“向该库提供统一接口的抽象基类”。
ProcessData对块大小的数据进行操作.所以INSIZE等于OUTSIZE等于BLOCKSIZE。请注意,这里没有INSIZE或OUTSIZE --我使用它们进行讨论。每个分组密码都将为BLOCKSIZE提供一个常数。将有一个AES::BLOCKSIZE,DES_EDE::BLOCKSIZE等。
通常,您不直接使用ProcessData。您可以直接使用它,但您将负责所有相关的详细信息(更多关于下面的细节)。
通常您使用的是StreamTransformationFilter,但这并不是显而易见的原因。StreamTransformationFilter根据需要提供输入缓冲、输出缓冲和填充。它在Init-更新-最终上对wiki进行了简要的讨论。
下面是从CBC模式 wiki上的Crypto++示例中看到的实际情况:
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和StreamTransformationFilter一起为您提供了所需的结果。CBC_mode调用ProcessData并处理密码链的详细信息。StreamTransformationFilter按其首选大小输入纯文本。如果没有足够的纯文本,那么StreamTransformationFilter会在输入时缓冲它。如果没有输出缓冲区,那么StreamTransformationFilter也会对密码文本进行缓冲。
StreamTransformationFilter还将根据需要应用填充。有一个默认的填充,但您可以覆盖它。StreamTransformationFilter知道要应用什么填充,因为它询问是否需要填充模式(CBC_mode)以及填充应该是什么。
..。是否假定输出数据块的大小与输入数据块的长度完全相同?即使输入数据的大小仅为一个字节,这也有效吗?
这就是StreamTransformationFilter符合方程的地方。
一定要查看wiki上的Init-更新-最终。如果您习惯于Java或OpenSSL编程,它应该会为您提供胶水。它应该会帮助你“让它点击”。
https://stackoverflow.com/questions/37685190
复制相似问题