Encryption &引用;未知:此对象没有';“不支持多渠道”;加密期间

Encryption &引用;未知:此对象没有';“不支持多渠道”;加密期间,encryption,pipeline,encryption-symmetric,crypto++,Encryption,Pipeline,Encryption Symmetric,Crypto++,我在文件加密期间遇到“未知:此对象不支持多通道”异常。我能够生成会话密钥,但不能用于加密文件 以下是我的文件加密代码片段: void enc_file_EAX(PAES_KEY_与_IV KEY、const char*in_file、const char*out_file) { 试一试{ CryptoPP::EAX::加密机; encryptor.SetKeyWithIV(key->key,key->key.size(),key->iv); CryptoPP::FileSource f(在_文件

我在文件加密期间遇到“未知:此对象不支持多通道”异常。我能够生成会话密钥,但不能用于加密文件

以下是我的文件加密代码片段:

void enc_file_EAX(PAES_KEY_与_IV KEY、const char*in_file、const char*out_file)
{
试一试{
CryptoPP::EAX::加密机;
encryptor.SetKeyWithIV(key->key,key->key.size(),key->iv);
CryptoPP::FileSource f(在_文件中,true,
新的CryptoPP::AuthenticatedEncryptionFilter(加密程序,
新的CryptoPP::FileLink(
std::string(在_文件中).c_str()),
CryptoPP::AuthenticatedDecryptionFilter::抛出异常|
CryptoPP::AuthenticatedDecryptionFilter::MAC_在_端);
std::fstream文件(out_文件,std::ios::binary | std::ios::ate);
剩余大小=file.tellg();
file.close();
块大小=16384;
while(剩余的&!f.sourcedefined()){
const unsigned int req=std::min(剩余,块大小);
f、 泵(req);
f、 齐平(假);
剩余-=req;
}
}catch(const CryptoPP::Exception&e){
标准::cout
我似乎记得,如果您想添加AAD,您需要避免。管道只允许在
默认频道
上输入数据,该频道提供AE(但没有AAD)。另请参见Crypto++wiki上的


您对
FileSink
FileSource
的使用看起来不太正确。我不确定这将如何进行:

FileSource f(in_file, true, ...
    new FileSink(std::string(in_file).c_str()), ...);
您可能应该在\u file.c\u str()中使用
作为文件名:

FileSource f(in_file.c_str(), ...);
您可能还应该为接收器使用不同的文件:

FileSource f(out_file.c_str(), ...);

编辑(来自评论):


不,我们不想添加管道,我们只想使用默认的_通道输入数据。给出的例子是文本输入。我想使用相同的功能输入文件。你能详细说明一下吗

在这种情况下,请尝试:

EAX<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(key->key, key->key.size(), key->iv);
FileSource f(in_file.c_str(), true,
        new AuthenticatedEncryptionFilter(encryptor,
            new FileSink(out_file.c_str()));
加密维基上的EAX。它有三到四个AE和AEAD示例

我似乎记得,如果您想添加AAD,您需要避免。管道只允许在
默认频道
上输入数据,该频道提供AE(但没有AAD)。另请参见Crypto++wiki上的


您对
FileSink
FileSource
的使用看起来不太正确。我不确定这将如何进行:

FileSource f(in_file, true, ...
    new FileSink(std::string(in_file).c_str()), ...);
您可能应该在\u file.c\u str()中使用
作为文件名:

FileSource f(in_file.c_str(), ...);
您可能还应该为接收器使用不同的文件:

FileSource f(out_file.c_str(), ...);

编辑(来自评论):


不,我们不想添加管道,我们只想使用默认的_通道输入数据。给出的例子是文本输入。我想使用相同的功能输入文件。你能详细说明一下吗

在这种情况下,请尝试:

EAX<AES>::Encryption encryptor;
encryptor.SetKeyWithIV(key->key, key->key.size(), key->iv);
FileSource f(in_file.c_str(), true,
        new AuthenticatedEncryptionFilter(encryptor,
            new FileSink(out_file.c_str()));

Crypto++wiki上的EAX。它有三到四个AE和AEAD示例。

不,我们不想添加管道,我们只想使用默认通道输入数据。给出的示例是文本输入。我想使用相同的函数输入文件。你能详细说明一下吗?谢谢,你的答案中只有一个错误是我不需要打电话给c_str()函数in_file和out_file都有char*数据类型。其他一切都很好。再次感谢。不,我们不想添加管道,我们只想使用默认的_通道输入数据。给出的示例是文本输入。我想使用相同的函数输入文件。你能详细说明一下吗?谢谢,你的ans中只有一个错误答案是我不需要调用c_str()函数,因为in_文件和out_文件都有char*数据类型。其他一切都很好。再次感谢。