12,925
回編集
(→OFBモード) |
|||
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++ == |