Преобразование QString / QChar для принятия с Crypto ++ - PullRequest
2 голосов
/ 03 августа 2010

Я хочу создать программу, которая шифрует (позже расшифровывает) введенную пользователем строку. Здесь начинается шифрование:

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 или более байтов: для шифрования AES CryptoPP требуется как минимум 17 байтов). Итак, я использовал следующий код:

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

Есть ли ошибки, которые я пропустил?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

Я думаю, вы теряете данные при конвертации из QString в QByteArray.Попробуйте это:

QByteArray data = getData.toUtf8();

...

getData = QString::fromUtf8( output.c_str() );
0 голосов
/ 03 августа 2010

Используйте reinterpret_cast<byte*>(QString::data()) вместо. Не пытайтесь делать преобразование кодовой страницы здесь - AES не волнует. Используйте ArraySink вместо StringSink.

Имейте в виду, что размер фактического буфера QString :: data () в два раза превышает количество содержащихся в нем символов, поскольку он использует UTF-16.

...