我想制作加密(后来解密)用户输入字符串的程序。 这是加密的开始:
QString getData = ui->text->toPlainText(); //Data to process
std::string output; //Result will be Base32 encoded string, so std::string is fine.
现在,我必须将QString
转换为char*
或std::string
,以便可以使用Crypto ++接受它。我认为QByteArray
会很好,因为它有.data()
函数,返回char *
。 (getData
总是长达17个字节或更长:CryptoPP至少需要17个字节才能进行AES加密。
所以,我使用了以下代码:
QByteArray data;
data.append(getData);
//Creating key and iv:
//Creating AES encryptor:
//Encrypting AES and Base32:
CryptoPP::StringSource ss((const byte*)data.data(), data.size() , true,
new CryptoPP::StreamTransformationFilter( Encryptor,
new CryptoPP::Base32Encoder(
new CryptoPP::StringSink(output)
) // Base32Encoder
) // StreamTransformationFilter
); // StringSource
ui->text->clear();
getData = output.c_str();
ui->text->setText(getData);
一切似乎都很好。但我希望它支持非ASCII字符(我的意思是俄语,立陶宛语等)。解密后,他们会更改为?
。我怎么能解决这个问题?我明白,std::string
并不支持他们。
编辑:这是更新的代码:
加密:
QString getData = ui->text->toPlainText(); //Data to process
std::string output;
QByteArray data = getData.toUtf8();
//Creating key and iv: <..>
//Creating AES encryptor: <..>
//Encrypting AES and Base32:
CryptoPP::StringSource ss((const byte*) data.data(),getData.size()*2, true,
new CryptoPP::StreamTransformationFilter( Encryptor,
new CryptoPP::Base32Encoder(
new CryptoPP::StringSink(output)
) // Base32Encoder
) // StreamTransformationFilter
); // StringSource
ui->text->clear();
getData = output.c_str();
ui->text->setText(getData);
解密:
QString getData = ui->text->toPlainText();
QByteArray data;
data.append(getData);
std::string output;
//Creating key and iv:
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ],
iv[ CryptoPP::AES::BLOCKSIZE ];
//Memsetting them: (randomization needed)
::memset( key, 0x01, CryptoPP::AES::DEFAULT_KEYLENGTH );
::memset( iv, 0x01, CryptoPP::AES::BLOCKSIZE );
//Creating AES decryptor:
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption decryptor( key, sizeof(key), iv );
//Decrypting Base32 and AES
CryptoPP::StringSource ss((const byte*) data.data(), data.size(), true,
new CryptoPP::Base32Decoder(
new CryptoPP::StreamTransformationFilter( Decryptor,
new CryptoPP::StringSink(output)
) // StreamTransformationFilter
) // Base32Encoder
); // StringSource
ui->text->clear();
getData = QString::fromUtf8(output.c_str());
ui->text->setText(getData);
我有错过的任何错误吗?
答案 0 :(得分:1)
我认为从QString转换为QByteArray时会丢失数据。试试这个:
QByteArray data = getData.toUtf8();
...
getData = QString::fromUtf8( output.c_str() );
答案 1 :(得分:0)
请改用reinterpret_cast<byte*>(QString::data())
。不要试图在这里实际进行代码页转换 - AES并不关心。使用ArraySink代替StringSink。
请记住,实际QString :: data()缓冲区的大小是其中包含的字符数的两倍,因为它使用的是UTF-16。