2017-11-04 10 views
1

私は自分のCryptoライブラリをC++で書こうとしていますが、私は物事の面倒を見ています。暗号化ライブラリの構成方法

私はライブラリを使用している人にとって使いやすいと同時に、最適なモジュール性と再利用性を実現するように自分のライブラリを構造化しようとしています。

は、私はすでに(128、192および256)AESを実装していると私は正確にデータの暗号化と復号化することができるよ私は今

(私は、NISTのECBのテストベクトルを使用し、いくつかのユニットテストを書きました)連鎖した問題でAESを働かそうとしています。 (適切なECB、CBC、CFB、OFB、...)

"エンドユーザー"のための使いやすい方法でライブラリを構築する方法を失っていますおそらく他のプロジェクトで私だけ)。

は今のところ、これは私がそれを設定している方法です。

を私は静的メソッドcreateBlockCipherを持ってCipherFactoryクラスを持って、このメソッドは文字列としてブロック暗号の名前を取り込み、BlockCipherオブジェクトを返します。単一ブロックの暗号化と復号化に使用することができます。

私は基本的に実装しているすべてのブロック暗号のスーパークラスであるBlockCipherクラスを持っています(今はちょうどAES、私はおそらくさらにいくつか追加します)。 BlockCipherクラスは、blocksize、keysize、アルゴリズムの名前を取得するためのゲッターを提供します。また、仮想暗号化と復号化の方法では、呼び出されたときにNotImplemented例外がスローされ、誰かがこの偽のスーパークラスで何かを暗号化しようとしないようにします。

次に、私はクラスを継承し、その暗号化と復号化の方法を実装するAESクラスを持っています。

私が探しているのは、UMLクラス図、デザインパターン、またはエレガントな方法で連鎖モードを実装できる一般的なアドバイスです。

私はすでにCrypto ++を見てきましたが、そのドキュメントとコードは私にはかなりわかりにくいようです(皮肉なことです)。

(あなたのそれらのために暗号化部門でその知識豊富ではありませんが、OOADとの良好であること:https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Common_modes

免責事項:私はDIY-暗号は悪い考えであることが最も(すべてではない)を知っています私はそれを真剣に何かを暗号化するつもりはありません、これは単なる個人的なプロジェクトです。

+0

ファクトリを使ってベースのオブジェクトを作成する場合、どのように基本の 'BlockCipher'オブジェクトを保持できますか?あなたはそれらをあきらめることができないのですか? –

+0

あなたは非常に良い点があります。私は方法を "ちょうどその場に"置くと思った。私はまた、もし何らかの形で 'BlockCipher'オブジェクトがデフォルトで構築された場合には、まだそれらをそこに置くことになると考えました。 (基本的に、私は、これらの偽のオブジェクトを使って物事を悪化させないようにしようとしています)また、アルゴリズムの名前を特定するために工場の 'if-else if-else if -...'ステートメントがあります。ステートメントが最後の可能性(通常の 'else')に至ると、私はBlockCipherオブジェクトを返します。代わりに例外をスローする必要がありますか? – shmoo6000

+0

既存の実装の大きな問題は、ドキュメントの不足、特にデフォルトの問題です。合理的に良い例については、[RNCryptor-Spec](https://github.com/RNCryptor/RNCryptor-Spec)を参照してください。バージョン、オプションのパスワードの拡張子、IVの処理と認証に注意してください。ライブラリを既存の実装で使用できるように、パスワードの拡張、IVの処理と認証をオプションにするとよいでしょう。 CBC、ECB、CTRは不可欠ですが、GCMは今後必要ですが、数学を実装するのは簡単ではありません。 – zaph

答えて

1

これは、デコレータデザインパターンのバリエーションのようです。

それぞれのCypherクラスのコンストラクタをconst BlockCipher&のインスタンスを引数として使用して、作成中のインスタンスにチェーンの次のサイファーとして格納することができます。

CipherFactoryは、CreateBlockCypherChain()メソッドを持つことができます。このメソッドは、文字列名の配列を受け取り、それらのサイファーから構築されたチェーンを返します。

関連する問題