gpt4 book ai didi

c++ - QStrings 上的 AES 加密,libcrypto++

转载 作者:太空狗 更新时间:2023-10-29 23:14:15 28 4
gpt4 key购买 nike

我有以下一段代码可以加密和解密消息。

QString AesUtils::encrypt(QString message, QString aesKey)
{
string plain = message.toStdString();
qDebug() << "Encrypt" << plain.data() << " " << plain.size();
string ciphertext;
// Hex decode symmetric key:
HexDecoder decoder;
string stdAesKey = aesKey.toStdString();
decoder.Put((byte*)stdAesKey.data(), aesKey.size());
decoder.MessageEnd();
word64 size = decoder.MaxRetrievable();
char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);
// Generate Cipher, Key, and CBC
byte key[ AES::MAX_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
StringSource( reinterpret_cast<const char *>(decodedKey), true,
new HashFilter(*(new SHA256), new ArraySink(key, AES::MAX_KEYLENGTH)) );
memset( iv, 0x00, AES::BLOCKSIZE );
CBC_Mode<AES>::Encryption Encryptor( key, sizeof(key), iv );
StringSource( plain, true, new StreamTransformationFilter( Encryptor,
new HexEncoder(new StringSink( ciphertext )) ) );
return QString::fromStdString(ciphertext);
}

QString AesUtils::decrypt(QString message, QString aesKey)
{
string plain;
string encrypted = message.toStdString();

// Hex decode symmetric key:
HexDecoder decoder;
string stdAesKey = aesKey.toStdString();
decoder.Put( (byte *)stdAesKey.data(), aesKey.size() );
decoder.MessageEnd();
word64 size = decoder.MaxRetrievable();
char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);
// Generate Cipher, Key, and CBC
byte key[ AES::MAX_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
StringSource( reinterpret_cast<const char *>(decodedKey), true,
new HashFilter(*(new SHA256), new ArraySink(key, AES::MAX_KEYLENGTH)) );
memset( iv, 0x00, AES::BLOCKSIZE );
try {
CBC_Mode<AES>::Decryption Decryptor
( key, sizeof(key), iv );
StringSource( encrypted, true,
new HexDecoder(new StreamTransformationFilter( Decryptor,
new StringSink( plain )) ) );
}
catch (Exception &e) { // ...
qDebug() << "Exception while decrypting " << e.GetWhat().data();
}
catch (...) { // ...
}
qDebug() << "decrypt" << plain.data() << " " << AES::BLOCKSIZE;
return QString::fromStdString(plain);
}

问题是我随机得到:

StreamTransformationFilter: invalid PKCS #7 block padding found

解密内容时。加密应该完全支持QString,因为它可能包含一些 Unicode 数据。但即使是最基本的,它也不起作用,仅包含 [A-z][a-z][0-9]

的字符串

aesKey 大小为 256。

根据 Stack Overflow 上的一些答案,有人建议使用 HexDecoder/HexEncoder,但它并没有解决我的问题。

最佳答案

我的代码的第一个问题是我在 aesKey QString 中输入普通字符串。

因此,您需要提供一个十六进制格式的 key ,而不是“1231fsdf$5r4”:[0-9][A-F]

那么问题来了:

char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);

我猜这个字符串是完整的 64 个字节,最后没有 NULL 的空间。改成:

char *decodedKey = new char[size+2];

现在代码可以正常工作了。希望这对将来的人有所帮助。

关于c++ - QStrings 上的 AES 加密,libcrypto++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com