簡體   English   中英

轉換QString / QChar以被Crypto ++接受

[英]Converting QString/QChar to be accepted with Crypto++

我想制作對用戶輸入的字符串進行加密(以后解密)的程序。 這是加密的開始:

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);

有沒有我錯過的錯誤?

我認為從QString轉換為QByteArray時,您正在丟失數據。 嘗試這個:

QByteArray data = getData.toUtf8();

...

getData = QString::fromUtf8( output.c_str() );

請改用reinterpret_cast<byte*>(QString::data()) 不要在這里嘗試實際執行代碼頁轉換-AES不在乎。 使用ArraySink而不是StringSink。

請記住,實際的QString :: data()緩沖區的大小是其中包含的字符數的兩倍,因為它使用UTF-16。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM