2

モードでメソッドを使用して文字列を暗号化し、およびを使用してパラメーターを定義および文字列化するため、QtでCrypto ++ライブラリを使用しています。AESCBCStringSourceStringSinkinputoutput

まず、ファイルからすべてのバイトを読み取り (「ユニコード」または「ASCII」エンコーディング)、関数のパラメーターとして設定し、input出力(暗号テキスト) の (データ型) としてパラメーターを設定します。文字列を取得して「aes-cbc」で暗号化し、出力を表示したいだけです。StringSourcestring

また、データをファイルに書き込むための2 つの関数 (consistおよびstream パラメータ) も知っFileSourceています。しかし、ファイルの内容を入力文字列として読みたいです。FileSinkinputoutput

私のコード:

void Widget::onEncryptButton()
{
    QByteArray key = "qwertyuiopasdfgh";
    QByteArray iv = "wertyuiopasdfghj"
    QByteArray plain;
    string cipher;

    QFile fi("/home/msi/Desktop/input.txt");
    QFile fo("/home/msi/Desktop/output.enc");

    fi.open(QFile::ReadOnly);
    fo.open(QFile::WriteOnly);
    plain = fi.readAll();

    AESEncryption aese((byte*)key.constData(), AES::DEFAULT_KEYLENGTH);    // default is 16
    CBC_Mode_ExternalCipher::Encryption encryptor(aese, (byte*)iv.constData());
    StringSource(plain, true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));

    QMessageBox::information(this, "", QString("%1, %2").arg(strlen(cipher.c_str())).arg(cipher.size()));    // just for viewing cipher length

    fo.write(cipher.c_str());
    fi.close();
    fo.close();
}

今、私は以下の問題を抱えています:

  • コンパクト ファイルのコンテンツ (例: 900 バイト) を読み取り、それを入力として設定するとStringSource、生成された暗号が不完全になります (例: 320 バイト)

  • 「QMessageBox」での出力strlen(cipher.c_str())が異なりますcipher.size()

  • 私のコードは、いくつかのファイル(「Unicode」または「ASCII」、「大きな」または「小さな」サイズ)を読み取ると、正しく機能しない場合があります。どの理由がこの問題を引き起こしたのかわかりませんか?

  • でも、入力文字列を直接設定して(ファイルから読み取らずに)、再び失敗しました!

よろしく!

4

3 に答える 3

1

plain「\0」が含まれている場合、私はあなたの になる可能性があります。データと長さの両方を渡すようにしてください。

StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));
于 2016-07-18T08:47:42.763 に答える
0

以下のステートメントを置き換えます。

StringSource((byte*)plain.constData(), plain.size(), true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));

ベローで:

StringSource(plain, true, new StreamTransformationFilter(encryptor, new StringSink(cipher)));

その後、プログラムを再構築しましたが、問題は解決しませんでした。

一時的にすべての「\」文字を平文から削除して再度コンパイルすると、出力暗号は "QMessageBox" withcipher.size()ステートメントで正しく表示されました。

その後交換

fo.write(cipher.c_str(), cipher.size());

と :

fo.write(cipher.c_str());

暗号化と復号化のセクションについては、これらの手順を実行します。

于 2016-07-18T11:15:57.197 に答える