我一直在努力解密一个看似格式正确的密文大约一天。假设我们有以下十六进制编码的密文,其中包含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
。但是,我无法解决问题。请帮助我,它只会让我发疯。
答案 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}}