web-dev-qa-db-ja.com

OpenSSLを使用してAES復号化を行う方法

OpenSSLライブラリを使用していくつかのAESデータを復号化したいと思います。コードはキーにアクセスできます。このプロジェクトはすでにlibopensslを他の目的で使用しているので、このライブラリに固執したいと思います。

OpenSSLサイトはドキュメントが少ないので、私は/usr/include/openssl/aes.hを直接調べました。唯一の復号化機能はこれです:

void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);

残念ながら、これにはinポインターの長さを指定する方法がないため、それがどのように機能するかはわかりません。

暗号化と復号化を区別するために数値パラメーターを使用すると私が信じている他のいくつかの関数があります。例えば:

void AES_ecb_encrypt(*in, *out, *key, enc);
void AES_cbc_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_cfb128_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb1_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb8_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfbr_encrypt_block(*in, *out, nbits, *key, *ivec, enc);
void AES_ofb128_encrypt(*in, *out, length, *key, *ivec, *num);
void AES_ctr128_encrypt(*in, *out, length, *key, ivec[], ecount_buf[], *num);
void AES_ige_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_bi_ige_encrypt(*in, *out, length, *key, *key2, *ivec, enc);

Googleを使用して理解していることから、encparmはAES_ENCRYPTまたはAES_DECRYPTに設定され、実行する必要のあるアクションを指定します。

それは私の2つの質問に私をもたらします:

  1. これらの名前はどういう意味ですか? ecb、cbc、cfb128などとは何ですか?どの方法を使用するかを決定するにはどうすればよいですか?
  2. これらのほとんどに必要なunsigned char *ivecパラメーターは何ですか?どこから入手できますか?
15
Stéphane

AESのブロックサイズが固定されているため、サイズは指定されていません キーサイズに基づく; [〜#〜] ecb [〜#〜] モードの実装が見つかりました。これは、直接使用するのには適していません(教育ツールとしての場合を除く)。

ECB、CBC、CFB128などはすべて、一般的に使用されている 動作モード の短縮名です。それらには異なるプロパティがありますが、ECBモードに触れたことがない場合は、大丈夫です。

低レベルのコードから離れることをお勧めします。使用 - EVP_* 可能であれば、代わりにインターフェースを使用し、これらの決定の一部をテキスト構成ファイルに移動できるため、ユーザーは、必要に応じて、さまざまな暗号、ブロックサイズ、および操作モードから簡単に選択できます。デフォルトから変更する正当な理由。

私の同情、OpenSSLのドキュメントはそれよりも悪く感じます、そしてそれはそれほど素晴らしいものではありません。 OpenSSLを使用したネットワークセキュリティ 便利な本が見つかるかもしれません。前回OpenSSLを使用する必要があったときに、もっと早く見つけられたらよかったのにと思います。 (ばかげたタイトルに騙されないでください-それshouldは単に「OpenSSL」というタイトルになっています。まあ。)

編集初期化ベクトル について言及するのを忘れました。これらは、同じキーを使用して同じデータを暗号化した場合に、暗号文が同一にならないようにするために使用されます。データを復号化するにはIVが必要ですが、IVを秘密にしておく必要はありません。セッションごとにランダムに生成するか(RSA、El Gamal、またはDHで暗号化されたセッションキーと一緒に送信する)、両方のエンドポイントで同じように生成するか、ファイルとともにローカルに保存する必要があります。

18
sarnold