「Qtの応用 - AES」の版間の差分

ナビゲーションに移動 検索に移動
82行目: 82行目:


== 例: CBCモード ==
== 例: CBCモード ==
以下の例では、<code>QCrypto</code>クラスを使用して、CBCモードでの暗号化と復号を行っている。<br>
<br>
* キー管理
*: setKeyメソッドでパスワードからキーを生成する。
*: キーが設定されていない場合は、暗号化・復号操作は失敗する。
*: <br>
*: ただし、以下の例ではパスワードからキーを生成しているが、実務では、より安全なキー管理方法を使用すべきである。
* IV (初期化ベクトル) の自動生成
*: 暗号化時において、自動的に新しいランダムなIV (初期化ベクトル) を生成して、IV (初期化ベクトル) を暗号文の先頭に付加して送信する。
*: 復号時において、暗号文からIV (初期化ベクトル) を自動的に取り出して使用する。
* パディング
*: PKCS7パディングを使用しており、復号時にパディングの妥当性を確認する。
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // AES.hファイル
  // AES.hファイル
95行目: 110行目:
     Q_OBJECT
     Q_OBJECT
   
   
  private:
  private: // Variables
     QByteArray m_key;
     QByteArray m_key;
     QString    m_lastError;
     QString    m_lastError;
   
   
private:  // Methods
     QByteArray generateKey(const QString &password);
     QByteArray generateKey(const QString &password);
     QByteArray generateIV();
     QByteArray generateIV();
104行目: 120行目:
     QByteArray unpadData(const QByteArray &data);
     QByteArray unpadData(const QByteArray &data);
   
   
  public:
  public: // Methods
     explicit  AES(QObject *parent = nullptr);
     explicit  AES(QObject *parent = nullptr);
     ~AES();
     ~AES();
284行目: 300行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
#include <QCoreApplication>
#include <QDebug>
#include "AES.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    AES aes;
    // 暗号化 (AES CBC)
    if (!aes.setKey("<任意の暗号化パスワード>")) {
      qDebug() << "Failed to set key:" << aes.lastError();
      return;
    }
    QByteArray plaintext = "Hello, World! This is a secret message.";
    QByteArray ciphertext = aes.encrypt(plaintext);
    if (ciphertext.isEmpty()) {
      qDebug() << "暗号化に失敗: " << aes.lastError();
      return;
    }
    // 復号 (AES CBC)
    QByteArray decrypted = aes.decrypt(ciphertext);
    if (decrypted.isEmpty()) {
      qDebug() << "復号に失敗: " << aes.lastError();
      return;
    }
    qDebug() << "復号したデータ: " << QString::fromUtf8(decrypted);
    return a.exec();
}
</syntaxhighlight>
<br>
<u>※注意</u><br>
* 暗号化時は、IV (初期化ベクトル) を自動生成して、暗号文の先頭に追加している。
* 復号時は、暗号文の先頭からIV (初期化ベクトル) を取り出して使用する。
* パスワードからキーを生成しているが、実務ではより安全なキー管理方法を使用すべきである。
* エラーハンドリングにおいて、入出力の検証を追加することを推奨する。
<br><br>


== Crypto++ ==
== Crypto++ ==

案内メニュー