Qt 无法使用Crypto+解密格式良好的密码文本+; 背景

Qt 无法使用Crypto+解密格式良好的密码文本+; 背景,qt,encryption,aes,crypto++,Qt,Encryption,Aes,Crypto++,一天来,我一直在努力解密一个显然格式良好的密码文本。假设我们得到了以下十六进制编码的密码文本,它正好包含160个字符,因此有80个字节 QString c = "1BFAC407AF0D440A2D6176C0B5D125AA96088490299AC18C74623C0EF1BB1372E554FC4150A8066220E943697BE2491D8AE13AA036B298425AC510A8A917D59EBB69708B9040AB3A84C63043EAD4AB07"; QStrin

一天来,我一直在努力解密一个显然格式良好的密码文本。假设我们得到了以下十六进制编码的密码文本,它正好包含160个字符,因此有80个字节

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

qDebug() << p;
我四处搜索了一下这个问题,发现可能是因为对纯文本进行加密后出现了拖尾
\0
。然而,我不能仅仅解决这个问题。请帮帮我,这简直快把我逼疯了

这些函数的完整源代码可以在GitHub上的my repo上找到

我至少会做出以下改变:

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());
}
以及:


hexEncode
功能似乎有问题:

QString CryptoUtils::hexEncode(QString text)
{
    byte *bytearray = (byte *) text.toLatin1().data();
    int length = text.toLatin1().length();

    return hexEncode(bytearray, length);
}
应替换为:

QString CryptoUtils::hexEncode(QString text)
{
    byte *bytearray = (byte *) text.toStdString().data();
    int length = text.length();

    return hexEncode(bytearray, length);
}

你是怎么得到密文的?使用相同的方法?PKCS#7填充错误是唯一可能生成的错误(除了与块大小相关的错误外),它们显示错误的代码、错误的密钥或错误的数据(对于CBC模式下的小密文,甚至是错误的IV)。
StringSource(decodedKey,size,true,new HashFilter(*new SHA256),new ArraySink(key,AES::MAX_keydlength)):这不是一个好的KBKDF,它隐藏了密钥的问题,在我看来,它相当不可读。如果您使用的不是您指向的库,那么解密肯定会失败(当然,除非在另一个库中应用了相同的非标准哈希)。@MaartenBodewes我从
encrypt
函数(从我链接到的cpp文件)生成了该密文。此外,IV始终为
0
。对于密钥,我看不出SHA256有什么问题(我只需要从一个密码短语生成一个统一的密钥,对于它,我应该使用哪个算法并不重要)。谢谢您的回答。但是问题是因为我的
hexEncode
函数。它为一个相同的输入生成了不同的十六进制代码。@Frogato-“它为一个相同的输入生成了不同的十六进制代码”-这是一种病态的方式。。。使用UTF-8;它最适合于互操作性。或者,使用原始字节和类似于a的东西来提取和扩展熵。
QString CryptoUtils::hexEncode(QString text)
{
    byte *bytearray = (byte *) text.toLatin1().data();
    int length = text.toLatin1().length();

    return hexEncode(bytearray, length);
}
QString CryptoUtils::hexEncode(QString text)
{
    byte *bytearray = (byte *) text.toStdString().data();
    int length = text.length();

    return hexEncode(bytearray, length);
}