使用Crypto ++解密格式良好的密文时遇到问题

时间:2015-12-08 22:30:05

标签: qt encryption aes crypto++

背景

我一直在努力解密一个看似格式正确的密文大约一天。假设我们有以下十六进制编码的密文,其中包含160个字符,因此有80个字节。

QString c = "1BFAC407AF0D440A2D6176C0B5D125AA96088490299AC18C74623C0EF1BB1372E554FC4150A8066220E943697BE2491D8AE13AA036B298425AC510A8A917D59EBB69708B9040AB3A84C63043EAD4AB07";
QString k = CryptoUtils::hexEncode("abc");
QString p = CryptoUtils::decrypt(c, k);

qDebug() << p;

如果我们使用AES 256,AFAIK,密钥必须长度为32个字节,密码长度为16个字节的倍数,所有这些条件都符合我的代码段。

请注意,我使用SHA256使用密码短语生成32字节密钥。因此,这可确保所有密钥长度为32个字节。

这些函数的

Full source codes可以在我的GitHub上的repo上找到(在分支Part1)。

我的问题

当我想运行此代码时,我的应用程序崩溃了。这是例外:

terminate called after throwing an instance of 'CryptoPP::InvalidCiphertext'
  what():  StreamTransformationFilter: invalid PKCS #7 block padding found
The program has unexpectedly finished.

我搜索了这个问题并发现它可能是因为加密明文后会跟踪\0。但是,我无法解决问题。请帮助我,它只会让我发疯。

2 个答案:

答案 0 :(得分:1)

  

这些功能的完整源代码可以在我的回购GitHub上找到

我至少会做出这些改变:

QString CryptoUtils::encrypt(QString text, QString keyhex)
{
    ...

    // name the variable, kill the memory leak
    SHA256 sha256;
    StringSource ss1(decodedKey, size, true, new HashFilter(sha256, new ArraySink(key, AES::MAX_KEYLENGTH)));
    ...

    // name the variable
    StringSource ss2(plain, true, new StreamTransformationFilter(Encryptor, new HexEncoder(new StringSink(encrypted))));

    // verify embedded NULLs don't affect results
    QString qs = QString::fromStdString(encrypted);
    assert(qs.length() == encrypted.length());
}

QString CryptoUtils::decrypt(QString text, QString keyhex)
{
    // bad karma here...
    string encrypted = text.toStdString();
    assert(encrypted.length() == text.length());
    ...

    // name the variable, kill the memory leak
    SHA256 sha256;
    StringSource ss1(decodedKey, size, true, new HashFilter(sha256, new ArraySink(key, AES::MAX_KEYLENGTH)));
    ...

    // name the variable,
    StringSource ss2(encrypted, true, new HexDecoder(new StreamTransformationFilter(Decryptor, new StringSink(plain))));

    // verify embedded NULLs don't affect results
    QString qs = QString::fromStdString(plain);
    assert(qs.length() == plain.length());
}

答案 1 :(得分:0)

QString CryptoUtils::hexEncode(QString text) { byte *bytearray = (byte *) text.toStdString().data(); int length = text.length(); return hexEncode(bytearray, length); } 函数似乎行为异常:

print("Copying... ", end="")
sys.stdout.flush()
shutil.copytree(src, dest)
print("DONE")

应替换为:

{{1}}