C++ 如何在使用CryptoPP对流进行解密后执行取消添加

C++ 如何在使用CryptoPP对流进行解密后执行取消添加,c++,encryption,byte,padding,crypto++,C++,Encryption,Byte,Padding,Crypto++,我有要解密的流。我将其划分为块,并将每个块传递给下面的方法。我需要解密的数据由16字节的块加密,如果最后一个块小于16字节,则所有剩余字节都由填充填充。然后在解密的那一刻,我得到了最后一个块结果,作为包含这些额外填充字节的值。考虑到可以使用不同的填充,如何确定原始数据的长度并仅返回它,或者如何确定填充字节并删除它们 void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) { MeterFilter

我有要解密的流。我将其划分为块,并将每个块传递给下面的方法。我需要解密的数据由16字节的块加密,如果最后一个块小于16字节,则所有剩余字节都由填充填充。然后在解密的那一刻,我得到了最后一个块结果,作为包含这些额外填充字节的值。考虑到可以使用不同的填充,如何确定原始数据的长度并仅返回它,或者如何确定填充字节并删除它们

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
     MeterFilter meter(new ArraySink(buffer, dataBytesSize));
     CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
        StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
        ArraySource(buffer, dataBytesSize, true, filter);
        dec.Resynchronize(&IV.front());
}
void SymmetricAlgorithm::Decrypt(字节*缓冲区,大小\u t数据字节大小){
MeterFilter meter(新阵列链路(缓冲区、数据字节大小));
CBC_模式::解密dec(&Key.front()、Key.size()、IV.front());
StreamTransformationFilter*filter=新的StreamTransformationFilter(dec、新重定向器(仪表)、PKCS_填充);
ArraySource(缓冲区、数据字节大小、true、筛选器);
12月重新同步(&IV.front());
}
现在我尝试使用PKCS_PADDING和Rijndael,但一般来说,我可能需要使用任何算法和任何PADDING

我将其划分为块,并将每个块传递给下面的方法

在此情况下,您可以直接调用<代码>进程块< /> >:

CBC_Mode<Rijndael>::Decryption dec(...);

// Assume 'b' is a 16-byte block
dec.ProcessBlock(b);
CBC_模式::解密dec(…);
//假设“b”是一个16字节的块
12月进程块(b);
块在适当的位置进行处理,因此其破坏性。您还将负责处理最后一个块,包括删除填充

通过阻止和删除填充,您就完成了
StreamTransformationFilter
(和朋友)的工作

我将其划分为块,并将每个块传递给下面的方法

在此情况下,您可以直接调用<代码>进程块< /> >:

CBC_Mode<Rijndael>::Decryption dec(...);

// Assume 'b' is a 16-byte block
dec.ProcessBlock(b);
CBC_模式::解密dec(…);
//假设“b”是一个16字节的块
12月进程块(b);
块在适当的位置进行处理,因此其破坏性。您还将负责处理最后一个块,包括删除填充


通过阻塞和删除填充,您就完成了
StreamTransformationFilter
(和朋友)的工作。

在这个示例中,我偶然发现了我需要的东西。 谢谢你的帮助,加布里埃尔,但我不想让我的方法不使用填充物。抱歉解释不清楚,我想从解密数据中提取普通数据,包括填充符号。代码中粗体的一行显示了如何计算普通数据字节数

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
 MeterFilter meter(new ArraySink(buffer, dataBytesSize));
 CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
    StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
    ArraySource(buffer, dataBytesSize, true, filter);
    int t = meter.GetTotalBytes(); //plain data bytes count
    dec.Resynchronize(&IV.front());
}
void SymmetricAlgorithm::Decrypt(字节*缓冲区,大小\u t数据字节大小){
MeterFilter meter(新阵列链路(缓冲区、数据字节大小));
CBC_模式::解密dec(&Key.front()、Key.size()、IV.front());
StreamTransformationFilter*filter=新的StreamTransformationFilter(dec、新重定向器(仪表)、PKCS_填充);
ArraySource(缓冲区、数据字节大小、true、筛选器);
int t=meter.GetTotalBytes();//普通数据字节计数
12月重新同步(&IV.front());
}

碰巧,我从这个例子中偶尔发现了我需要的东西。 谢谢你的帮助,加布里埃尔,但我不想让我的方法不使用填充物。抱歉解释不清楚,我想从解密数据中提取普通数据,包括填充符号。代码中粗体的一行显示了如何计算普通数据字节数

void SymmetricAlgorithm::Decrypt(byte* buffer, size_t dataBytesSize) {    
 MeterFilter meter(new ArraySink(buffer, dataBytesSize));
 CBC_Mode<CryptoPP::Rijndael>::Decryption dec(&Key.front(), Key.size(), &IV.front());
    StreamTransformationFilter* filter = new StreamTransformationFilter(dec, new Redirector(meter), PKCS_PADDING);
    ArraySource(buffer, dataBytesSize, true, filter);
    int t = meter.GetTotalBytes(); //plain data bytes count
    dec.Resynchronize(&IV.front());
}
void SymmetricAlgorithm::Decrypt(字节*缓冲区,大小\u t数据字节大小){
MeterFilter meter(新阵列链路(缓冲区、数据字节大小));
CBC_模式::解密dec(&Key.front()、Key.size()、IV.front());
StreamTransformationFilter*filter=新的StreamTransformationFilter(dec、新重定向器(仪表)、PKCS_填充);
ArraySource(缓冲区、数据字节大小、true、筛选器);
int t=meter.GetTotalBytes();//普通数据字节计数
12月重新同步(&IV.front());
}

很抱歉,我看不到ProcessBlock()方法,只是ProcessLastBlock(),如果它调用的是16字节的块,它只有1个有效符号,15个填充符,我得到的结果与使用我的代码来回答最初的问题相同。至于StreamTransformationFilter,你是对的,我在这个类中找到了所需的方法,叫做GetTotalBytes,我在这里单独给出了答案。无论如何,谢谢你的帮助。很抱歉,我看不到ProcessBlock()方法,只是ProcessLastBlock(),如果它调用我的16字节块,它只有1个有效符号,15个填充符,我得到的结果与使用我的代码来回答最初的问题是一样的。至于StreamTransformationFilter,你是对的,我在这个类中找到了所需的方法,叫做GetTotalBytes,我在这里单独给出了答案。无论如何,谢谢你的帮助。