2

ユーザーが入力した文字列を暗号化(後で復号化)するプログラムを作りたいです。これが暗号化の始まりです:

QString getData = ui->text->toPlainText(); //Data to process
std::string output; //Result will be Base32 encoded string, so std::string is fine.

今、Crypto++で受け入れられるように変換QStringするchar*必要があります。を返す機能があるので、それでいいstd::stringと思いました。(常に 17 バイト以上の長さ: CryptoPP では、AES 暗号化に少なくとも 17 バイトが必要です)。したがって、次のコードを使用しました。QByteArray.data()char *getData

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

私が見逃したバグはありますか?

4

2 に答える 2

1

QStringからQByteArrayに変換すると、データが失われると思います。これを試して:

QByteArray data = getData.toUtf8();

...

getData = QString::fromUtf8( output.c_str() );
于 2010-08-03T16:31:05.423 に答える
0

reinterpret_cast<byte*>(QString::data())代わりに使用してください。ここで実際にコード ページの変換を試みないでください。AES は気にしません。StringSinkの代わりにArraySink を使用します。

UTF-16 を使用するため、実際の QString::data() バッファーのサイズはそこに含まれる文字数の 2 倍になることに注意してください。

于 2010-08-03T16:23:52.970 に答える