首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QString/QChar转换为Crypto++接受

将QString/QChar转换为Crypto++接受
EN

Stack Overflow用户
提问于 2010-08-03 15:54:03
回答 2查看 4K关注 0票数 2

我想让程序加密(后来解密)用户输入字符串。以下是加密的开始:

代码语言:javascript
复制
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个字节才能加密)。因此,我使用了以下代码:

代码语言:javascript
复制
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不支持他们。

编辑:下面是更新的代码:

加密:

代码语言:javascript
复制
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);

和解密:

代码语言:javascript
复制
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);

它有我错过的虫子吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-03 16:31:05

我认为您在从QString转换到QByteArray时丢失了数据。试试这个:

代码语言:javascript
复制
QByteArray data = getData.toUtf8();

...

getData = QString::fromUtf8( output.c_str() );
票数 1
EN

Stack Overflow用户

发布于 2010-08-03 16:23:52

使用reinterpret_cast<byte*>(QString::data())代替。不要试图在这里实际进行代码页转换-- AES并不在乎。使用ArraySink而不是StringSink。

请记住,实际QString::data()缓冲区的大小是其中包含的字符数的两倍,因为它使用的是UTF-16。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3398304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档