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を使用して理解していることから、enc
parmはAES_ENCRYPT
またはAES_DECRYPT
に設定され、実行する必要のあるアクションを指定します。
それは私の2つの質問に私をもたらします:
unsigned char *ivec
パラメーターは何ですか?どこから入手できますか?AESのブロックサイズが固定されているため、サイズは指定されていません キーサイズに基づく; [〜#〜] ecb [〜#〜] モードの実装が見つかりました。これは、直接使用するのには適していません(教育ツールとしての場合を除く)。
ECB、CBC、CFB128などはすべて、一般的に使用されている 動作モード の短縮名です。それらには異なるプロパティがありますが、ECBモードに触れたことがない場合は、大丈夫です。
低レベルのコードから離れることをお勧めします。使用 - EVP_*
可能であれば、代わりにインターフェースを使用し、これらの決定の一部をテキスト構成ファイルに移動できるため、ユーザーは、必要に応じて、さまざまな暗号、ブロックサイズ、および操作モードから簡単に選択できます。デフォルトから変更する正当な理由。
私の同情、OpenSSLのドキュメントはそれよりも悪く感じます、そしてそれはそれほど素晴らしいものではありません。 OpenSSLを使用したネットワークセキュリティ 便利な本が見つかるかもしれません。前回OpenSSLを使用する必要があったときに、もっと早く見つけられたらよかったのにと思います。 (ばかげたタイトルに騙されないでください-それshouldは単に「OpenSSL」というタイトルになっています。まあ。)
編集初期化ベクトル について言及するのを忘れました。これらは、同じキーを使用して同じデータを暗号化した場合に、暗号文が同一にならないようにするために使用されます。データを復号化するにはIVが必要ですが、IVを秘密にしておく必要はありません。セッションごとにランダムに生成するか(RSA、El Gamal、またはDHで暗号化されたセッションキーと一緒に送信する)、両方のエンドポイントで同じように生成するか、ファイルとともにローカルに保存する必要があります。