我正在尝试制作一个使用crypto ++库对文件(.jpg和.avi)进行加密的程序。我的目标是制作一个使用AES-256成功加密视频文件的程序。

我从here进行了AES加密的文本示例,并成功运行了(意味着该库已正确设置)。但是,以下简单代码会产生异常

HashVerificationFilter: message hash or MAC not valid

码:
AutoSeededRandomPool prng;

SecByteBlock key(AES::DEFAULT_KEYLENGTH);
prng.GenerateBlock(key, key.size());

SecByteBlock iv(AES::BLOCKSIZE);
prng.GenerateBlock(iv, iv.size());

string ofilename = "testimage.png";
string efilename;
string rfilename = "testimagerecovered.png";

try
{

    GCM< AES >::Encryption e;
    e.SetKeyWithIV(key, key.size(), iv, iv.size());

    ifstream ofile(ofilename.c_str(), ios::binary);
    ofile.seekg(0, ios_base::beg);

    FileSource fs1(ofilename.c_str(), true,
            new AuthenticatedEncryptionFilter(e,
                    new StringSink(efilename)));

    GCM< AES >::Decryption d2;
    d2.SetKeyWithIV(key, key.size(), iv, sizeof(iv));

    StringSource fs2(efilename, true,
            new AuthenticatedDecryptionFilter( d2,
                    new FileSink (rfilename.c_str()),
                    AuthenticatedDecryptionFilter::THROW_EXCEPTION));
}
catch(const Exception &e)
{
    cerr << e.what() << endl;
    exit(1);
}

return 0;

我怀疑我没有正确实现AES算法。但是,最近两天我找不到解决方案。我在Ubuntu 14.04上使用Eclipse Luna。

PS我经历了以下答案

How to read an image to a string for encrypting Crypto++

How to loop over Blowfish Crypto++

最佳答案

尝试设置iv.size()时,请使用sizeof(iv)而不是d2.SetKeyWithIV,就像对e.SetKeyWithIV所做的操作一样。
因为在此程序中,iv.size()的值为16,但是sizeof(iv)的值为24。因此它将起作用。

GCM< AES >::Decryption d2;
d2.SetKeyWithIV(key, key.size(), iv, iv.size()); //here was a misuse of sizeof(iv)

StringSource fs2(efilename, true,
        new AuthenticatedDecryptionFilter( d2,
                new FileSink (rfilename.c_str()),
                AuthenticatedDecryptionFilter::THROW_EXCEPTION));

通过我的测试的代码如上所述。

关于c++ - 解密后出现“消息哈希或MAC无效”异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30936448/

10-15 21:52